]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/depcache.cc
merge the AutoInstOk patch from debian-experimental
[apt.git] / apt-pkg / depcache.cc
index 8af6941cfbc5d869b9f758b4170e3287778e4066..b1b8f970f0938081c53dc732283498fa64e63c58 100644 (file)
@@ -846,17 +846,6 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
    // We dont even try to install virtual packages..
    if (Pkg->VersionList == 0)
       return;
-
-   /* if the user doesn't request directly the install we have to check
-      if this install will conflict with any rule a application
-      like apt-get or aptitude might has set (for the user)
-      e.g. forbidden versions, holds or other magic stuff */
-   if(FromUser == false && !IsAutoInstallOk(Pkg, Depth))
-   {
-      MarkKeep(Pkg, false, FromUser, Depth);
-      return;
-   }
-
    /* Target the candidate version and remove the autoflag. We reset the
       autoflag below if this was called recursively. Otherwise the user
       should have the ability to de-auto a package by changing its state */
@@ -1015,7 +1004,8 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
            }
         }
         
-        if (InstPkg.end() == false) 
+        if (InstPkg.end() == false &&
+            AutoInstOk(InstPkg, (*this)[InstPkg].CandidateVerIter(*this), Start))
         {
            if(DebugAutoInstall == true)
               std::clog << OutputInDepth(Depth) << "Installing " << InstPkg.Name()
@@ -1053,21 +1043,28 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
            PkgIterator Pkg = Ver.ParentPkg();
 
            if (Start->Type != Dep::DpkgBreaks)
-              MarkDelete(Pkg,false,Depth + 1);
+           {
+              if(AutoInstOk(Pkg, VerIterator(*this), Start))
+                 MarkDelete(Pkg);
+           }
            else
-              if (PkgState[Pkg->ID].CandidateVer != *I)
+              if (PkgState[Pkg->ID].CandidateVer != *I &&
+                  AutoInstOk(Pkg, VerIterator(*this, PkgState[Pkg->ID].CandidateVer), Start))
                  MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps);
         }
         continue;
       }      
    }
 }
-                                                                       /*}}}*/
-// DepCache::IsAutoInstallOk - check if it is to install this package  /*{{{*/
+
+// DepCache::AutoInstOk - check if it is to install this package       /*{{{*/
 // ---------------------------------------------------------------------
-/* The default implementation is useless, but an application using this
-   library can override this method to control the MarkInstall behaviour */
-bool pkgDepCache::IsAutoInstallOk(const PkgIterator &Pkg, unsigned long Depth)
+/* The default implementation just honors dpkg hold
+   But an application using this  library can override this method
+   to control the MarkInstall behaviour */
+bool pkgDepCache::AutoInstOk(const PkgIterator &Pkg, 
+                             const VerIterator &v,
+                             const DepIterator &d)
 {
    return (Pkg->SelectedState != pkgCache::State::Hold);
 }