Browse Source

don't consider holds for autoremoval

We can't remove packages which are held back by the user with a hold, so
marking them (or its dependencies) as garbage will lead our autoremover
into madness – and given that the package is important enough that the
user has held it back it can't be garbage (at least at the moment), so
even if a front-end wants to use the info just for information display
its a good idea to not consider it garbage for them.

Closes: 724995
tags/debian/0.9.12
David Kalnischkies 8 years ago
parent
commit
8fa042ca39
3 changed files with 25 additions and 4 deletions
  1. +4
    -3
      apt-pkg/depcache.cc
  2. +1
    -1
      apt-pkg/depcache.h
  3. +20
    -0
      test/integration/test-apt-get-autoremove

+ 4
- 3
apt-pkg/depcache.cc View File

@@ -896,6 +896,7 @@ char const* PrintMode(char const mode)
case pkgDepCache::ModeInstall: return "Install";
case pkgDepCache::ModeKeep: return "Keep";
case pkgDepCache::ModeDelete: return "Delete";
case pkgDepCache::ModeGarbage: return "Garbage";
default: return "UNKNOWN";
}
}
@@ -1726,8 +1727,6 @@ bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc)
follow_recommends = MarkFollowsRecommends();
follow_suggests = MarkFollowsSuggests();



// do the mark part, this is the core bit of the algorithm
for(PkgIterator p = PkgBegin(); !p.end(); ++p)
{
@@ -1738,7 +1737,9 @@ bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc)
// be nice even then a required package violates the policy (#583517)
// and do the full mark process also for required packages
(p.CurrentVer().end() != true &&
p.CurrentVer()->Priority == pkgCache::State::Required))
p.CurrentVer()->Priority == pkgCache::State::Required) ||
// packages which can't be changed (like holds) can't be garbage
(IsModeChangeOk(ModeGarbage, p, 0, false) == false))
{
// the package is installed (and set to keep)
if(PkgState[p->ID].Keep() && !p.CurrentVer().end())


+ 1
- 1
apt-pkg/depcache.h View File

@@ -128,7 +128,7 @@ class pkgDepCache : protected pkgCache::Namespace
enum InternalFlags {AutoKept = (1 << 0), Purge = (1 << 1), ReInstall = (1 << 2), Protected = (1 << 3)};
enum VersionTypes {NowVersion, InstallVersion, CandidateVersion};
enum ModeList {ModeDelete = 0, ModeKeep = 1, ModeInstall = 2};
enum ModeList {ModeDelete = 0, ModeKeep = 1, ModeInstall = 2, ModeGarbage = 3};

/** \brief Represents an active action group.
*


+ 20
- 0
test/integration/test-apt-get-autoremove View File

@@ -49,3 +49,23 @@ Install: unrelated:i386 (1), debhelper:i386 (8.0.0), po-debconf:i386 (1.0.16, au
Remove: debhelper:i386 (8.0.0)

Remove: po-debconf:i386 (1.0.16)'

testsuccess aptget install debhelper -y
testdpkginstalled 'unrelated' 'debhelper' 'po-debconf'
testsuccess aptmark auto debhelper

testmarkedauto 'debhelper' 'po-debconf'
testequal 'Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
debhelper po-debconf
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
Remv debhelper [8.0.0]
Remv po-debconf [1.0.16]' aptget autoremove -s

testsuccess aptmark hold debhelper
testequal 'Reading package lists...
Building dependency tree...
Reading state information...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget autoremove -s

Loading…
Cancel
Save