diff options
author | Michael Vogt <egon@debian-devbox> | 2012-10-17 10:12:41 +0200 |
---|---|---|
committer | Michael Vogt <egon@debian-devbox> | 2012-10-17 10:12:41 +0200 |
commit | 32ed73df439850ee47e5e5edb8bfe1fe647ed794 (patch) | |
tree | 3a36260d49079236ae8c3c100de02455eed2d86e /apt-pkg/policy.cc | |
parent | d624605d4a750ba8005b19b270c3a1617bbb9f72 (diff) | |
parent | 27a83019db71c604eb6eaecd4feed09ba376e980 (diff) |
merged from debian-sid
Diffstat (limited to 'apt-pkg/policy.cc')
-rw-r--r-- | apt-pkg/policy.cc | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index b47dab90c..4ae3b5f87 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -27,6 +27,7 @@ #include <apt-pkg/policy.h> #include <apt-pkg/configuration.h> +#include <apt-pkg/cachefilter.h> #include <apt-pkg/tagfile.h> #include <apt-pkg/strutl.h> #include <apt-pkg/fileutl.h> @@ -259,17 +260,33 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, } // find the package (group) this pin applies to - pkgCache::GrpIterator Grp; - pkgCache::PkgIterator Pkg; - if (Arch.empty() == false) - Pkg = Cache->FindPkg(Name, Arch); - else { - Grp = Cache->FindGrp(Name); - if (Grp.end() == false) - Pkg = Grp.PackageList(); + pkgCache::GrpIterator Grp = Cache->FindGrp(Name); + bool matched = false; + if (Grp.end() == false) + { + std::string MatchingArch; + if (Arch.empty() == true) + MatchingArch = Cache->NativeArch(); + else + MatchingArch = Arch; + APT::CacheFilter::PackageArchitectureMatchesSpecification pams(MatchingArch); + for (pkgCache::PkgIterator Pkg = Grp.PackageList(); Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) + { + if (pams(Pkg.Arch()) == false) + continue; + Pin *P = Pins + Pkg->ID; + // the first specific stanza for a package is the ruler, + // all others need to be ignored + if (P->Type != pkgVersionMatch::None) + P = &*Unmatched.insert(Unmatched.end(),PkgPin(Pkg.FullName())); + P->Type = Type; + P->Priority = Priority; + P->Data = Data; + matched = true; + } } - if (Pkg.end() == true) + if (matched == false) { PkgPin *P = &*Unmatched.insert(Unmatched.end(),PkgPin(Name)); if (Arch.empty() == false) @@ -279,20 +296,6 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, P->Data = Data; return; } - - for (; Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) - { - Pin *P = Pins + Pkg->ID; - // the first specific stanza for a package is the ruler, - // all others need to be ignored - if (P->Type != pkgVersionMatch::None) - P = &*Unmatched.insert(Unmatched.end(),PkgPin(Pkg.FullName())); - P->Type = Type; - P->Priority = Priority; - P->Data = Data; - if (Grp.end() == true) - break; - } } /*}}}*/ // Policy::GetMatch - Get the matching version for a package pin /*{{{*/ |