From: Michael Vogt <michael.vogt@ubuntu.com>
Date: Tue, 30 Jun 2009 11:52:52 +0000 (+0200)
Subject: merge the AutoInstOk patch from debian-experimental
X-Git-Tag: 0.7.22~31
X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/d116d66834b77cc77750c89969c43e0ba9d5807e

merge the AutoInstOk patch from debian-experimental
---

diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc
index db370a044..2ad064319 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.cc
@@ -985,7 +985,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 			// Consider other options
 			if (InOr == false)
 			{
-			   if (Cache.IsAutoInstallOk(I) == true)
+			   if (Cache.AutoInstOk(I, Cache[I].CandidateVerIter(Cache),Start) == true)
 			   {
 			      if (Debug == true)
 			         clog << "  Removing " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl;
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index 8af6941cf..b1b8f970f 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -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);
 }
diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h
index e6110ea19..10f9c1091 100644
--- a/apt-pkg/depcache.h
+++ b/apt-pkg/depcache.h
@@ -363,6 +363,20 @@ class pkgDepCache : protected pkgCache::Namespace
     */
    virtual bool MarkFollowsSuggests();
 
+   /** \return \b true if it's OK for MarkInstall to recursively
+    *  install the given version of the given package.
+    *
+    *  \param p  the package that MarkInstall wants to install.
+    *  \param v  the version being installed, or an end iterator
+    *            if p is being removed.
+    *  \param d  the dependency being fixed.
+    *
+    *  The default implementation unconditionally returns \b true.
+    */
+   virtual bool AutoInstOk(const PkgIterator &p,
+			   const VerIterator &v,
+			   const DepIterator &d);
+
    /** \brief Update the Marked and Garbage fields of all packages.
     *
     *  This routine is implicitly invoked after all state manipulators
@@ -397,18 +411,6 @@ class pkgDepCache : protected pkgCache::Namespace
 		    unsigned long Depth = 0, bool FromUser = true,
 		    bool ForceImportantDeps = false);
 
-   /** \return \b true if it's OK for MarkInstall to recursively
-    *  install the given package automatically.
-    *
-    *  \param Pkg  the package that MarkInstall wants to install.
-    *
-    *  \param Depth  output depth used for the debugging messages
-    *
-    *  The default implementation unconditionally returns \b true.
-    */
-   virtual bool IsAutoInstallOk(const PkgIterator &Pkg,
-				unsigned long Depth = 0);
-
    void SetReInstall(PkgIterator const &Pkg,bool To);
    void SetCandidateVersion(VerIterator TargetVer);
 
diff --git a/debian/changelog b/debian/changelog
index 8610b6376..333640b18 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -33,7 +33,7 @@ apt (0.7.22) UNRELEASED; urgency=low
   * support IsAutoInstallOk in the resolver too
 
   [ Michael Vogt ]
-  * honor the dpkg hold state in IsAutoInstallOk (closes: #64141)
+  * honor the dpkg hold state in AutoInstOk (closes: #64141)
   
   [ Julian Andres Klode ]
   * apt-pkg/contrib/configuration.cc: Fix a small memory leak in