|
@@ -846,17 +846,6 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
|
|
|
// We dont even try to install virtual packages..
|
|
// We dont even try to install virtual packages..
|
|
|
if (Pkg->VersionList == 0)
|
|
if (Pkg->VersionList == 0)
|
|
|
return;
|
|
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
|
|
/* Target the candidate version and remove the autoflag. We reset the
|
|
|
autoflag below if this was called recursively. Otherwise the user
|
|
autoflag below if this was called recursively. Otherwise the user
|
|
|
should have the ability to de-auto a package by changing its state */
|
|
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)
|
|
if(DebugAutoInstall == true)
|
|
|
std::clog << OutputInDepth(Depth) << "Installing " << InstPkg.Name()
|
|
std::clog << OutputInDepth(Depth) << "Installing " << InstPkg.Name()
|
|
@@ -1053,21 +1043,28 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
|
|
|
PkgIterator Pkg = Ver.ParentPkg();
|
|
PkgIterator Pkg = Ver.ParentPkg();
|
|
|
|
|
|
|
|
if (Start->Type != Dep::DpkgBreaks)
|
|
if (Start->Type != Dep::DpkgBreaks)
|
|
|
- MarkDelete(Pkg,false,Depth + 1);
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ if(AutoInstOk(Pkg, VerIterator(*this), Start))
|
|
|
|
|
+ MarkDelete(Pkg);
|
|
|
|
|
+ }
|
|
|
else
|
|
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);
|
|
MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps);
|
|
|
}
|
|
}
|
|
|
continue;
|
|
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);
|
|
return (Pkg->SelectedState != pkgCache::State::Hold);
|
|
|
}
|
|
}
|