Browse Source

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

David Kalnischkies 13 years ago
parent
commit
9c44383f2e
3 changed files with 36 additions and 26 deletions
  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();
 	       pkgCache::VerIterator ConVersion = D.ParentVer();
 	       Dynamic<pkgCache::VerIterator> DynV(ConVersion);
 	       Dynamic<pkgCache::VerIterator> DynV(ConVersion);
 	       // duplicate the Conflicts/Breaks/Replaces for :none arch
 	       // 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);
    bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
    pkgCache::PkgIterator D = G.PackageList();
    pkgCache::PkgIterator D = G.PackageList();
    Dynamic<pkgCache::PkgIterator> DynD(D);
    Dynamic<pkgCache::PkgIterator> DynD(D);
+   map_ptrloc const VerStrIdx = V->VerStr;
    for (; D.end() != true; D = G.NextPkg(D))
    for (; D.end() != true; D = G.NextPkg(D))
    {
    {
       if (Arch == D.Arch() || D->VersionList == 0)
       if (Arch == D.Arch() || D->VersionList == 0)
@@ -681,16 +679,16 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::GrpIterator &G,
       if (coInstall == true)
       if (coInstall == true)
       {
       {
 	 // Replaces: ${self}:other ( << ${binary:Version})
 	 // Replaces: ${self}:other ( << ${binary:Version})
-	 NewDepends(D, V, V.VerStr(),
+	 NewDepends(D, V, VerStrIdx,
 		    pkgCache::Dep::Less, pkgCache::Dep::Replaces,
 		    pkgCache::Dep::Less, pkgCache::Dep::Replaces,
 		    OldDepLast);
 		    OldDepLast);
 	 // Breaks: ${self}:other (!= ${binary:Version})
 	 // Breaks: ${self}:other (!= ${binary:Version})
-	 NewDepends(D, V, V.VerStr(),
+	 NewDepends(D, V, VerStrIdx,
 		    pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 		    pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 		    OldDepLast);
 		    OldDepLast);
       } else {
       } else {
 	 // Conflicts: ${self}:other
 	 // Conflicts: ${self}:other
-	 NewDepends(D, V, "",
+	 NewDepends(D, V, 0,
 		    pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
 		    pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
 		    OldDepLast);
 		    OldDepLast);
       }
       }
@@ -707,17 +705,18 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::VerIterator &V,
    bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
    bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
    if (coInstall == true)
    if (coInstall == true)
    {
    {
+      map_ptrloc const VerStrIdx = V->VerStr;
       // Replaces: ${self}:other ( << ${binary:Version})
       // Replaces: ${self}:other ( << ${binary:Version})
-      NewDepends(D, V, V.VerStr(),
+      NewDepends(D, V, VerStrIdx,
 		 pkgCache::Dep::Less, pkgCache::Dep::Replaces,
 		 pkgCache::Dep::Less, pkgCache::Dep::Replaces,
 		 OldDepLast);
 		 OldDepLast);
       // Breaks: ${self}:other (!= ${binary:Version})
       // Breaks: ${self}:other (!= ${binary:Version})
-      NewDepends(D, V, V.VerStr(),
+      NewDepends(D, V, VerStrIdx,
 		 pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 		 pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 		 OldDepLast);
 		 OldDepLast);
    } else {
    } else {
       // Conflicts: ${self}:other
       // Conflicts: ${self}:other
-      NewDepends(D, V, "",
+      NewDepends(D, V, 0,
 		 pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
 		 pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
 		 OldDepLast);
 		 OldDepLast);
    }
    }
@@ -861,35 +860,41 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
 				   unsigned int const &Op,
 				   unsigned int const &Op,
 				   unsigned int const &Type,
 				   unsigned int const &Type,
 				   map_ptrloc* &OldDepLast)
 				   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();
    void const * const oldMap = Map.Data();
    // Get a structure
    // Get a structure
    map_ptrloc const Dependency = AllocateInMap(sizeof(pkgCache::Dependency));
    map_ptrloc const Dependency = AllocateInMap(sizeof(pkgCache::Dependency));
    if (unlikely(Dependency == 0))
    if (unlikely(Dependency == 0))
       return false;
       return false;
-   
+
    // Fill it in
    // Fill it in
    pkgCache::DepIterator Dep(Cache,Cache.DepP + Dependency);
    pkgCache::DepIterator Dep(Cache,Cache.DepP + Dependency);
    Dynamic<pkgCache::DepIterator> DynDep(Dep);
    Dynamic<pkgCache::DepIterator> DynDep(Dep);
    Dep->ParentVer = Ver.Index();
    Dep->ParentVer = Ver.Index();
    Dep->Type = Type;
    Dep->Type = Type;
    Dep->CompareOp = Op;
    Dep->CompareOp = Op;
+   Dep->Version = Version;
    Dep->ID = Cache.HeaderP->DependsCount++;
    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
    // Link it to the package
    Dep->Package = Pkg.Index();
    Dep->Package = Pkg.Index();
    Dep->NextRevDepends = Pkg->RevDepends;
    Dep->NextRevDepends = Pkg->RevDepends;

+ 3 - 0
apt-pkg/pkgcachegen.h

@@ -77,6 +77,9 @@ class pkgCacheGenerator							/*{{{*/
    bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
    bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
 		   std::string const &Version, unsigned int const &Op,
 		   std::string const &Version, unsigned int const &Op,
 		   unsigned int const &Type, map_ptrloc* &OldDepLast);
 		   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);
    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);
    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
     - 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
       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
     - 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
  -- David Kalnischkies <kalnischkies@gmail.com>  Sun, 10 Mar 2013 12:23:24 +0100