summaryrefslogtreecommitdiff
path: root/apt-private/private-install.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2025-04-04 13:57:43 +0000
committerJulian Andres Klode <jak@debian.org>2025-04-04 13:57:43 +0000
commit9b4bb8a4aef8fa9e668ca301f44bf6ecd0bd3488 (patch)
tree61a0d5a9aa559f6acb18712c040ee473c36c9fa3 /apt-private/private-install.cc
parentb279e8b3df2c8620bb3a0f2deb8325a85f4a9a3b (diff)
parent295ab44a3063fb7790d8a558a161fc1bd801f998 (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.cc8
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";
}