diff options
| author | Julian Andres Klode <jak@debian.org> | 2025-04-04 13:57:43 +0000 |
|---|---|---|
| committer | Julian Andres Klode <jak@debian.org> | 2025-04-04 13:57:43 +0000 |
| commit | 9b4bb8a4aef8fa9e668ca301f44bf6ecd0bd3488 (patch) | |
| tree | 61a0d5a9aa559f6acb18712c040ee473c36c9fa3 /apt-private/private-install.cc | |
| parent | b279e8b3df2c8620bb3a0f2deb8325a85f4a9a3b (diff) | |
| parent | 295ab44a3063fb7790d8a558a161fc1bd801f998 (diff) | |
Merge branch 'solver3' into 'main'
solver3: Consider more upgrades more costly when not upgrading
See merge request apt-team/apt!472
Diffstat (limited to 'apt-private/private-install.cc')
| -rw-r--r-- | apt-private/private-install.cc | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc index 7103c6dc7..7c9a27290 100644 --- a/apt-private/private-install.cc +++ b/apt-private/private-install.cc @@ -983,6 +983,7 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<PseudoPkg // Fallback to 3.0 if we don't get a result or apport is installed if (not invalidCombinations && _config->Find("APT::Solver", "internal") == "internal" && (not res || (not Cache->FindPkg("apport").end() && Cache->FindPkg("apport")->CurrentVer))) { + bool isUpgrade = distUpgradeMode || UpgradeMode != APT::Upgrade::ALLOW_EVERYTHING; auto internalBroken = Cache->BrokenCount(); auto internalDel = Cache->DelCount(); auto internalInst = Cache->InstCount(); @@ -1006,6 +1007,11 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<PseudoPkg errors.push_back(str); _config->Set("APT::Solver", "internal"); _error->RevertToStack(); + + // Cost factors to compare two solutions + auto solver3Cost = std::make_tuple(Cache->DelCount(), isUpgrade ? -Cache->UpgradeCount() : 0, Cache->InstCount() - Cache->UpgradeCount(), Cache->UpgradeCount()); + auto internalCost = std::make_tuple(internalDel, isUpgrade ? -internalUpgrade : 0, internalInst - internalUpgrade, internalUpgrade); + // An error summary for apport. std::string error; if (solver3Res && Cache->BrokenCount()) @@ -1027,7 +1033,7 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<PseudoPkg solver3.commit(); res = true; } - else if (std::make_tuple(Cache->DelCount(), -Cache->UpgradeCount(), Cache->KeepCount(), Cache->InstCount()) > std::make_tuple(internalDel, -internalUpgrade, internalKeep, internalInst)) + else if (solver3Cost > internalCost) { error = "Failure: The 3.0 solver produced a worse result"; } |
