990 = Config file override package files
989 = Start for preference auto-priorities
500 = Default package files
- 100 = The status file
+ 100 = The status file and ButAutomaticUpgrades sources
0 -> 100 = NotAutomatic sources like experimental
-inf -> 0 = Never selected
file matches the V0 policy engine. */
pkgPolicy::pkgPolicy(pkgCache *Owner) : Pins(0), PFPriority(0), Cache(Owner)
{
+ if (Owner == 0 || &(Owner->Head()) == 0)
+ return;
PFPriority = new signed short[Owner->Head().PackageFileCount];
Pins = new Pin[Owner->Head().PackageCount];
PFPriority[I->ID] = 500;
if ((I->Flags & pkgCache::Flag::NotSource) == pkgCache::Flag::NotSource)
PFPriority[I->ID] = 100;
- else
- if ((I->Flags & pkgCache::Flag::NotAutomatic) == pkgCache::Flag::NotAutomatic)
- PFPriority[I->ID] = 1;
+ else if ((I->Flags & pkgCache::Flag::ButAutomaticUpgrades) == pkgCache::Flag::ButAutomaticUpgrades)
+ PFPriority[I->ID] = 100;
+ else if ((I->Flags & pkgCache::Flag::NotAutomatic) == pkgCache::Flag::NotAutomatic)
+ PFPriority[I->ID] = 1;
}
// Apply the defaults..
// ---------------------------------------------------------------------
/* 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);
*/
for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; Ver++)
{
+ /* Lets see if this version is the installed version */
+ bool instVer = (Pkg.CurrentVer() == Ver);
+
for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; VF++)
{
/* If this is the status file, and the current version is not the
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)
{
}
}
- 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. */
// will always be a candidate (Closes: #512318)
if (!Pref.IsGood() && MaxAlt > 0)
Pref = PrefAlt;
+
return Pref;
}
/*}}}*/
// 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 /*{{{*/
}
return 0;
+}
+signed short pkgPolicy::GetPriority(pkgCache::PkgFileIterator const &File)
+{
+ return PFPriority[File->ID];
}
/*}}}*/
// PreferenceSection class - Overriding the default TrimRecord method /*{{{*/
if (File.empty() == true)
File = _config->FindFile("Dir::Etc::Preferences");
- if (FileExists(File) == false)
+ if (RealFileExists(File) == false)
return true;
FileFd Fd(File,FileFd::ReadOnly);