diff options
-rw-r--r-- | apt-pkg/deb/dpkgpm.cc | 15 | ||||
-rwxr-xr-x | test/integration/test-essential-force-loopbreak | 3 | ||||
-rwxr-xr-x | test/integration/test-ubuntu-bug-761175-remove-purge | 4 |
3 files changed, 20 insertions, 2 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 23d3ff977..d224a34c0 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -1216,6 +1216,15 @@ void pkgDPkgPM::StopPtyMagic() */ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) { + auto const ItemIsEssential = [](pkgDPkgPM::Item const &I) { + static auto const cachegen = _config->Find("pkgCacheGen::Essential"); + if (cachegen == "none" || cachegen == "native") + return true; + if (unlikely(I.Pkg.end())) + return true; + return (I.Pkg->Flags & pkgCache::Flag::Essential) != 0; + }; + pkgPackageManager::SigINTStop = false; d->progress = progress; @@ -1342,13 +1351,15 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) { case Item::Remove: ADDARGC("--force-depends"); - ADDARGC("--force-remove-essential"); + if (std::any_of(I, J, ItemIsEssential)) + ADDARGC("--force-remove-essential"); ADDARGC("--remove"); break; case Item::Purge: ADDARGC("--force-depends"); - ADDARGC("--force-remove-essential"); + if (std::any_of(I, J, ItemIsEssential)) + ADDARGC("--force-remove-essential"); ADDARGC("--purge"); break; diff --git a/test/integration/test-essential-force-loopbreak b/test/integration/test-essential-force-loopbreak index 6f7d99cb6..f585e9c42 100755 --- a/test/integration/test-essential-force-loopbreak +++ b/test/integration/test-essential-force-loopbreak @@ -43,6 +43,9 @@ E: Internal Error, Could not early remove sysvinit:$(dpkg --print-architecture) # with enough force however … cp -a dpkg.status.backup rootdir/var/lib/dpkg/status + testsuccess aptget install systemd-sysv -y -t "$1" -o APT::Force-LoopBreak=1 -o Debug::pkgDpkgPm=1 + cp rootdir/tmp/testsuccess.output apt.output + testsuccess grep -- '--force-remove-essential --remove sysvinit' apt.output testsuccess aptget install systemd-sysv -y -t "$1" -o APT::Force-LoopBreak=1 testdpkginstalled 'sysvinit' 'systemd-sysv' } diff --git a/test/integration/test-ubuntu-bug-761175-remove-purge b/test/integration/test-ubuntu-bug-761175-remove-purge index aae394ad8..6ae1a04e8 100755 --- a/test/integration/test-ubuntu-bug-761175-remove-purge +++ b/test/integration/test-ubuntu-bug-761175-remove-purge @@ -30,6 +30,8 @@ runtests() { testsuccess aptget install compiz-core-${PKG} -t "${RELEASE}" "$@" testdpkginstalled compiz-core-${PKG} + testsuccess aptget remove compiz-core-${PKG} -y "$@" -o Debug::pkgDpkgPm=1 + testfailure grep -- '--force-remove-essential' rootdir/tmp/testsuccess.output testsuccess aptget remove compiz-core-${PKG} -y "$@" testdpkgnotinstalled compiz-core-${PKG} testdpkgstatus 'rc' '1' "compiz-core-${PKG}" @@ -61,6 +63,8 @@ The following packages will be REMOVED: 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. Purg compiz-core-${PKG}" aptget purge compiz-core-${PKG} -s "$@" fi + testsuccess aptget purge compiz-core-${PKG} -y "$@" -o Debug::pkgDpkgPm=1 + testfailure grep -- '--force-remove-essential' rootdir/tmp/testsuccess.output testsuccess aptget purge compiz-core-${PKG} -y "$@" echo -n '' > rootdir/var/lib/dpkg/available # dpkg -l < 1.16.2 reads the available file by default, where the package can be found testequalor2 "dpkg-query: no packages found matching compiz-core-${PKG}" "No packages found matching compiz-core-${PKG}." dpkg -l compiz-core-${PKG} |