summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2015-08-10 11:00:37 +0200
committerJulian Andres Klode <jak@debian.org>2015-08-10 11:00:37 +0200
commit9fb02ab02528ea45747318af26fae8a732cd2840 (patch)
tree34e39ba7a3016542ea0684482f453712b242c3db
parentebda4f51f6707e5a6550f92d9407eab855039060 (diff)
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.
-rw-r--r--apt-pkg/policy.cc11
-rw-r--r--apt-pkg/policy.h2
2 files changed, 12 insertions, 1 deletions
diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc
index 6da6ed606..5d7ab0e6b 100644
--- a/apt-pkg/policy.cc
+++ b/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; }
diff --git a/apt-pkg/policy.h b/apt-pkg/policy.h
index c4b1cbadd..9deeb9d0e 100644
--- a/apt-pkg/policy.h
+++ b/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();