diff options
author | David Kalnischkies <david@kalnischkies.de> | 2017-03-19 15:08:08 +0100 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2017-03-19 15:08:08 +0100 |
commit | c89b22c285d6c4a3cb64689ff26e84af4d1477f2 (patch) | |
tree | 08b8da2d9c780db750dab8d50889d249b241c757 | |
parent | 2ce15bdeac6ee93faefd4b42b57f035bef80c567 (diff) | |
download | apt-c89b22c285d6c4a3cb64689ff26e84af4d1477f2.tar.gz |
Ignore AutomaticRemove conffile option in upgrade
We are in a dilemma here: The regression of sorts was introduced in 2013
with commit d8a8f9d7f0 allowing pkg modifiers for the upgrade commands.
That calls the autoremover as a sideeffect through and with it comes the
option to remove the garbage packages in these commands (similar to aptitude).
Having the option on the commandline is no problem – people aren't going
to request what they don't want (or so I hope), but the documentation
explicitly states that this option only effects install/remove and
mentions a config knob users might use and expect to not suddenly apply
(especially without documentation) to more commands.
Just reverting the commit is out of question, completely ignoring the
option breaks the workflow of every user who happened to use
--autoremove on the commandline for upgrade and expects that to work
given that it was accepted and worked in a stable release. Changing the
documentation to reflect reality while perhaps the simplest and cleanest
option contradicts freeze and is a surprising change we tend to avoid
like the plague while just leaving it be confuses all users who end up
believing the documentation even if was different in the last 3 years.
So what we do is a tricky compromise: The configuration option if read
from a file does apply only for install/remove as documented, while if
the option is encountered on the commandline it is accepted and applies
to the upgrade which should make 99% of the users happy. The rest has to
wait for us to figure out for buster how to get that documented and
implemented in a saner way.
Closes: #855891
-rw-r--r-- | apt-private/private-cmndline.cc | 10 | ||||
-rwxr-xr-x | test/integration/test-apt-get-autoremove | 41 |
2 files changed, 51 insertions, 0 deletions
diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index b8b29e9c8..de3992a00 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -474,6 +474,16 @@ static void BinaryCommandSpecificConfiguration(char const * const Binary, char c std::string const binary = flNotDir(Binary); if (binary == "apt-get" && CmdMatches("update")) _config->CndSet("Binary::apt-get::Acquire::AllowInsecureRepositories", true); + if ((binary == "apt" || binary == "apt-get") && CmdMatches("upgrade", "dist-upgrade", "full-upgrade")) + { + //FIXME: the option is documented to apply only for install/remove, so + // we force it false for configuration files where users can be confused if + // we support it anyhow, but allow it on the commandline to take effect + // even through it isn't documented as a user who doesn't want it wouldn't + // ask for it + _config->Set("Binary::apt-get::APT::Get::AutomaticRemove", false); + _config->Set("Binary::apt::APT::Get::AutomaticRemove", false); + } } #undef CmdMatches /*}}}*/ diff --git a/test/integration/test-apt-get-autoremove b/test/integration/test-apt-get-autoremove index 8af864acb..6f3452fbd 100755 --- a/test/integration/test-apt-get-autoremove +++ b/test/integration/test-apt-get-autoremove @@ -46,6 +46,47 @@ Reading state information... 1 package was automatically installed and is no longer required. Use '$AUTOREMOVE' to remove it. 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -s -o APT::Get::HideAutoRemove=small +testequal "Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following package was automatically installed and is no longer required: + po-debconf +Use '$AUTOREMOVE' to remove it. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget upgrade -s +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + po-debconf +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv po-debconf [1.0.16]' aptget install -s --autoremove +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following packages will be REMOVED: + po-debconf +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv po-debconf [1.0.16]' aptget upgrade -s --autoremove +echo 'APT::Get::AutomaticRemove "true";' > rootdir/etc/apt/apt.conf.d/autoremoval +testsuccessequal 'Reading package lists... +Building dependency tree... +Reading state information... +The following packages will be REMOVED: + po-debconf +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +Remv po-debconf [1.0.16]' aptget install -s +testequal "Reading package lists... +Building dependency tree... +Reading state information... +Calculating upgrade... +The following package was automatically installed and is no longer required: + po-debconf +Use '$AUTOREMOVE' to remove it. +0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget upgrade -s +rm -f rootdir/etc/apt/apt.conf.d/autoremoval + testdpkginstalled 'po-debconf' echo 'APT::NeverAutoRemove { "^po-debconf$"; };' > rootdir/etc/apt/apt.conf.d/00autoremove |