diff -r 92c845c097aa -r 5460926352ee mercurial/revset.py --- a/mercurial/revset.py Mon Jul 09 10:07:20 2018 -0400 +++ b/mercurial/revset.py Mon Jun 18 19:41:54 2018 -0700 @@ -608,6 +608,22 @@ return subset.filter(lambda r: repo[r].closesbranch(), condrepr='') +@predicate('commonancestors(set)', safe=True) +def commonancestors(repo, subset, x): + """Returns all common ancestors of the set. + + This method is for calculating "::x and ::y" (i.e. all the ancestors that + are common to both x and y) in an easy and optimized way. We can't quite + use "::head()" because that revset returns "::x + ::y + ..." for each head + in the repo (whereas we want "::x *and* ::y"). + + """ + # only wants the heads of the set passed in + for r in heads(repo, fullreposet(repo), x, defineorder): + subset &= dagop.revancestors(repo, baseset([r])) + + return subset + @predicate('contains(pattern)', weight=100) def contains(repo, subset, x): """The revision's manifest contains a file matching pattern (but might not