diff options
Diffstat (limited to 'apt-pkg')
| -rw-r--r-- | apt-pkg/solver3.cc | 19 | ||||
| -rw-r--r-- | apt-pkg/solver3.h | 1 |
2 files changed, 20 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) diff --git a/apt-pkg/solver3.h b/apt-pkg/solver3.h index 380aa3ad6..9af580b86 100644 --- a/apt-pkg/solver3.h +++ b/apt-pkg/solver3.h @@ -445,6 +445,7 @@ class DependencySolver final : public Solver bool DeferVersionSelection{_config->FindB("APT::Solver::Defer-Version-Selection", true)}; bool KeepRecommends{_config->FindB("APT::AutoRemove::RecommendsImportant", true)}; bool KeepSuggests{_config->FindB("APT::AutoRemove::SuggestsImportant", true)}; + bool UpgradeBySourcePackage{_config->FindB("APT::Get::Upgrade-By-Source-Package", true)}; // Helper functions for detecting obsolete packages mutable FastContiguousCacheMap<pkgCache::Package, LiftedBool> pkgObsolete; |
