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: