Просмотр исходного кода

* apt-pkg/deb/deblistparser.cc:
- add support for arch-specific qualifiers in dependencies

Thibaut Girka лет назад: 14
Родитель
Сommit
0f485ee50e
3 измененных файлов с 23 добавлено и 4 удалено
  1. 17 3
      apt-pkg/deb/deblistparser.cc
  2. 4 1
      apt-pkg/pkgcache.cc
  3. 2 0
      debian/changelog

+ 17 - 3
apt-pkg/deb/deblistparser.cc

@@ -637,16 +637,18 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver,
    if (Section.Find(Tag,Start,Stop) == false)
       return true;
 
-   string Package;
    string const pkgArch = Ver.Arch();
-   string Version;
-   unsigned int Op;
 
    while (1)
    {
+      string Package;
+      string Version;
+      unsigned int Op;
+
       Start = ParseDepends(Start,Stop,Package,Version,Op,false,!MultiArchEnabled);
       if (Start == 0)
 	 return _error->Error("Problem parsing dependency %s",Tag);
+      size_t const found = Package.rfind(':');
 
       if (MultiArchEnabled == true &&
 	  (Type == pkgCache::Dep::Conflicts ||
@@ -658,6 +660,18 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver,
 	    if (NewDepends(Ver,Package,*a,Version,Op,Type) == false)
 	       return false;
       }
+      else if (MultiArchEnabled == true && found != string::npos &&
+	       strcmp(Package.c_str() + found, ":any") != 0)
+      {
+	 string Arch = Package.substr(found+1, string::npos);
+	 Package = Package.substr(0, found);
+	 // Such dependencies are not supposed to be accepted …
+	 // … but this is probably the best thing to do.
+	 if (Arch == "native")
+	    Arch = _config->Find("APT::Architecture");
+	 if (NewDepends(Ver,Package,Arch,Version,Op,Type) == false)
+	    return false;
+      }
       else if (NewDepends(Ver,Package,pkgArch,Version,Op,Type) == false)
 	 return false;
       if (Start == Stop)

+ 4 - 1
apt-pkg/pkgcache.cc

@@ -715,7 +715,10 @@ bool pkgCache::DepIterator::IsIgnorable(PrvIterator const &Prv) const
    sometimes it is needed to identify these to ignore them… */
 bool pkgCache::DepIterator::IsMultiArchImplicit() const
 {
-   if (ParentPkg()->Arch != TargetPkg()->Arch)
+   if (ParentPkg()->Arch != TargetPkg()->Arch &&
+       (S->Type == pkgCache::Dep::Replaces ||
+	S->Type == pkgCache::Dep::DpkgBreaks ||
+	S->Type == pkgCache::Dep::Conflicts))
       return true;
    return false;
 }

+ 2 - 0
debian/changelog

@@ -70,6 +70,8 @@ apt (0.9.5.2) UNRELEASED; urgency=low
   [ Thibaut Girka ]
   * cmdline/apt-get.cc:
     - complain correctly about :any build-dep on M-A:none packages
+  * apt-pkg/deb/deblistparser.cc:
+    - add support for arch-specific qualifiers in dependencies
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Wed, 06 Jun 2012 23:54:01 +0200