summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2025-03-20 21:44:05 +0000
committerJulian Andres Klode <jak@debian.org>2025-03-20 21:44:05 +0000
commitfbb202b34df162eb19e9035683800e704cd17e6a (patch)
tree4601ec604e90b2513d8b80278861fee29c76f0a5
parentfff3dddedba0d19d722cb4889bab355182cc2522 (diff)
parent81804cefd8c24c98e7a0216a9d4277516e19b6e2 (diff)
Merge branch 'solver3' into 'main'
solver3: Handle previously satisfied Suggests last See merge request apt-team/apt!467
-rw-r--r--apt-pkg/solver3.cc6
-rw-r--r--apt-pkg/solver3.h5
-rwxr-xr-xtest/integration/test-bug-591882-conkeror5
-rwxr-xr-xtest/integration/test-solver3-suggests-last26
4 files changed, 41 insertions, 1 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc
index 4d988b523..620156ac3 100644
--- a/apt-pkg/solver3.cc
+++ b/apt-pkg/solver3.cc
@@ -861,6 +861,12 @@ APT::Solver::Clause APT::Solver::TranslateOrGroup(pkgCache::DepIterator start, p
{
if (unlikely(debug >= 3))
std::cerr << "Try to keep satisfied: " << clause.toString(cache, true) << std::endl;
+ clause.group = Group::SatisfySuggests;
+ // Erase the non-installed solutions. We will process this last and try to keep the previously installed
+ // "best" solution installed.
+ clause.solutions.erase(std::remove_if(clause.solutions.begin(), clause.solutions.end(), [this](auto var)
+ { return var.CastPkg(cache)->CurrentVer == nullptr; }),
+ clause.solutions.end());
}
else if (not important)
{
diff --git a/apt-pkg/solver3.h b/apt-pkg/solver3.h
index c2d6e035e..6810df426 100644
--- a/apt-pkg/solver3.h
+++ b/apt-pkg/solver3.h
@@ -122,7 +122,10 @@ class Solver
// allowing a simple implementation of an autoremoval code.
UpgradeAuto,
KeepAuto,
- ObsoleteAuto
+ ObsoleteAuto,
+
+ // Satisfy optional dependencies that were previously satisfied but won't otherwise be installed
+ SatisfySuggests,
};
// \brief Type to record depth at. This may very well be a 16-bit
diff --git a/test/integration/test-bug-591882-conkeror b/test/integration/test-bug-591882-conkeror
index 21c569756..6d4712a25 100755
--- a/test/integration/test-bug-591882-conkeror
+++ b/test/integration/test-bug-591882-conkeror
@@ -10,6 +10,7 @@ setupaptarchive
UPGRADEFAIL="Reading package lists...
Building dependency tree...
+Reading state information...
Calculating upgrade...
The following packages will be REMOVED:
conkeror libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9
@@ -42,6 +43,7 @@ E: Trivial Only specified but this is not a trivial operation."
UPGRADESUCCESS="Reading package lists...
Building dependency tree...
+Reading state information...
Calculating upgrade...
The following packages will be REMOVED:
libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9
@@ -73,6 +75,9 @@ Need to get 0 B/62.9 MB of archives.
After this operation, 36.0 MB of additional disk space will be used.
E: Trivial Only specified but this is not a trivial operation."
+# solver3 otherwise chooses to keep back xulrunner-1.9 rather than replace it with xulrunner-1.9.1,,
+# and keep back reverse dependencies of xulrunner-1.9 which seems correct.
+testsuccess aptmark auto xulrunner-1.9
# Test that the old behavior can be restored with the option
testfailureequal "$UPGRADEFAIL" aptget dist-upgrade --trivial-only -o pkgProblemResolver::FixByInstall=0 --solver internal
testfailureequal "$UPGRADESUCCESS" aptget dist-upgrade --trivial-only #-o pkgProblemResolver::FixByInstall=0
diff --git a/test/integration/test-solver3-suggests-last b/test/integration/test-solver3-suggests-last
new file mode 100755
index 000000000..9a280eed8
--- /dev/null
+++ b/test/integration/test-solver3-suggests-last
@@ -0,0 +1,26 @@
+#!/bin/sh
+set -e
+
+TESTDIR="$(readlink -f "$(dirname "$0")")"
+. "$TESTDIR/framework"
+setupenvironment
+configarchitecture 'amd64'
+
+insertpackage 'installed' 'avahi-daemon' 'all' '1' 'Suggests: avahi-autoipd'
+insertpackage 'installed' 'dhcpd-base' 'all' '1' 'Provides: avahi-autoipd'
+insertpackage 'unstable' 'avahi-autoipd' 'all' 2
+insertpackage 'unstable' 'dhcpd-base' 'all' '2'
+
+setupaptarchive
+
+for command in "aptget upgrade" "aptget dist-upgrade" "apt upgrade" "apt dist-upgrade"; do
+testsuccessequal "Reading package lists...
+Building dependency tree...
+Calculating upgrade...
+The following packages will be upgraded:
+ dhcpd-base
+1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Inst dhcpd-base [1] (2 unstable [all])
+Conf dhcpd-base (2 unstable [all])" $command -s -q
+done
+