# HG changeset patch # User Mads Kiilerich # Date 1408403590 -7200 # Node ID 392ae5cb8d62b8c2f26346a4977170211adb3822 # Parent 82b2ba904e3ec0668760c0cefd5ced87b533b45d revlog: introduce isancestor method for efficiently determining node lineage Hide the not so obvious use of commonancestorsheads. diff -r 82b2ba904e3e -r 392ae5cb8d62 mercurial/commands.py --- a/mercurial/commands.py Tue Sep 09 17:16:24 2014 -0400 +++ b/mercurial/commands.py Tue Aug 19 01:13:10 2014 +0200 @@ -454,7 +454,7 @@ node = scmutil.revsingle(repo, rev).node() op1, op2 = repo.dirstate.parents() - if node not in repo.changelog.commonancestorsheads(op1, node): + if not repo.changelog.isancestor(node, op1): raise util.Abort(_('cannot backout change that is not an ancestor')) p1, p2 = repo.changelog.parents(node) diff -r 82b2ba904e3e -r 392ae5cb8d62 mercurial/revlog.py --- a/mercurial/revlog.py Tue Sep 09 17:16:24 2014 -0400 +++ b/mercurial/revlog.py Tue Aug 19 01:13:10 2014 +0200 @@ -745,6 +745,13 @@ ancs = ancestor.commonancestorsheads(self.parentrevs, a, b) return map(self.node, ancs) + def isancestor(self, a, b): + """return True if node a is an ancestor of node b + + The implementation of this is trivial but the use of + commonancestorsheads is not.""" + return a in self.commonancestorsheads(a, b) + def ancestor(self, a, b): """calculate the least common ancestor of nodes a and b"""