diff options
author | Christopher Baines <cbaines8@gmail.com> | 2011-07-05 13:28:22 +0100 |
---|---|---|
committer | Christopher Baines <cbaines8@gmail.com> | 2011-07-05 13:28:22 +0100 |
commit | eef7133842d6fe5847daa0ab4846b5e8be892d61 (patch) | |
tree | 7e79b1374c1db5f9b4c02b8d05393e61e3e6cf7b /apt-pkg/policy.cc | |
parent | 2a5ca0006bad04956141f3180dd8e6b6d7fdf731 (diff) | |
parent | 8d0303273495fc478ae62570ecf1675942cfbc41 (diff) |
[ David Kalnischkies ]
* doc/makefile:
- create doxygen directory to avoid depending on magic (Closes: #628799)
* cmdline/apt-key:
- explicitly state that net-update is not supported if no url is set
- require to be root for add, rm, update and net-update
- clarify update vs. net-update in different distros (Closes: #632043)
* debian/apt.symbols:
- forgot 'mips' in the list for all architecture dependent symbols
- comment out gcc-4.5 specific symbols as gcc-4.6 is now default
- the symbol for PrintStatus() is architecture dependent
* apt-pkg/policy.cc:
- do not segfault in pinning if a package with this name doesn't exist.
Thanks to Ferdinand Thommes for the report!
- Defaults is a vector of Pin not of PkgPin
- ensure that only the first specific stanza for a package is used
- save all stanzas which had no effect in Unmatched
- allow package:architecure in Package:
- remove invalid pkgcache.bin and rebuild it if possible
- log reinstall commands in history.log
* apt-pkg/init.cc:
- don't set deprecated APT::Acquire::Translation, thanks Jörg Sommer!
* cmdline/apt-config.cc:
- show Acquire::Languages and APT::Architectures settings
in 'dump' (Closes: 626739)
* apt-pkg/orderlist.cc:
- ensure that an old version of a package with a provides can
never satisfy a dependency of a newer version of this package
[ Michael Vogt ]
* methods/mirror.cc:
- ignore lines starting with "#" in the mirror file
- ignore non http urls in the mirrors
- append the dist (e.g. sid, wheezy) as a query string when
asking for a suitable mirror
* apt-pkg/deb/deblistparser.cc:
- include all known languages when building the apt cache
(LP: #794907)
* apt-pkg/deb/debindexfile.cc:
- remove some no longer valid checks for "TranslationsAvailable()"
[ Kenneth Solbø Andersen ]
* apt-pkg/deb/dpkgpm.cc:
- set permissions of term.log to root.adm and 644 (LP: #404724)
[ Chris Leick ]
* various typo and syntax corrections in doc/*.xml
[Chris Baines]
* Began to fix DepAdd for imediate configuration of all packages
Diffstat (limited to 'apt-pkg/policy.cc')
-rw-r--r-- | apt-pkg/policy.cc | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 2cc2e5e39..bd213e0ce 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -210,13 +210,20 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, { if (Name.empty() == true) { - Pin *P = &*Defaults.insert(Defaults.end(),PkgPin()); + Pin *P = &*Defaults.insert(Defaults.end(),Pin()); P->Type = Type; P->Priority = Priority; P->Data = Data; return; } - + + size_t found = Name.rfind(':'); + string Arch; + if (found != string::npos) { + Arch = Name.substr(found+1); + Name.erase(found); + } + // Allow pinning by wildcards // TODO: Maybe we should always prefer specific pins over non- // specific ones. @@ -225,32 +232,49 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, pkgVersionMatch match(Data, Type); for (pkgCache::GrpIterator G = Cache->GrpBegin(); G.end() != true; ++G) if (match.ExpressionMatches(Name, G.Name())) - CreatePin(Type, G.Name(), Data, Priority); + { + if (Arch.empty() == false) + CreatePin(Type, string(G.Name()).append(":").append(Arch), Data, Priority); + else + CreatePin(Type, G.Name(), Data, Priority); + } return; } - // Get a spot to put the pin - pkgCache::GrpIterator Grp = Cache->FindGrp(Name); - for (pkgCache::PkgIterator Pkg = Grp.PackageList(); - Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) + // 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(); + } + + if (Pkg.end() == true) { - Pin *P = 0; - if (Pkg.end() == false) - P = Pins + Pkg->ID; - else - { - // Check the unmatched table - for (vector<PkgPin>::iterator I = Unmatched.begin(); - I != Unmatched.end() && P == 0; I++) - if (I->Pkg == Name) - P = &*I; + PkgPin *P = &*Unmatched.insert(Unmatched.end(),PkgPin(Name)); + if (Arch.empty() == false) + P->Pkg.append(":").append(Arch); + P->Type = Type; + P->Priority = Priority; + P->Data = Data; + return; + } - if (P == 0) - P = &*Unmatched.insert(Unmatched.end(),PkgPin()); - } + 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; } } /*}}}*/ |