[PATCH 4 of 4 RFC] revlog: support for compressing single revisions reusing zlib stream

Wagner Bruna wagner.bruna+mercurial at gmail.com
Mon Feb 8 17:20:51 CST 2010


# HG changeset patch
# User Wagner Bruna <wbruna at softwareexpress.com.br>
# Date 1265662433 7200
# Node ID 6740ac498dfe2f950ae5b1c8ed510827ce5ff47a
# Parent  7d83e89bc4d623bc7fa6fe362d7f93e7d355df60
revlog: support for compressing single revisions reusing zlib stream

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -444,6 +444,7 @@
         self._chunkcache = (0, '')
         # base, rev, compression object, decompressed data
         self._chunkdecompr = [-1, None, None, '']
+        self._chunkcompr = [-1, None, None]
         self.nodemap = {nullid: nullrev}
         self.index = []
 
@@ -1127,14 +1128,19 @@
             if not d:
                 ptext = self.revision(self.node(prev))
                 d = mdiff.textdiff(ptext, text)
-            data = compress(d)
+            if self._chunkcompr[:2] == [base, prev]:
+                self._chunkcompr[1] = curr
+                data = compress(d, self._chunkcompr[2])
+            else:
+                data = compress(d)
             l = len(data[1]) + len(data[0])
             dist = l + offset - self.start(base)
 
         # full versions are inserted when the needed deltas
         # become comparable to the uncompressed text
         if not curr or dist > len(text) * 2:
-            data = compress(text)
+            self._chunkcompr = [curr, curr, zlib.compressobj()]
+            data = compress(text, self._chunkcompr[2])
             l = len(data[1]) + len(data[0])
             base = curr
 


More information about the Mercurial-devel mailing list