diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2653,22 +2653,13 @@ def debugrevlog(ui, repo, file_=None, ** " rawsize totalsize compression heads chainlen\n") ts = 0 heads = set() - rindex = r.index - - def chainbaseandlen(rev): - clen = 0 - base = rindex[rev][3] - while base != rev: - clen += 1 - rev = base - base = rindex[rev][3] - return base, clen for rev in xrange(numrevs): dbase = r.deltaparent(rev) if dbase == -1: dbase = rev - cbase, clen = chainbaseandlen(rev) + cbase = r.chainbase(rev) + clen = r.chainlen(rev) p1, p2 = r.parentrevs(rev) rs = r.rawsize(rev) ts = ts + rs diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -350,6 +350,20 @@ class revlog(object): rev = base base = index[rev][3] return base + def chainlen(self, rev): + index = self.index + generaldelta = self._generaldelta + iterrev = rev + e = index[iterrev] + clen = 0 + while iterrev != e[3]: + clen += 1 + if generaldelta: + iterrev = e[3] + else: + iterrev -= 1 + e = index[iterrev] + return clen def flags(self, rev): return self.index[rev][0] & 0xFFFF def rawsize(self, rev):