# HG changeset patch # User Matt Mackall # Date 1281932036 18000 # Node ID 927ada259634b99e548f014bd5bd4972db9b2d00 # Parent cf858e76e992d31a119e954bdf3794110a5aa7a4 revlog: optimize deltachain diff -r cf858e76e992 -r 927ada259634 mercurial/revlog.py --- a/mercurial/revlog.py Tue Aug 10 22:28:52 2010 +0530 +++ b/mercurial/revlog.py Sun Aug 15 23:13:56 2010 -0500 @@ -23,6 +23,8 @@ _decompress = zlib.decompress _sha = util.sha1 +_cached, _uncached = 0, 0 + # revlog header flags REVLOGV0 = 0 REVLOGNG = 1 @@ -1030,9 +1032,15 @@ """return chain of revisions to construct a given revision""" chain = [] check = False - while self.base(rev) != rev and rev != cache: + index = self.index + e = index[rev] + while rev != e[3] and rev != cache: chain.append(rev) - rev = self.deltaparent(rev) + if e[0] & REVIDX_PARENTDELTA: + rev = e[5] + else: + rev -= 1 + e = index[rev] chain.reverse() if rev == cache: check = True @@ -1068,7 +1076,13 @@ # do we have useful data cached? if cache and self._cache: + global _cached + _cached += 1 text = self._cache[2] + else: + global _uncached + _uncached += 1 + # drop cache to save memory self._cache = None