diff --git a/remotefilelog/repack.py b/remotefilelog/repack.py --- a/remotefilelog/repack.py +++ b/remotefilelog/repack.py @@ -616,19 +616,23 @@ # TODO: Optimize the deltachain fetching. Since we're # iterating over the different version of the file, we may # be fetching the same deltachain over and over again. - # TODO: reuse existing deltas if it matches our deltabase + meta = None if deltabase != nullid: - deltabasetext = self.data.get(filename, deltabase) - original = self.data.get(filename, node) - size = len(original) - delta = mdiff.textdiff(deltabasetext, original) + deltaentry = self.data.getdelta(filename, node) + delta, deltabasename, origdeltabase, meta = deltaentry + size = meta.get(constants.METAKEYSIZE) + if (deltabasename != filename or origdeltabase != deltabase + or size is None): + deltabasetext = self.data.get(filename, deltabase) + original = self.data.get(filename, node) + size = len(original) + delta = mdiff.textdiff(deltabasetext, original) else: delta = self.data.get(filename, node) size = len(delta) + meta = self.data.getmeta(filename, node) # TODO: don't use the delta if it's larger than the fulltext - # TODO: don't use the delta if the chain is already long - meta = self.data.getmeta(filename, node) if constants.METAKEYSIZE not in meta: meta[constants.METAKEYSIZE] = size target.add(filename, node, deltabase, delta, meta) diff --git a/tests/test-remotefilelog-repack.t b/tests/test-remotefilelog-repack.t --- a/tests/test-remotefilelog-repack.t +++ b/tests/test-remotefilelog-repack.t @@ -454,3 +454,30 @@ $ hg repack --incremental --debug --config packs.maxpacksize=512 removing oversize packfile $TESTTMP/hgcache/master/packs/a2731c9a16403457b67337a620931797fce8c821.datapack (365 bytes) removing oversize packfile $TESTTMP/hgcache/master/packs/a2731c9a16403457b67337a620931797fce8c821.dataidx (1.21 KB) + +Do a repack where the new pack reuses a delta from the old pack + $ clearcache + $ hg prefetch -r '2::3' + 2 files fetched over 1 fetches - (0 misses, 100.00% hit ratio) over * (glob) + $ hg repack + $ hg debugdatapack $CACHEDIR/master/packs/*.datapack + $TESTTMP/hgcache/master/packs/abf210f6c3aa4dd0ecc7033633ad73591be16c95: + x: + Node Delta Base Delta Length Blob Size + 1bb2e6237e03 000000000000 8 8 + d4a3ed9310e5 1bb2e6237e03 12 6 + + Total: 20 14 (42.9% bigger) + $ hg prefetch -r '0::1' + 2 files fetched over 1 fetches - (0 misses, 100.00% hit ratio) over * (glob) + $ hg repack + $ hg debugdatapack $CACHEDIR/master/packs/*.datapack + $TESTTMP/hgcache/master/packs/09b8bf49256b3fc2175977ba97d6402e91a9a604: + x: + Node Delta Base Delta Length Blob Size + 1bb2e6237e03 000000000000 8 8 + d4a3ed9310e5 1bb2e6237e03 12 6 + aee31534993a d4a3ed9310e5 12 4 + 1406e7411862 aee31534993a 12 2 + + Total: 44 20 (120.0% bigger)