[PATCH 2 of 3] revlog: calculate base revisions iteratively

Sune Foldager cryo at cyanite.org
Thu May 5 06:18:49 CDT 2011


# HG changeset patch
# User Sune Foldager <cryo at cyanite.org>
# Date 1304593827 -7200
# Node ID 9c8d70e38372c2a67519d7e2804977803a81eaf1
# Parent  35473c8ce1e85917561a64f6621b1024d85aa97c
revlog: calculate base revisions iteratively

This is in preparation for generaldelta, where the revlog entry base field
is reinterpreted as the deltaparent.

Performance is virtually unchanged, as there can be at most two iterations.

diff -r 35473c8ce1e8 -r 9c8d70e38372 mercurial/revlog.py
--- a/mercurial/revlog.py	Thu May 05 12:26:03 2011 +0200
+++ b/mercurial/revlog.py	Thu May 05 13:10:27 2011 +0200
@@ -320,7 +320,12 @@
     def length(self, rev):
         return self.index[rev][1]
     def base(self, rev):
-        return self.index[rev][3]
+        index = self.index
+        e = index[rev]
+        while e[3] != rev:
+            rev = e[3]
+            e = index[rev]
+        return rev
     def flags(self, rev):
         return self.index[rev][0] & 0xFFFF
     def rawsize(self, rev):
@@ -859,7 +864,6 @@
         # look up what we need to read
         text = None
         rev = self.rev(node)
-        base = self.base(rev)
 
         # check rev flags
         if self.flags(rev) & ~REVIDX_KNOWN_FLAGS:
@@ -868,10 +872,13 @@
 
         # build delta chain
         chain = []
+        index = self.index # for performance
         iterrev = rev
-        while iterrev != base and iterrev != cachedrev:
+        e = index[iterrev]
+        while iterrev != e[3] and iterrev != cachedrev:
             chain.append(iterrev)
             iterrev -= 1
+            e = index[iterrev]
         chain.reverse()
         base = iterrev
 


More information about the Mercurial-devel mailing list