[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