summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/algorithms.cc2
-rw-r--r--apt-pkg/depcache.cc35
-rw-r--r--apt-pkg/depcache.h26
-rw-r--r--debian/changelog2
4 files changed, 32 insertions, 33 deletions
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