diff options
author | Jacob Kauffmann <jacob@system76.com> | 2023-05-02 11:59:45 +0000 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2023-05-02 11:59:45 +0000 |
commit | 5f9552801139e6ea8d84db20692561b79cda6d00 (patch) | |
tree | 309335c57752e3b37c69751ae9e3f57eb4f2baf5 | |
parent | aa8c9aad81b57da96e8ac7345d0024ee526c7714 (diff) |
Keep "or group" when installing package to satisfy it
-rw-r--r-- | apt-pkg/algorithms.cc | 5 | ||||
-rwxr-xr-x | test/integration/test-or-group-substitution | 45 |
2 files changed, 49 insertions, 1 deletions
diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index 26d8c71c2..272917b08 100644 --- a/apt-pkg/algorithms.cc +++ b/apt-pkg/algorithms.cc @@ -1056,9 +1056,12 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) clog << " Try Installing " << APT::PrettyPkg(&Cache, Start.TargetPkg()) << " before changing " << I.FullName(false) << std::endl; auto const OldBroken = Cache.BrokenCount(); Cache.MarkInstall(Start.TargetPkg(), true, 1, false); + OrOp = OrKeep; // FIXME: we should undo the complete MarkInstall process here - if (Cache[Start.TargetPkg()].InstBroken() == true || Cache.BrokenCount() > OldBroken) + if (Cache[Start.TargetPkg()].InstBroken() == true || Cache.BrokenCount() > OldBroken) { Cache.MarkDelete(Start.TargetPkg(), false, 1, false); + OrOp = OrRemove; + } } } } diff --git a/test/integration/test-or-group-substitution b/test/integration/test-or-group-substitution new file mode 100755 index 000000000..51bd9aa3f --- /dev/null +++ b/test/integration/test-or-group-substitution @@ -0,0 +1,45 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'amd64' + +# One package (non-essential) depends on either of two other packages, which conflict with each other. + +insertinstalledpackage 'chrony' 'amd64' '1' 'Conflicts: openntpd' + +insertpackage 'sid' 'openntpd' 'amd64' '1' 'Conflicts: openntpd' + +insertinstalledpackage 'systemd' 'amd64' '1' 'Depends: chrony | openntpd' + +# An essential package depends on the non-essential package that has an or group dependency. + +insertinstalledpackage 'pop-desktop' 'amd64' '1' 'Depends: systemd +Essential: yes' + +# An additional, non-essential package depends on the package that has an or group dependency. + +insertinstalledpackage 'unrelated-package' 'amd64' '1' 'Depends: systemd' + +setupaptarchive + +# The test removes the currently-installed part of the or group +# (it should be replaced with the other one automatically.) +# +# The test should fail if the package "unrelated-package" is removed. + +testsuccessequal 'Reading package lists... +Building dependency tree... +The following additional packages will be installed: + openntpd +The following packages will be REMOVED: + chrony +The following NEW packages will be installed: + openntpd +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv chrony [1] [systemd:amd64 ] +Inst openntpd (1 sid [amd64]) +Conf openntpd (1 sid [amd64])' aptget -s remove chrony |