[PATCH 03 of 10] introduced revlog._revision() to allow filelog easily redefine some logic

Sune Foldager cryo at cyanite.org
Wed Sep 8 14:48:16 CDT 2010


# HG changeset patch
# User Sune Foldager <sune.foldager at edlund.dk>
# Date 1282639644 -7200
# Node ID ec0c92bf0202b823a24c9ae5f3f7bd1f16f224cd
# Parent  535a7795f14b5a3ded71009aa06fa46498770d80
introduced revlog._revision() to allow filelog easily redefine some logic

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -1033,26 +1033,35 @@
 
     def revision(self, node):
         """return an uncompressed revision of a given node"""
-        cachedrev = None
         if node == nullid:
             return ""
-        if self._cache:
-            if self._cache[0] == node:
-                return self._cache[2]
-            cachedrev = self._cache[1]
+        if self._cache and self._cache[0] == node:
+            return self._cache[2]
 
         # 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:
             raise RevlogError(_('incompatible revision flag %x') %
                               (self.flags(rev) & ~REVIDX_KNOWN_FLAGS))
 
+        text = self._revision(rev)
+
+        p1, p2 = self.parents(node)
+        if (node != hash(text, p1, p2) and
+            not (self.flags(rev) & REVIDX_PUNCHED_FLAG)):
+            raise RevlogError(_("integrity check failed on %s:%d")
+                              % (self.indexfile, rev))
+
+        self._cache = (node, rev, text)
+        return text
+
+    def _revision(self, rev):
         # build delta chain
+        base = self.base(rev)
         self._loadindex(base, rev + 1)
+        cachedrev = self._cache and self._cache[1] or None
         chain = []
         index = self.index # for performance
         iterrev = rev
@@ -1066,10 +1075,12 @@
             e = index[iterrev]
         chain.reverse()
         base = iterrev
-
+        
         if iterrev == cachedrev:
             # cache hit
             text = self._cache[2]
+        else:
+            text = None
 
         # drop cache to save memory
         self._cache = None
@@ -1080,13 +1091,6 @@
 
         bins = [self._chunk(r) for r in chain]
         text = mdiff.patches(text, bins)
-        p1, p2 = self.parents(node)
-        if (node != hash(text, p1, p2) and
-            not (self.flags(rev) & REVIDX_PUNCHED_FLAG)):
-            raise RevlogError(_("integrity check failed on %s:%d")
-                              % (self.indexfile, rev))
-
-        self._cache = (node, rev, text)
         return text
 
     def checkinlinesize(self, tr, fp=None):


More information about the Mercurial-devel mailing list