diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -591,7 +591,7 @@ class changectx(basectx): def descendant(self, other): """True if other is descendant of this changeset""" - return self._repo.changelog.descendant(self._rev, other._rev) + return self._repo.changelog.isdescendantrev(other._rev, self._rev) def walk(self, match): '''Generates matching file names.''' diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -1645,18 +1645,18 @@ class revlog(object): c.append(self.node(r)) return c - def descendant(self, start, end): - """True if revision 'end' is an descendant of revision 'start' - - A revision is considered as a descendant of itself. + def isdescendantrev(self, a, b): + """True if revision a is a descendant of revision b + + A revision is considered a descendant of itself. The implementation of this is trivial but the use of commonancestorsheads is not.""" - if start == nullrev: + if b == nullrev: return True - elif start == end: + elif a == b: return True - return start in self._commonancestorsheads(start, end) + return b in self._commonancestorsheads(a, b) def commonancestorsheads(self, a, b): """calculate all the heads of the common ancestors of nodes a and b""" @@ -1673,9 +1673,11 @@ class revlog(object): return ancs def isancestor(self, a, b): - """return True if node a is an ancestor of node b""" + """return True if node a is an ancestor of node b + + A revision is considered an ancestor of itself.""" a, b = self.rev(a), self.rev(b) - return self.descendant(a, b) + return self.isdescendantrev(b, a) def ancestor(self, a, b): """calculate the "best" common ancestor of nodes a and b"""