[PATCH 2 of 4 RFC] revlog: support for decompressing chunks reusing the zlib stream
Wagner Bruna
wagner.bruna+mercurial at gmail.com
Mon Feb 8 17:20:49 CST 2010
# HG changeset patch
# User Wagner Bruna <wbruna at softwareexpress.com.br>
# Date 1265662309 7200
# Node ID a4e7b83470e475f4cc37d1f9a2fe1187d0a86fcf
# Parent 6b70e182505a7a863b2931ee9b7f96e1a0d089cc
revlog: support for decompressing chunks reusing the zlib stream
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -442,6 +442,8 @@
self.opener = opener
self._cache = None
self._chunkcache = (0, '')
+ # base, rev, compression object, decompressed data
+ self._chunkdecompr = [-1, None, None, '']
self.nodemap = {nullid: nullrev}
self.index = []
@@ -992,7 +994,17 @@
return self._getchunk(start, length)
def _chunk(self, rev):
- return decompress(self._chunkraw(rev, rev))
+ zc = self._chunkraw(rev, rev)
+ if zc.startswith('z'):
+ base = self.base(rev)
+ if self._chunkdecompr[0] != self.base(rev) or self._chunkdecompr[1] >= rev:
+ self._chunkdecompr = [base, base-1, zlib.decompressobj(), '']
+ for r in xrange(self._chunkdecompr[1]+1, rev+1):
+ self._chunkdecompr[1] = r
+ deco = decompress(self._chunkraw(r, r), self._chunkdecompr[2])
+ self._chunkdecompr[3] = deco
+ return self._chunkdecompr[3]
+ return decompress(zc)
def _chunkclear(self):
self._chunkcache = (0, '')
More information about the Mercurial-devel
mailing list