summaryrefslogtreecommitdiff
path: root/apt-pkg/solver3.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2026-02-17 09:58:46 +0000
committerJulian Andres Klode <jak@debian.org>2026-02-17 09:58:46 +0000
commitf6adace8d302fb72ab92646cbd49f9560fa1ad6a (patch)
tree9b82dec92f02559b91a2cf307044ecedcde4ab34 /apt-pkg/solver3.cc
parent1275e2e0ec45e9cdbfeedfa2c069274d80499fa8 (diff)
parent9f3ecca2b32e4fe56a05811392e01416092f85fa (diff)
Merge branch 'solver3-upgrade-by-source' into 'main'
solver3: Upgrade by source package See merge request apt-team/apt!553
Diffstat (limited to 'apt-pkg/solver3.cc')
-rw-r--r--apt-pkg/solver3.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc
index 6d818ed67..bfc187ea6 100644
--- a/apt-pkg/solver3.cc
+++ b/apt-pkg/solver3.cc
@@ -972,6 +972,25 @@ void DependencySolver::Discover(Var var)
RegisterClause(std::move(clause));
}
+ if (UpgradeBySourcePackage && Ver != Ver.ParentPkg().CurrentVer())
+ {
+ // For this version selection, if I have other binaries in the source package that are currently installed,
+ // mark them for upgrade using an eager optional dependency (which is executed soon, but can be skipped)
+ for (auto sibling = Ver.SourceVersion().Group().VersionsInSource(); not sibling.end(); sibling = sibling.NextInSource())
+ {
+ // Package is the same; not installed or at right version, don't need to upgrade
+ if (sibling->ParentPkg == Ver->ParentPkg || not sibling.ParentPkg()->CurrentVer || sibling.ParentPkg().CurrentVer() == sibling)
+ continue;
+ // Package has a different source version than us, so it's not relevant
+ if (strcmp(sibling.SourceVersion().VerStr(), Ver.SourceVersion().VerStr()) != 0)
+ continue;
+ Clause clause{Var(Ver), Group::SelectVersion, true /* optional */};
+ clause.eager = true;
+ clause.solutions = {Var(sibling)};
+ RegisterClause(std::move(clause));
+ }
+ }
+
for (auto dep = Ver.DependsList(); not dep.end();)
{
// Compute a single dependency element (glob or)