diff options
author | Julian Andres Klode <julian.klode@canonical.com> | 2019-09-19 10:16:26 +0200 |
---|---|---|
committer | Julian Andres Klode <julian.klode@canonical.com> | 2019-09-19 10:37:55 +0200 |
commit | 8a54113d450140bd6b158cb05473cacca859a54d (patch) | |
tree | da98535a1604e8a39060a775896cf434ba7820c6 | |
parent | b9127ca07c37288f16b1fdc267d3f106721ed301 (diff) | |
download | apt-8a54113d450140bd6b158cb05473cacca859a54d.tar.gz |
Pass --abort-after=1 to dpkg when using --force-depends
Using --force-depends causes dpkg to continue removing packages
a package depends upon even if that package fails to be removed,
because dpkg turns off all sanity checks. So we gotta tell dpkg
to stop immediately if there's an error removing stuff.
Closes: #935910
LP: #1844634
-rw-r--r-- | apt-pkg/deb/dpkgpm.cc | 1 | ||||
-rwxr-xr-x | test/integration/test-apt-get-remove-depends | 29 |
2 files changed, 30 insertions, 0 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 4de36d528..0b807d668 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -1775,6 +1775,7 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) case Item::Remove: case Item::Purge: ADDARGC("--force-depends"); + ADDARGC("--abort-after=1"); if (std::any_of(I, J, ItemIsEssential)) { ADDARGC("--force-remove-essential"); diff --git a/test/integration/test-apt-get-remove-depends b/test/integration/test-apt-get-remove-depends new file mode 100755 index 000000000..2d2cf0dd6 --- /dev/null +++ b/test/integration/test-apt-get-remove-depends @@ -0,0 +1,29 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'i386' + +buildsimplenativepackage 'alpha' 'all' '1' 'unstable' 'Depends: beta' +buildsimplenativepackage 'beta' 'all' '1' 'unstable' +setupaptarchive + +testsuccess aptget install alpha -y + +cat > rootdir/var/lib/dpkg/info/alpha.prerm << EOF +#!/bin/sh +exit 42 +EOF +chmod 755 rootdir/var/lib/dpkg/info/alpha.prerm + + +testdpkginstalled 'alpha' 'beta' + + +testfailure aptget remove -y beta + +# Beta should not be removed because alpha failed to be removed and depends on it + +testdpkginstalled 'alpha' 'beta' |