|
|
@@ -115,7 +115,7 @@ bool pkgPolicy::InitDefaults()
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* Evaluate the package pins and the default list to deteremine what the
|
|
|
best package is. */
|
|
|
-pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
|
|
|
+pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const &Pkg)
|
|
|
{
|
|
|
// Look for a package pin and evaluate it.
|
|
|
signed Max = GetPriority(Pkg);
|
|
|
@@ -147,6 +147,16 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
|
|
|
*/
|
|
|
for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; Ver++)
|
|
|
{
|
|
|
+ /* Lets see if this version is the installed version */
|
|
|
+ bool instVer = (Pkg.CurrentVer() == Ver);
|
|
|
+ if (Ver.Pseudo() == true && instVer == false)
|
|
|
+ {
|
|
|
+ pkgCache::PkgIterator const allPkg = Ver.ParentPkg().Group().FindPkg("all");
|
|
|
+ if (allPkg->CurrentVer != 0 && allPkg.CurrentVer()->Hash == Ver->Hash &&
|
|
|
+ strcmp(allPkg.CurVersion(), Ver.VerStr()) == 0)
|
|
|
+ instVer = true;
|
|
|
+ }
|
|
|
+
|
|
|
for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; VF++)
|
|
|
{
|
|
|
/* If this is the status file, and the current version is not the
|
|
|
@@ -155,9 +165,9 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
|
|
|
out bogus entries that may be due to config-file states, or
|
|
|
other. */
|
|
|
if ((VF.File()->Flags & pkgCache::Flag::NotSource) == pkgCache::Flag::NotSource &&
|
|
|
- Pkg.CurrentVer() != Ver)
|
|
|
+ instVer == false)
|
|
|
continue;
|
|
|
-
|
|
|
+
|
|
|
signed Prio = PFPriority[VF.File()->ID];
|
|
|
if (Prio > Max)
|
|
|
{
|
|
|
@@ -171,7 +181,7 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (Pkg.CurrentVer() == Ver && Max < 1000)
|
|
|
+ if (instVer == true && Max < 1000)
|
|
|
{
|
|
|
/* Elevate our current selection (or the status file itself)
|
|
|
to the Pseudo-status priority. */
|
|
|
@@ -189,6 +199,7 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
|
|
|
// will always be a candidate (Closes: #512318)
|
|
|
if (!Pref.IsGood() && MaxAlt > 0)
|
|
|
Pref = PrefAlt;
|
|
|
+
|
|
|
return Pref;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
@@ -238,15 +249,14 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name,
|
|
|
// Policy::GetMatch - Get the matching version for a package pin /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* */
|
|
|
-pkgCache::VerIterator pkgPolicy::GetMatch(pkgCache::PkgIterator Pkg)
|
|
|
+pkgCache::VerIterator pkgPolicy::GetMatch(pkgCache::PkgIterator const &Pkg)
|
|
|
{
|
|
|
const Pin &PPkg = Pins[Pkg->ID];
|
|
|
- if (PPkg.Type != pkgVersionMatch::None)
|
|
|
- {
|
|
|
- pkgVersionMatch Match(PPkg.Data,PPkg.Type);
|
|
|
- return Match.Find(Pkg);
|
|
|
- }
|
|
|
- return pkgCache::VerIterator(*Pkg.Cache());
|
|
|
+ if (PPkg.Type == pkgVersionMatch::None)
|
|
|
+ return pkgCache::VerIterator(*Pkg.Cache());
|
|
|
+
|
|
|
+ pkgVersionMatch Match(PPkg.Data,PPkg.Type);
|
|
|
+ return Match.Find(Pkg);
|
|
|
}
|
|
|
/*}}}*/
|
|
|
// Policy::GetPriority - Get the priority of the package pin /*{{{*/
|