]> git.saurik.com Git - apt.git/commitdiff
do not change protected packages in autoinstall (Closes: #618848)
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 26 Mar 2011 11:41:51 +0000 (12:41 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 26 Mar 2011 11:41:51 +0000 (12:41 +0100)
apt-pkg/algorithms.h
apt-pkg/depcache.cc
apt-pkg/depcache.h
debian/changelog
test/integration/test-bug-549968-install-depends-of-not-installed
test/integration/test-bug-618848-always-respect-user-requests [new file with mode: 0755]

index cf4a98c4f95818b069336362ba0c178e5997d8f1..ebe31cc103024ab08124cb57bf5d8b400cbf7329 100644 (file)
@@ -108,7 +108,7 @@ class pkgProblemResolver                                            /*{{{*/
    
    public:
    
-   inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected;};
+   inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected; Cache.MarkProtected(Pkg);};
    inline void Remove(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= ToRemove;};
    inline void Clear(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] &= ~(Protected | ToRemove);};
    
index 1c89bd32f9907c180b9f150da1b686b9cfd81798..07803d7bf7a69bb9e012b5b5698e8715ded19f0f 100644 (file)
@@ -964,11 +964,26 @@ bool pkgDepCache::IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg,
    if (unlikely(Pkg.end() == true || Pkg->VersionList == 0))
       return false;
 
+   // the user is always right
+   if (FromUser == true)
+      return true;
+
+   StateCache &P = PkgState[Pkg->ID];
+
+   // if previous state was set by user only user can reset it
+   if ((P.iFlags & Protected) == Protected)
+   {
+      if (unlikely(DebugMarker == true) && P.Mode != mode)
+        std::clog << OutputInDepth(Depth) << "Ignore Mark" << PrintMode(mode)
+                  << " of " << Pkg << " as its mode (" << PrintMode(P.Mode)
+                  << ") is protected" << std::endl;
+      return false;
+   }
    // enforce dpkg holds
-   if (FromUser == false && mode != ModeKeep && Pkg->SelectedState == pkgCache::State::Hold &&
+   else if (mode != ModeKeep && Pkg->SelectedState == pkgCache::State::Hold &&
            _config->FindB("APT::Ignore-Hold",false) == false)
    {
-      if (unlikely(DebugMarker == true) && PkgState[Pkg->ID].Mode != mode)
+      if (unlikely(DebugMarker == true) && P.Mode != mode)
         std::clog << OutputInDepth(Depth) << "Hold prevents Mark" << PrintMode(mode)
                   << " of " << Pkg << std::endl;
       return false;
index 8cf7db80a3a5ceb1c5f8a5211478469d6e264eb2..750da3d6f1cb9db717a57882881626fc495d6a01 100644 (file)
@@ -119,7 +119,7 @@ class pkgDepCache : protected pkgCache::Namespace
                        DepCandPolicy = (1 << 4), DepCandMin = (1 << 5)};
    
    // These flags are used in StateCache::iFlags
-   enum InternalFlags {AutoKept = (1 << 0), Purge = (1 << 1), ReInstall = (1 << 2)};
+   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};
@@ -393,6 +393,7 @@ class pkgDepCache : protected pkgCache::Namespace
    void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true,
                    unsigned long Depth = 0, bool FromUser = true,
                    bool ForceImportantDeps = false);
+   void MarkProtected(PkgIterator const &Pkg) { PkgState[Pkg->ID].iFlags |= Protected; };
 
    void SetReInstall(PkgIterator const &Pkg,bool To);
    // FIXME: Remove the unused boolean parameter on abi break
index 1c2cd9da77f85d8854e4bfbf3065db3887987296..2af2517e10fde43679e71383777ab755bfc6983a 100644 (file)
@@ -15,6 +15,7 @@ apt (0.8.13.1) UNRELEASED; urgency=low
       as suggested by Charles Plessy (Closes: #619083)
   * apt-pkg/depcache.cc:
     - remove pseudo handling leftover from SetReInstall
+    - do not change protected packages in autoinstall (Closes: #618848)
   * apt-pkg/pkgcachegen.cc:
     - make "all"->"native" an implementation detail of NewPackage
       rather than rewrite it in higher methods
@@ -25,7 +26,7 @@ apt (0.8.13.1) UNRELEASED; urgency=low
     - use dpkg --print-foreign-architectures to get multiarch configuration
       if non is specified with APT::Architectures (Closes: #612958)
 
- -- David Kalnischkies <kalnischkies@gmail.com>  Sat, 26 Mar 2011 01:28:38 +0100
+ -- David Kalnischkies <kalnischkies@gmail.com>  Sat, 26 Mar 2011 12:26:32 +0100
 
 apt (0.8.13) unstable; urgency=low
 
index 7b4b4b71c7db89e7408ab775a54c5526ebaf1b02..78c0801f2af25526b4d9e3cb8158692b0ab803b9 100755 (executable)
@@ -17,7 +17,7 @@ setupaptarchive
 testequal 'Reading package lists...
 Building dependency tree...
   MarkInstall coolstuff [ i386 ] < none -> 1.0 > ( other ) FU=1
-    Hold prevents MarkInstall of extracoolstuff [ i386 ] < none -> 1.0 > ( other )
+    Ignore MarkInstall of extracoolstuff [ i386 ] < none -> 1.0 > ( other ) as its mode (Keep) is protected
 Package extracoolstuff is not installed, so not removed
 The following NEW packages will be installed:
   coolstuff
diff --git a/test/integration/test-bug-618848-always-respect-user-requests b/test/integration/test-bug-618848-always-respect-user-requests
new file mode 100755 (executable)
index 0000000..5148be6
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+
+insertinstalledpackage 'libdb4.8' 'all' '1.0'
+insertinstalledpackage 'exim4' 'all' '1.0' 'Depends: exim4-daemon-light | exim4-daemon-heavy'
+insertinstalledpackage 'exim4-daemon-light' 'all' '1.0' 'Depends: libdb4.8'
+insertpackage 'unstable' 'exim4-daemon-heavy' 'all' '1.0' 'Depends: libdb4.8'
+
+setupaptarchive
+
+testequal 'Reading package lists...
+Building dependency tree...
+  MarkDelete libdb4.8 [ i386 ] < 1.0 > ( other ) FU=1
+  MarkDelete exim4-daemon-light [ i386 ] < 1.0 > ( other ) FU=1
+    MarkInstall exim4-daemon-heavy [ i386 ] < none -> 1.0 > ( other ) FU=0
+      Ignore MarkInstall of libdb4.8 [ i386 ] < 1.0 > ( other ) as its mode (Delete) is protected
+    MarkDelete exim4-daemon-heavy [ i386 ] < none -> 1.0 > ( other ) FU=0
+  MarkDelete exim4 [ i386 ] < 1.0 > ( other ) FU=1
+The following packages will be REMOVED:
+  exim4 exim4-daemon-light libdb4.8
+  MarkDelete exim4 [ i386 ] < 1.0 > ( other ) FU=1
+0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
+Remv exim4 [1.0]
+  MarkDelete exim4-daemon-light [ i386 ] < 1.0 > ( other ) FU=1
+Remv exim4-daemon-light [1.0]
+  MarkDelete libdb4.8 [ i386 ] < 1.0 > ( other ) FU=1
+Remv libdb4.8 [1.0]' aptget remove libdb4.8 -s -o Debug::pkgDepCache::Marker=1