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

Sune Foldager cryo at cyanite.org
Wed May 4 16:42:08 CDT 2011


# HG changeset patch
# User Sune Foldager <cryo at cyanite.org>
# Date 1304544519 -7200
# Node ID 39f6e0127ff15c5ad82b989d387402ec83ea30d4
# Parent  be4a52cc2fe9b982dbec4a44809481e41b9cbe29
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 --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -325,7 +325,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):
@@ -867,7 +872,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:
@@ -879,7 +883,7 @@
         index = self.index # for performance
         iterrev = rev
         e = index[iterrev]
-        while iterrev != base and iterrev != cachedrev:
+        while iterrev != e[3] and iterrev != cachedrev:
             chain.append(iterrev)
             if e[0] & REVIDX_PARENTDELTA:
                 iterrev = e[5]


More information about the Mercurial-devel mailing list