summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/policy.cc40
-rw-r--r--debian/changelog3
-rwxr-xr-xtest/integration/test-pin-non-existent-package15
3 files changed, 49 insertions, 9 deletions
diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc
index 78f44d635..bd213e0ce 100644
--- a/apt-pkg/policy.cc
+++ b/apt-pkg/policy.cc
@@ -216,7 +216,14 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name,
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,23 +232,38 @@ 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;
}
- // find the package group this pin applies to
- pkgCache::GrpIterator Grp = Cache->FindGrp(Name);
- if (Grp.end() == true)
+ // 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 = &*Unmatched.insert(Unmatched.end(),PkgPin(Name));
+ 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;
}
- for (pkgCache::PkgIterator Pkg = Grp.PackageList();
- Pkg.end() != true; Pkg = Grp.NextPkg(Pkg))
+ for (; Pkg.end() != true; Pkg = Grp.NextPkg(Pkg))
{
Pin *P = Pins + Pkg->ID;
// the first specific stanza for a package is the ruler,
@@ -251,6 +273,8 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name,
P->Type = Type;
P->Priority = Priority;
P->Data = Data;
+ if (Grp.end() == true)
+ break;
}
}
/*}}}*/
diff --git a/debian/changelog b/debian/changelog
index 77b448e77..03a314679 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -17,8 +17,9 @@ apt (0.8.15.1) unstable; urgency=low
- 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:
- -- David Kalnischkies <kalnischkies@gmail.com> Wed, 29 Jun 2011 23:21:12 +0200
+ -- David Kalnischkies <kalnischkies@gmail.com> Thu, 30 Jun 2011 00:02:15 +0200
apt (0.8.15) unstable; urgency=low
diff --git a/test/integration/test-pin-non-existent-package b/test/integration/test-pin-non-existent-package
index bd6ccc476..c91e77844 100755
--- a/test/integration/test-pin-non-existent-package
+++ b/test/integration/test-pin-non-existent-package
@@ -7,6 +7,7 @@ setupenvironment
configarchitecture "i386"
insertpackage 'unstable' 'apt' 'i386' '0.8.15'
+insertpackage 'unstable' 'arch' 'i386' '1.0'
setupaptarchive
@@ -55,3 +56,17 @@ testequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist
testequal 'Reading package lists...
Building dependency tree...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade
+
+echo 'Package: arch:amd64
+Pin: release a=unstable
+Pin-Priority: -1' > rootdir/etc/apt/preferences
+
+testcandidate arch '1.0'
+
+echo '
+Package: arch:i386
+Pin: release a=unstable
+Pin-Priority: -1' >> rootdir/etc/apt/preferences
+
+testcandidate arch '(none)'
+