diff -r 258fbccf22f5 -r 19067884c5f5 mercurial/revlog.py --- a/mercurial/revlog.py Sat May 07 22:37:40 2011 +0200 +++ b/mercurial/revlog.py Sat May 07 22:40:14 2011 +0200 @@ -217,6 +217,7 @@ self.datafile = indexfile[:-2] + ".d" self.opener = opener self._cache = None + self._basecache = None self._chunkcache = (0, '') self.index = [] self._pcache = {} @@ -313,8 +314,13 @@ return self.start(rev) + self.length(rev) def length(self, rev): return self.index[rev][1] - def base(self, rev): - return self.index[rev][3] + def chainbase(self, rev): + index = self.index + base = index[rev][3] + while base != rev: + rev = base + base = index[rev][3] + return base def flags(self, rev): return self.index[rev][0] & 0xFFFF def rawsize(self, rev): @@ -850,7 +856,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: @@ -859,10 +864,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 @@ -984,7 +992,11 @@ delta = mdiff.textdiff(ptext, t) data = compress(delta) l = len(data[1]) + len(data[0]) - base = self.base(rev) + basecache = self._basecache + if basecache and basecache[0] == rev: + base = basecache[1] + else: + base = self.chainbase(rev) dist = l + offset - self.start(base) return dist, l, data, base @@ -1038,6 +1050,7 @@ if type(text) == str: # only accept immutable objects self._cache = (node, curr, text) + self._basecache = (curr, base) return node def group(self, nodelist, bundler):