add hook for auto-install (closes: #470035)
authorMichael Vogt <michael.vogt@ubuntu.com>
Mon, 29 Jun 2009 16:20:58 +0000 (18:20 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Mon, 29 Jun 2009 16:20:58 +0000 (18:20 +0200)
apt-pkg/depcache.cc
apt-pkg/depcache.h
debian/changelog

index e9ef9ce..fcc6f4a 100644 (file)
@@ -853,6 +853,17 @@ 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 */
@@ -1059,6 +1070,15 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
    }
 }
                                                                        /*}}}*/
+// DepCache::IsAutoInstallOk - 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)
+{
+   return true;
+}
+                                                                       /*}}}*/
 // DepCache::SetReInstall - Set the reinstallation flag                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
index 2d33e21..e6110ea 100644 (file)
@@ -396,6 +396,19 @@ class pkgDepCache : protected pkgCache::Namespace
    void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true,
                    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);
 
index dd79639..aadaa08 100644 (file)
@@ -29,6 +29,7 @@ apt (0.7.22) UNRELEASED; urgency=low
   * add Debug::pkgProblemResolver::ShowScores and make the scores
     adjustable
   * do not write state file in simulate mode (closes: #433007)
+  * add hook for auto-install (closes: #470035)
 
   [ Julian Andres Klode ]
   * apt-pkg/contrib/configuration.cc: Fix a small memory leak in