summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2009-06-29 18:20:58 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2009-06-29 18:20:58 +0200
commit2d403b92011c6e4a317a48284e7c68952ce5ddcd (patch)
treee31f045add0bbff0f6f025ef576e8e91b28c530a
parent9964a721855b74b4f6008d30ebc637198776ca04 (diff)
add hook for auto-install (closes: #470035)
-rw-r--r--apt-pkg/depcache.cc20
-rw-r--r--apt-pkg/depcache.h13
-rw-r--r--debian/changelog1
3 files changed, 34 insertions, 0 deletions
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index e9ef9cedc..fcc6f4a4e 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -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 /*{{{*/
// ---------------------------------------------------------------------
/* */
diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h
index 2d33e21d7..e6110ea19 100644
--- a/apt-pkg/depcache.h
+++ b/apt-pkg/depcache.h
@@ -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);
diff --git a/debian/changelog b/debian/changelog
index dd79639c6..aadaa0856 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -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