From 3f732aa6ad0a81b6a6942a61fd5ed26a26590e8e Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 28 Apr 2015 23:42:03 +0200 Subject: a pin of 1000 always means downgrade allowed The documentation says this, but the code only agreed while evaluating specific packages, but not generics. These needed a pin above 1000 to have the same effect. The code causing this makes references to a 'second pesduo status file', but nowhere is explained what this might stand for and/or what it was, so we do the only reasonable thing: Remove all references and do as documented. --- apt-pkg/policy.cc | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) (limited to 'apt-pkg/policy.cc') diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 3cfc32829..9a1d2977e 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -4,22 +4,12 @@ /* ###################################################################### Package Version Policy implementation - + This is just a really simple wrapper around pkgVersionMatch with some added goodies to manage the list of things.. - - Priority Table: - - 1000 -> inf = Downgradeable priorities - 1000 = The 'no downgrade' pseduo-status file - 100 -> 1000 = Standard priorities - 990 = Config file override package files - 989 = Start for preference auto-priorities - 500 = Default package files - 100 = The status file and ButAutomaticUpgrades sources - 0 -> 100 = NotAutomatic sources like experimental - -inf -> 0 = Never selected - + + See man apt_preferences for what value means what. + ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ @@ -56,7 +46,7 @@ using namespace std; file matches the V0 policy engine. */ pkgPolicy::pkgPolicy(pkgCache *Owner) : Pins(0), PFPriority(0), Cache(Owner) { - if (Owner == 0 || &(Owner->Head()) == 0) + if (Owner == 0) return; PFPriority = new signed short[Owner->Head().PackageFileCount]; Pins = new Pin[Owner->Head().PackageCount]; @@ -125,7 +115,7 @@ bool pkgPolicy::InitDefaults() else PFPriority[F->ID] = Cur; - if (PFPriority[F->ID] > 1000) + if (PFPriority[F->ID] >= 1000) StatusOverride = true; Fixed[F->ID] = true; @@ -166,9 +156,7 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const &Pk effectively excludes everything <= 0 which are the non-automatic priorities.. The status file is given a prio of 100 which will exclude not-automatic sources, except in a single shot not-installed mode. - The second pseduo-status file is at prio 1000, above which will permit - the user to force-downgrade things. - + The user pin is subject to the same priority rules as default selections. Thus there are two ways to create a pin - a pin that tracks the default when the default is taken away, and a permanent @@ -218,9 +206,9 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const &Pk Pref = Ver; PrefSeen = true; } - /* Elevate our current selection (or the status file itself) - to the Pseudo-status priority. */ - Max = 1000; + /* Elevate our current selection (or the status file itself) so that only + a downgrade can override it from now on */ + Max = 999; // Fast path optimize. if (StatusOverride == false) -- cgit v1.2.3 From ab640001ee772fa27ee789f6717805f9d46d5bce Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 28 Apr 2015 23:59:00 +0200 Subject: remove unused and strange default-value for pins MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the pin for a generic pin is 0, it get a value by strange looking rules, if the pin is specific the rules are at least not strange, but the value 989 is a magic number without any direct meaning… but both never happens in practice as the parsing skips such entries with a warning, so there always is a priority != 0 and the code therefore never used. --- apt-pkg/policy.cc | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) (limited to 'apt-pkg/policy.cc') diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 9a1d2977e..00693ce54 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -97,37 +97,29 @@ bool pkgPolicy::InitDefaults() // Apply the defaults.. SPtrArray Fixed = new bool[Cache->HeaderP->PackageFileCount]; memset(Fixed,0,sizeof(*Fixed)*Cache->HeaderP->PackageFileCount); - signed Cur = 989; StatusOverride = false; - for (vector::const_iterator I = Defaults.begin(); I != Defaults.end(); - ++I, --Cur) + for (vector::const_iterator I = Defaults.begin(); I != Defaults.end(); ++I) { pkgVersionMatch Match(I->Data,I->Type); for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F != Cache->FileEnd(); ++F) { - if (Match.FileMatch(F) == true && Fixed[F->ID] == false) + if (Fixed[F->ID] == false && Match.FileMatch(F) == true) { - if (I->Priority != 0 && I->Priority > 0) - Cur = I->Priority; - - if (I->Priority < 0) - PFPriority[F->ID] = I->Priority; - else - PFPriority[F->ID] = Cur; - + PFPriority[F->ID] = I->Priority; + if (PFPriority[F->ID] >= 1000) StatusOverride = true; - + Fixed[F->ID] = true; - } - } + } + } } if (_config->FindB("Debug::pkgPolicy",false) == true) for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F != Cache->FileEnd(); ++F) - std::clog << "Prio of " << F.FileName() << ' ' << PFPriority[F->ID] << std::endl; - - return true; + std::clog << "Prio of " << F.FileName() << ' ' << PFPriority[F->ID] << std::endl; + + return true; } /*}}}*/ // Policy::GetCandidateVer - Get the candidate install version /*{{{*/ @@ -324,13 +316,7 @@ pkgCache::VerIterator pkgPolicy::GetMatch(pkgCache::PkgIterator const &Pkg) APT_PURE 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; } APT_PURE signed short pkgPolicy::GetPriority(pkgCache::PkgFileIterator const &File) -- cgit v1.2.3