diff options
author | Michael Vogt <mvo@ubuntu.com> | 2012-12-26 23:52:47 +0100 |
---|---|---|
committer | Michael Vogt <mvo@ubuntu.com> | 2012-12-26 23:52:47 +0100 |
commit | d2cca6ec46865a1f5167f846e67150dc19ca2022 (patch) | |
tree | 43d335f69870a72b97fa41a1b208784b8753d354 /apt-pkg/policy.cc | |
parent | 7735ad0500b6fefef03b2a3dc2a6843e82353e94 (diff) | |
parent | d663a4c8a8723ae4936d10d0a98ea2c05a29cbc4 (diff) |
merged from the debian-sid branch
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 /*{{{*/ |