summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2025-03-20 21:15:14 +0100
committerJulian Andres Klode <julian.klode@canonical.com>2025-03-20 22:22:17 +0100
commit81804cefd8c24c98e7a0216a9d4277516e19b6e2 (patch)
tree4601ec604e90b2513d8b80278861fee29c76f0a5
parent83bad834c63604035c251f24ee9ea99dac1a1369 (diff)
solver3: Do not install new packages for Suggests
As a followup to the previous commit, restore the exact behavior of the old solver to break the Suggests on upgrade here by erasing any choices not previously installed. This ensures that the Suggests never installs any new package, but it will still retain previously installed packages when solver3 is doing autoremove.
-rw-r--r--apt-pkg/solver3.cc5
-rwxr-xr-xtest/integration/test-solver3-suggests-last28
2 files changed, 6 insertions, 27 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc
index 66e307133..620156ac3 100644
--- a/apt-pkg/solver3.cc
+++ b/apt-pkg/solver3.cc
@@ -862,6 +862,11 @@ 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/test/integration/test-solver3-suggests-last b/test/integration/test-solver3-suggests-last
index 1533007b7..9a280eed8 100755
--- a/test/integration/test-solver3-suggests-last
+++ b/test/integration/test-solver3-suggests-last
@@ -13,32 +13,6 @@ insertpackage 'unstable' 'dhcpd-base' 'all' '2'
setupaptarchive
-# It seems surprising this does not install avahi-autoipd
-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])" aptget upgrade -s -q --solver 3.0
-
-# Or is it surprising that this does?
-for command in "aptget dist-upgrade" "apt upgrade" "apt dist-upgrade"; do
-testsuccessequal "Reading package lists...
-Building dependency tree...
-Calculating upgrade...
-The following NEW packages will be installed:
- avahi-autoipd
-The following packages will be upgraded:
- dhcpd-base
-1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst avahi-autoipd (2 unstable [all])
-Inst dhcpd-base [1] (2 unstable [all])
-Conf avahi-autoipd (2 unstable [all])
-Conf dhcpd-base (2 unstable [all])" $command -s -q --solver 3.0
-done
-
for command in "aptget upgrade" "aptget dist-upgrade" "apt upgrade" "apt dist-upgrade"; do
testsuccessequal "Reading package lists...
Building dependency tree...
@@ -47,6 +21,6 @@ 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 --solver internal -q
+Conf dhcpd-base (2 unstable [all])" $command -s -q
done