// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: policy.cc,v 1.2 2001/02/20 07:03:17 jgg Exp $
+// $Id: policy.cc,v 1.10 2003/08/12 00:17:37 mdz Exp $
/* ######################################################################
Package Version Policy implementation
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/policy.h"
-#endif
#include <apt-pkg/policy.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/tagfile.h>
#include <apt-pkg/sptr.h>
#include <apti18n.h>
+
+#include <iostream>
/*}}}*/
+using namespace std;
+
// Policy::Init - Startup and bind to a cache /*{{{*/
// ---------------------------------------------------------------------
/* Set the defaults for operation. The default mode with no loaded policy
}
// Apply the defaults..
- SPtr<bool> Fixed = new bool[Cache->HeaderP->PackageFileCount];
+ SPtrArray<bool> Fixed = new bool[Cache->HeaderP->PackageFileCount];
memset(Fixed,0,sizeof(*Fixed)*Cache->HeaderP->PackageFileCount);
signed Cur = 989;
StatusOverride = false;
pkgVersionMatch Match(I->Data,I->Type);
for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F != Cache->FileEnd(); F++)
{
-/* hmm?
- if ((F->Flags & pkgCache::Flag::NotSource) == pkgCache::Flag::NotSource)
- continue;*/
-
if (Match.FileMatch(F) == true && Fixed[F->ID] == false)
{
if (I->Priority != 0 && I->Priority > 0)
best package is. */
pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
{
- const Pin &PPkg = Pins[Pkg->ID];
-
// Look for a package pin and evaluate it.
- signed Max = 0;
- pkgCache::VerIterator Pref(*Cache);
- if (PPkg.Type != pkgVersionMatch::None)
- {
- pkgVersionMatch Match(PPkg.Data,PPkg.Type);
- Pref = Match.Find(Pkg);
- Max = PPkg.Priority;
- if (PPkg.Priority == 0)
- Max = 989;
- }
-
+ signed Max = GetPriority(Pkg);
+ pkgCache::VerIterator Pref = GetMatch(Pkg);
+
/* Falling through to the default version.. Setting Max to zero
effectively excludes everything <= 0 which are the non-automatic
priorities.. The status file is given a prio of 100 which will exclude
pin that stays at that setting.
*/
for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; Ver++)
- {
+ {
for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; VF++)
{
+ /* If this is the status file, and the current version is not the
+ version in the status file (ie it is not installed, or somesuch)
+ then it is not a candidate for installation, ever. This weeds
+ 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)
+ continue;
+
signed Prio = PFPriority[VF.File()->ID];
if (Prio > Max)
{
break;
}
}
-
return Pref;
}
/*}}}*/
void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name,
string Data,signed short Priority)
{
- pkgCache::PkgIterator Pkg = Cache->FindPkg(Name);
Pin *P = 0;
if (Name.empty() == true)
- P = Defaults.insert(Defaults.end());
+ P = &*Defaults.insert(Defaults.end(),PkgPin());
else
{
// Get a spot to put the pin
+ pkgCache::PkgIterator Pkg = Cache->FindPkg(Name);
if (Pkg.end() == true)
{
// Check the unmatched table
for (vector<PkgPin>::iterator I = Unmatched.begin();
I != Unmatched.end() && P == 0; I++)
if (I->Pkg == Name)
- P = I;
+ P = &*I;
if (P == 0)
- P = Unmatched.insert(Unmatched.end());
+ P = &*Unmatched.insert(Unmatched.end(),PkgPin());
}
else
{
P->Data = Data;
}
/*}}}*/
+// Policy::GetMatch - Get the matching version for a package pin /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+pkgCache::VerIterator pkgPolicy::GetMatch(pkgCache::PkgIterator 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());
+}
+ /*}}}*/
+// Policy::GetPriority - Get the priority of the package pin /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+signed short pkgPolicy::GetPriority(pkgCache::PkgIterator const &Pkg)
+{
+ if (Pins[Pkg->ID].Type != pkgVersionMatch::None)
+ {
+ // In this case 0 means default priority
+ if (Pins[Pkg->ID].Priority == 0)
+ return 989;
+ return Pins[Pkg->ID].Priority;
+ }
+
+ return 0;
+}
+ /*}}}*/
// ReadPinFile - Load the pin file into a Policy /*{{{*/
// ---------------------------------------------------------------------
}
for (; Word != End && isspace(*Word) != 0; Word++);
- Plcy.CreatePin(Type,Name,string(Word,End),
- Tags.FindI("Pin-Priority"));
+ short int priority = Tags.FindI("Pin-Priority", 0);
+ if (priority == 0)
+ {
+ _error->Warning(_("No priority (or zero) specified for pin"));
+ continue;
+ }
+
+ Plcy.CreatePin(Type,Name,string(Word,End),priority);
}
Plcy.InitDefaults();