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

factor version string creation out of NewDepends, so we can easily reuse
version strings e.g. for implicit multi-arch dependencies

David Kalnischkies лет назад: 13
Родитель
Сommit
9c44383f2e
3 измененных файлов с 36 добавлено и 26 удалено
  1. 31 26
      apt-pkg/pkgcachegen.cc
  2. 3 0
      apt-pkg/pkgcachegen.h
  3. 2 0
      debian/changelog

+ 31 - 26
apt-pkg/pkgcachegen.cc

@@ -463,11 +463,8 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
 	       pkgCache::VerIterator ConVersion = D.ParentVer();
 	       Dynamic<pkgCache::VerIterator> DynV(ConVersion);
 	       // duplicate the Conflicts/Breaks/Replaces for :none arch
-	       if (D->Version == 0)
-		  NewDepends(Pkg, ConVersion, "", 0, D->Type, OldDepLast);
-	       else
-		  NewDepends(Pkg, ConVersion, D.TargetVer(),
-			     D->CompareOp, D->Type, OldDepLast);
+	       NewDepends(Pkg, ConVersion, D->Version,
+		     D->CompareOp, D->Type, OldDepLast);
 	    }
 	 }
       }
@@ -671,6 +668,7 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::GrpIterator &G,
    bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
    pkgCache::PkgIterator D = G.PackageList();
    Dynamic<pkgCache::PkgIterator> DynD(D);
+   map_ptrloc const VerStrIdx = V->VerStr;
    for (; D.end() != true; D = G.NextPkg(D))
    {
       if (Arch == D.Arch() || D->VersionList == 0)
@@ -681,16 +679,16 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::GrpIterator &G,
       if (coInstall == true)
       {
 	 // Replaces: ${self}:other ( << ${binary:Version})
-	 NewDepends(D, V, V.VerStr(),
+	 NewDepends(D, V, VerStrIdx,
 		    pkgCache::Dep::Less, pkgCache::Dep::Replaces,
 		    OldDepLast);
 	 // Breaks: ${self}:other (!= ${binary:Version})
-	 NewDepends(D, V, V.VerStr(),
+	 NewDepends(D, V, VerStrIdx,
 		    pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 		    OldDepLast);
       } else {
 	 // Conflicts: ${self}:other
-	 NewDepends(D, V, "",
+	 NewDepends(D, V, 0,
 		    pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
 		    OldDepLast);
       }
@@ -707,17 +705,18 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::VerIterator &V,
    bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
    if (coInstall == true)
    {
+      map_ptrloc const VerStrIdx = V->VerStr;
       // Replaces: ${self}:other ( << ${binary:Version})
-      NewDepends(D, V, V.VerStr(),
+      NewDepends(D, V, VerStrIdx,
 		 pkgCache::Dep::Less, pkgCache::Dep::Replaces,
 		 OldDepLast);
       // Breaks: ${self}:other (!= ${binary:Version})
-      NewDepends(D, V, V.VerStr(),
+      NewDepends(D, V, VerStrIdx,
 		 pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 		 OldDepLast);
    } else {
       // Conflicts: ${self}:other
-      NewDepends(D, V, "",
+      NewDepends(D, V, 0,
 		 pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
 		 OldDepLast);
    }
@@ -861,35 +860,41 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
 				   unsigned int const &Op,
 				   unsigned int const &Type,
 				   map_ptrloc* &OldDepLast)
+{
+   map_ptrloc index = 0;
+   if (Version.empty() == false)
+   {
+      void const * const oldMap = Map.Data();
+      index = WriteStringInMap(Version);
+      if (unlikely(index == 0))
+	 return false;
+      if (oldMap != Map.Data())
+	 OldDepLast += (map_ptrloc*) Map.Data() - (map_ptrloc*) oldMap;
+   }
+   return NewDepends(Pkg, Ver, index, Op, Type, OldDepLast);
+}
+bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
+				   pkgCache::VerIterator &Ver,
+				   map_ptrloc const Version,
+				   unsigned int const &Op,
+				   unsigned int const &Type,
+				   map_ptrloc* &OldDepLast)
 {
    void const * const oldMap = Map.Data();
    // Get a structure
    map_ptrloc const Dependency = AllocateInMap(sizeof(pkgCache::Dependency));
    if (unlikely(Dependency == 0))
       return false;
-   
+
    // Fill it in
    pkgCache::DepIterator Dep(Cache,Cache.DepP + Dependency);
    Dynamic<pkgCache::DepIterator> DynDep(Dep);
    Dep->ParentVer = Ver.Index();
    Dep->Type = Type;
    Dep->CompareOp = Op;
+   Dep->Version = Version;
    Dep->ID = Cache.HeaderP->DependsCount++;
 
-   // Probe the reverse dependency list for a version string that matches
-   if (Version.empty() == false)
-   {
-/*      for (pkgCache::DepIterator I = Pkg.RevDependsList(); I.end() == false; I++)
-	 if (I->Version != 0 && I.TargetVer() == Version)
-	    Dep->Version = I->Version;*/
-      if (Dep->Version == 0) {
-	 map_ptrloc const index = WriteStringInMap(Version);
-	 if (unlikely(index == 0))
-	    return false;
-	 Dep->Version = index;
-      }
-   }
-
    // Link it to the package
    Dep->Package = Pkg.Index();
    Dep->NextRevDepends = Pkg->RevDepends;

+ 3 - 0
apt-pkg/pkgcachegen.h

@@ -77,6 +77,9 @@ class pkgCacheGenerator							/*{{{*/
    bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
 		   std::string const &Version, unsigned int const &Op,
 		   unsigned int const &Type, map_ptrloc* &OldDepLast);
+   bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
+		   map_ptrloc const Version, unsigned int const &Op,
+		   unsigned int const &Type, map_ptrloc* &OldDepLast);
    unsigned long NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,unsigned long Next);
    map_ptrloc NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang,const MD5SumValue &md5sum,map_ptrloc Next);
 

+ 2 - 0
debian/changelog

@@ -6,6 +6,8 @@ apt (0.9.7.8~exp2+nmu1) UNRELEASED; urgency=low
     - do not store the MD5Sum for every description language variant as
       it will be the same for all so it can be shared to save cache space
     - handle language tags for descriptions are unique strings to be shared
+    - factor version string creation out of NewDepends, so we can easily reuse
+      version strings e.g. for implicit multi-arch dependencies
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Sun, 10 Mar 2013 12:23:24 +0100