From 2d403b92011c6e4a317a48284e7c68952ce5ddcd Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 29 Jun 2009 18:20:58 +0200 Subject: add hook for auto-install (closes: #470035) --- apt-pkg/depcache.cc | 20 ++++++++++++++++++++ apt-pkg/depcache.h | 13 +++++++++++++ 2 files changed, 33 insertions(+) (limited to 'apt-pkg') 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); -- cgit v1.2.3