[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