Bläddra i källkod

pkgPolicy: Introduce storage and helpers for per-version pins

Per-version pins should lead to more predictable results with
/etc/apt/preferences uses like pinning one version with -1.
Julian Andres Klode 11 år sedan
förälder
incheckning
9fb02ab025
2 ändrade filer med 12 tillägg och 1 borttagningar
  1. 10 1
      apt-pkg/policy.cc
  2. 2 0
      apt-pkg/policy.h

+ 10 - 1
apt-pkg/policy.cc

@@ -50,9 +50,12 @@ pkgPolicy::pkgPolicy(pkgCache *Owner) : Pins(0), PFPriority(0), Cache(Owner)
       return;
    PFPriority = new signed short[Owner->Head().PackageFileCount];
    Pins = new Pin[Owner->Head().PackageCount];
+   VerPins = new Pin[Owner->Head().VersionCount];
 
    for (unsigned long I = 0; I != Owner->Head().PackageCount; I++)
       Pins[I].Type = pkgVersionMatch::None;
+   for (unsigned long I = 0; I != Owner->Head().VersionCount; I++)
+      VerPins[I].Type = pkgVersionMatch::None;
 
    // The config file has a master override.
    string DefRel = _config->Find("APT::Default-Release");
@@ -318,6 +321,12 @@ APT_PURE signed short pkgPolicy::GetPriority(pkgCache::PkgIterator const &Pkg)
       return Pins[Pkg->ID].Priority;
    return 0;
 }
+APT_PURE signed short pkgPolicy::GetPriority(pkgCache::VerIterator const &Ver)
+{
+   if (VerPins[Ver->ID].Type != pkgVersionMatch::None)
+      return VerPins[Ver->ID].Priority;
+   return 0;
+}
 APT_PURE signed short pkgPolicy::GetPriority(pkgCache::PkgFileIterator const &File)
 {
    return PFPriority[File->ID];
@@ -440,4 +449,4 @@ bool ReadPinFile(pkgPolicy &Plcy,string File)
 }
 									/*}}}*/
 
-pkgPolicy::~pkgPolicy() {delete [] PFPriority; delete [] Pins;}
+pkgPolicy::~pkgPolicy() {delete [] PFPriority; delete [] Pins; delete [] VerPins; }

+ 2 - 0
apt-pkg/policy.h

@@ -63,6 +63,7 @@ class pkgPolicy : public pkgDepCache::Policy
    };
    
    Pin *Pins;
+   Pin *VerPins;
    signed short *PFPriority;
    std::vector<Pin> Defaults;
    std::vector<PkgPin> Unmatched;
@@ -79,6 +80,7 @@ class pkgPolicy : public pkgDepCache::Policy
    // Things for the cache interface.
    virtual pkgCache::VerIterator GetCandidateVer(pkgCache::PkgIterator const &Pkg);
    virtual signed short GetPriority(pkgCache::PkgIterator const &Pkg);
+   virtual signed short GetPriority(pkgCache::VerIterator const &Pkg);
    virtual signed short GetPriority(pkgCache::PkgFileIterator const &File);
 
    bool InitDefaults();