[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#351056: FIX for #351056, apt always reinstalling packages because identical versions are not merged in the cache



tags 351056 + patch
thanks

This patch should fix the bug. Previously, pkgCacheGenerator::MergeList() 
would stop when it found a Version less than or equal to the one being added, 
but if the hashes didn't match at first, it would always add a new Version, 
even if there was a Version with a matching Hash. My patch loops until a 
matching Version and Hash is found *or* the new version is greater than the 
remaining old ones, which makes the second loop unnecessary.

-- 
Magnus Holmgren        holmgren@lysator.liu.se
--- apt-0.7.6/apt-pkg/pkgcachegen.cc.orig	2007-08-03 19:45:20.851846032 +0200
+++ apt-0.7.6/apt-pkg/pkgcachegen.cc	2007-08-03 21:03:13.866123155 +0200
@@ -161,17 +161,17 @@
 
       pkgCache::VerIterator Ver = Pkg.VersionList();
       map_ptrloc *LastVer = &Pkg->VersionList;
+      unsigned long Hash = List.VersionHash();
       int Res = 1;
       for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++)
       {
 	 Res = Cache.VS->CmpVersion(Version,Ver.VerStr());
-	 if (Res >= 0)
+         if (Res > 0 || (Res == 0 && Ver->Hash == Hash))
 	    break;
       }
       
       /* We already have a version for this item, record that we
          saw it */
-      unsigned long Hash = List.VersionHash();
       if (Res == 0 && Ver->Hash == Hash)
       {
 	 if (List.UsePackage(Pkg,Ver) == false)
@@ -193,17 +193,6 @@
 	 continue;
       }      
 
-      // Skip to the end of the same version set.
-      if (Res == 0)
-      {
-	 for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++)
-	 {
-	    Res = Cache.VS->CmpVersion(Version,Ver.VerStr());
-	    if (Res != 0)
-	       break;
-	 }
-      }
-
       // Add a new version
       *LastVer = NewVersion(Ver,Version,*LastVer);
       Ver->ParentPkg = Pkg.Index();

Attachment: pgpc8gChBjE67.pgp
Description: PGP signature


Reply to: