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

Bug#545699: apt: please allow Packages.diff code to skip the last patch



Package: apt
Version: 0.7.23.1
Severity: wishlist
Tags: patch

Merging the patches in Packages.diff gives significant improvements
both in data to be downloaded and in overhead by downloading less files.

While apt currently supports skipping patches in the middle of the
stack, it currently assumes the very last patch is applied
(and fails if that is not the case), if any patch is to be applied
at all.

As official Debian repositories do not merge patches, I've set
severity to wishlist.

Attached is a patch that fixes that problem for me.

Hochachtungsvoll,
	Bernhard R. Link
=== modified file 'apt-pkg/acquire-item.cc'
--- apt-pkg/acquire-item.cc	2009-08-28 19:07:55 +0000
+++ apt-pkg/acquire-item.cc	2009-09-08 12:50:05 +0000
@@ -274,7 +274,7 @@
 	 if(last_space != string::npos)
 	    Description.erase(last_space, Description.size()-last_space);
 	 new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc,
-			      ExpectedHash, available_patches);
+			      ExpectedHash, ServerSha1, available_patches);
 	 Complete = false;
 	 Status = StatDone;
 	 Dequeue();
@@ -342,9 +342,10 @@
 pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner,
 				   string URI,string URIDesc,string ShortDesc,
 				   HashString ExpectedHash, 
+				   string ServerSha1,
 				   vector<DiffInfo> diffs)
    : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash), 
-     available_patches(diffs)
+     available_patches(diffs), ServerSha1(ServerSha1)
 {
    
    DestFile = _config->FindDir("Dir::State::lists") + "partial/";
@@ -430,6 +431,13 @@
       std::clog << "QueueNextDiff: " 
 		<< FinalFile << " (" << local_sha1 << ")"<<std::endl;
 
+   // final file reached before all patches are applied
+   if(local_sha1 == ServerSha1)
+   {
+      Finish(true);
+      return true;
+   }
+
    // remove all patches until the next matching patch is found
    // this requires the Index file to be ordered
    for(vector<DiffInfo>::iterator I=available_patches.begin();
@@ -527,7 +535,7 @@
       // see if there is more to download
       if(available_patches.size() > 0) {
 	 new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc,
-			      ExpectedHash, available_patches);
+			      ExpectedHash, ServerSha1, available_patches);
 	 return Finish();
       } else 
 	 return Finish(true);

=== modified file 'apt-pkg/acquire-item.h'
--- apt-pkg/acquire-item.h	2009-08-11 22:52:26 +0000
+++ apt-pkg/acquire-item.h	2009-09-08 12:30:11 +0000
@@ -422,6 +422,10 @@
     *  off the front?
     */
    vector<DiffInfo> available_patches;
+
+   /** Stop applying patches when reaching that sha1 */
+   string ServerSha1;
+
    /** The current status of this patch. */
    enum DiffState
      {
@@ -475,6 +479,7 @@
     */
    pkgAcqIndexDiffs(pkgAcquire *Owner,string URI,string URIDesc,
 		    string ShortDesc, HashString ExpectedHash,
+		    string ServerSha1,
 		    vector<DiffInfo> diffs=vector<DiffInfo>());
 };
 									/*}}}*/


Reply to: