Foreign Versions add an implicit Provides to the other packages in the group
authorDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 10 Feb 2010 21:45:58 +0000 (22:45 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 10 Feb 2010 21:45:58 +0000 (22:45 +0100)
apt-pkg/deb/deblistparser.cc
apt-pkg/pkgcachegen.cc
apt-pkg/pkgcachegen.h

index 26841d3..b6082cd 100644 (file)
@@ -618,29 +618,46 @@ bool debListParser::ParseProvides(pkgCache::VerIterator Ver)
 {
    const char *Start;
    const char *Stop;
-   if (Section.Find("Provides",Start,Stop) == false)
-      return true;
-   
-   string Package;
-   string Version;
-   unsigned int Op;
-
-   while (1)
+   if (Section.Find("Provides",Start,Stop) == true)
    {
-      Start = ParseDepends(Start,Stop,Package,Version,Op);
-      if (Start == 0)
-        return _error->Error("Problem parsing Provides line");
-      if (Op != pkgCache::Dep::NoOp) {
-        _error->Warning("Ignoring Provides line with DepCompareOp for package %s", Package.c_str());
-      } else {
-        if (NewProvides(Ver,Package,Version) == false)
-           return false;
+      string Package;
+      string Version;
+      string const Arch = Ver.Arch();
+      unsigned int Op;
+
+      while (1)
+      {
+        Start = ParseDepends(Start,Stop,Package,Version,Op);
+        if (Start == 0)
+           return _error->Error("Problem parsing Provides line");
+        if (Op != pkgCache::Dep::NoOp) {
+           _error->Warning("Ignoring Provides line with DepCompareOp for package %s", Package.c_str());
+        } else {
+           if (NewProvides(Ver, Package, Arch, Version) == false)
+              return false;
+        }
+
+        if (Start == Stop)
+           break;
       }
+   }
 
-      if (Start == Stop)
-        break;
+   if (Ver->MultiArch != pkgCache::Version::Foreign)
+      return true;
+
+   std::vector<string> const archs = APT::Configuration::getArchitectures();
+   if (archs.size() <= 1)
+      return true;
+
+   string const Package = Ver.ParentPkg().Name();
+   string const Version = Ver.VerStr();
+   for (std::vector<string>::const_iterator a = archs.begin();
+       a != archs.end(); ++a)
+   {
+      if (NewProvides(Ver, Package, *a, Version) == false)
+        return false;
    }
-   
+
    return true;
 }
                                                                        /*}}}*/
index 037c0cb..ebda325 100644 (file)
@@ -668,13 +668,14 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
 // ---------------------------------------------------------------------
 /* */
 bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver,
-                                               const string &PackageName,
+                                               const string &PkgName,
+                                               const string &PkgArch,
                                                const string &Version)
 {
    pkgCache &Cache = Owner->Cache;
 
    // We do not add self referencing provides
-   if (unlikely(Ver.ParentPkg().Name() == PackageName))
+   if (Ver.ParentPkg().Name() == PkgName && PkgArch == Ver.Arch())
       return true;
    
    // Get a structure
@@ -693,7 +694,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver,
    
    // Locate the target package
    pkgCache::PkgIterator Pkg;
-   if (unlikely(Owner->NewPackage(Pkg,PackageName,string(Ver.Arch())) == false))
+   if (unlikely(Owner->NewPackage(Pkg,PkgName, PkgArch) == false))
       return false;
    
    // Link it to the package
index ca5d74a..46d0cd8 100644 (file)
@@ -104,8 +104,8 @@ class pkgCacheGenerator::ListParser
    bool NewDepends(pkgCache::VerIterator Ver,const string &Package, const string &Arch,
                   const string &Version,unsigned int Op,
                   unsigned int Type);
-   bool NewProvides(pkgCache::VerIterator Ver,const string &Package,
-                   const string &Version);
+   bool NewProvides(pkgCache::VerIterator Ver,const string &PkgName,
+                   const string &PkgArch, const string &Version);
    
    public: