* support IsAutoInstallOk in the resolver too
authorMichael Vogt <michael.vogt@ubuntu.com>
Mon, 29 Jun 2009 16:40:42 +0000 (18:40 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Mon, 29 Jun 2009 16:40:42 +0000 (18:40 +0200)
* honor the dpkg hold state in IsAutoInstallOk (closes: #64141)

apt-pkg/algorithms.cc
apt-pkg/depcache.cc
debian/changelog

index 4b1bb44..db370a0 100644 (file)
@@ -985,15 +985,27 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
                        // Consider other options
                        if (InOr == false)
                        {
-                          if (Debug == true)
-                             clog << "  Removing " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl;
-                          Cache.MarkDelete(I);
-                          if (Counter > 1)
+                          if (Cache.IsAutoInstallOk(I) == true)
                           {
-                             if (Scores[Pkg->ID] > Scores[I->ID])
-                                Scores[I->ID] = Scores[Pkg->ID];
-                          }                       
-                       }                       
+                             if (Debug == true)
+                                clog << "  Removing " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl;
+                             Cache.MarkDelete(I);
+                             if (Counter > 1)
+                             {
+                                if (Scores[Pkg->ID] > Scores[I->ID])
+                                   Scores[I->ID] = Scores[Pkg->ID];
+                             }
+                          } else {
+                             /* The dependency of the TargetPkg would be satisfiable with I but it is
+                                forbidden to install I automatical, so anything we can do is hold
+                                back the TargetPkg.
+                             */
+                             if (Debug == true)
+                                clog << "  Hold back " << Start.TargetPkg().Name() <<
+                                       " rather than change denied AutoInstall " << I.Name() << endl;
+                             Cache.MarkKeep(Start.TargetPkg());
+                          }
+                       }
                     }
                  }
                                  
index 9f734cc..8af6941 100644 (file)
@@ -1069,7 +1069,7 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
    library can override this method to control the MarkInstall behaviour */
 bool pkgDepCache::IsAutoInstallOk(const PkgIterator &Pkg, unsigned long Depth)
 {
-   return true;
+   return (Pkg->SelectedState != pkgCache::State::Hold);
 }
                                                                        /*}}}*/
 // DepCache::SetReInstall - Set the reinstallation flag                        /*{{{*/
index aadaa08..8610b63 100644 (file)
@@ -30,7 +30,11 @@ apt (0.7.22) UNRELEASED; urgency=low
     adjustable
   * do not write state file in simulate mode (closes: #433007)
   * add hook for auto-install (closes: #470035)
+  * support IsAutoInstallOk in the resolver too
 
+  [ Michael Vogt ]
+  * honor the dpkg hold state in IsAutoInstallOk (closes: #64141)
+  
   [ Julian Andres Klode ]
   * apt-pkg/contrib/configuration.cc: Fix a small memory leak in
     ReadConfigFile.