]> git.saurik.com Git - apt.git/commitdiff
allow package:architecure in Package:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 29 Jun 2011 22:03:26 +0000 (00:03 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 29 Jun 2011 22:03:26 +0000 (00:03 +0200)
apt-pkg/policy.cc
debian/changelog
test/integration/test-pin-non-existent-package

index 78f44d635619e1ca50c10aca94ef500610958df1..bd213e0ce59f0a47b8a0fba056652efe7b381ebb 100644 (file)
@@ -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;
    }
 }
                                                                        /*}}}*/
index 77b448e77158a25138376a19e41f034586add301..03a31467991952eb8d348d7f78d7054e5cbc487f 100644 (file)
@@ -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
 
index bd6ccc4769f6867dca4c0bca9bacabca5924573d..c91e778442ca6c0ef5a19bee94f97d9f50c7474a 100755 (executable)
@@ -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)'
+