diff options
| -rw-r--r-- | apt-pkg/solver3.cc | 6 | ||||
| -rw-r--r-- | apt-pkg/solver3.h | 5 | ||||
| -rwxr-xr-x | test/integration/test-bug-591882-conkeror | 5 | ||||
| -rwxr-xr-x | test/integration/test-solver3-suggests-last | 26 |
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 + |
