# HG changeset patch # User Dirkjan Ochtman # Date 2010-02-06 10:27:22 # Node ID bc72e21f9dc8b307b3634866b0fe80812dabfbe2 # Parent 55d134ef8ab7cec1b5f2ea80277b55c63b88cff3 revlog: add a fast path for checking ancestry diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -1137,17 +1137,22 @@ class revlog(object): self._cache = (node, curr, text) return node + def descendant(self, a, b): + if a > b: + return False + for i in self.descendants(a): + if i == b: + return True + elif i > b: + break + return False + def ancestor(self, a, b): """calculate the least common ancestor of nodes a and b""" - # fast path, check if it is a descendant - a, b = self.rev(a), self.rev(b) start, end = sorted((a, b)) - for i in self.descendants(start): - if i == end: - return self.node(start) - elif i > end: - break + if self.descendant(a, b): + return self.node(start) def parents(rev): return [p for p in self.parentrevs(rev) if p != nullrev]