diff --git a/mercurial/changelog.py b/mercurial/changelog.py --- a/mercurial/changelog.py +++ b/mercurial/changelog.py @@ -420,9 +420,6 @@ if i not in self.filteredrevs: yield i - def reachableroots(self, minroot, heads, roots, includepath=False): - return self.index.reachableroots2(minroot, heads, roots, includepath) - def _checknofilteredinrevs(self, revs): """raise the appropriate error if 'revs' contains a filtered revision diff --git a/mercurial/dagop.py b/mercurial/dagop.py --- a/mercurial/dagop.py +++ b/mercurial/dagop.py @@ -259,11 +259,10 @@ yield rev break -def _reachablerootspure(repo, minroot, roots, heads, includepath): - """See reachableroots""" +def _reachablerootspure(pfunc, minroot, roots, heads, includepath): + """See revlog.reachableroots""" if not roots: return [] - parentrevs = repo.changelog.parentrevs roots = set(roots) visit = list(heads) reachable = set() @@ -280,7 +279,7 @@ reached(rev) if not includepath: continue - parents = parentrevs(rev) + parents = pfunc(rev) seen[rev] = parents for parent in parents: if parent >= minroot and parent not in seen: @@ -296,18 +295,13 @@ return reachable def reachableroots(repo, roots, heads, includepath=False): - """return (heads(:: and ::)) - - If includepath is True, return (::).""" + """See revlog.reachableroots""" if not roots: return baseset() minroot = roots.min() roots = list(roots) heads = list(heads) - try: - revs = repo.changelog.reachableroots(minroot, heads, roots, includepath) - except AttributeError: - revs = _reachablerootspure(repo, minroot, roots, heads, includepath) + revs = repo.changelog.reachableroots(minroot, heads, roots, includepath) revs = baseset(revs) revs.sort() return revs diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -1216,14 +1216,25 @@ A revision is considered an ancestor of itself. The implementation of this is trivial but the use of - commonancestorsheads is not.""" + reachableroots is not.""" if a == nullrev: return True elif a == b: return True elif a > b: return False - return a in self._commonancestorsheads(a, b) + return bool(self.reachableroots(a, [b], [a], includepath=False)) + + def reachableroots(self, minroot, heads, roots, includepath=False): + """return (heads(:: and ::)) + + If includepath is True, return (::).""" + try: + return self.index.reachableroots2(minroot, heads, roots, + includepath) + except AttributeError: + return dagop._reachablerootspure(self.parentrevs, + minroot, roots, heads, includepath) def ancestor(self, a, b): """calculate the "best" common ancestor of nodes a and b"""