# HG changeset patch # User Yuya Nishihara # Date 2018-07-12 14:07:29 # Node ID e4b270a32ba84b9287235c87df5de0e61c889ca8 # Parent 607e2a2501e69d946b2b2848e52bf7aa8c338d0e revset: special case commonancestors(none()) to be empty set This matches the behavior of ancestor(none()). From an implementation perspective, ancestor() and commonancestors() are intersection, and ancestors() is union, so it would make some sense that commonancestors(none()) returned all revisions. However, ancestor(none()) isn't implemented as such, which breaks ancestor(x) == max(commonancestors(x)). From a user perspective, ancestors of nothing is nothing whichever type of operation the ancestor predicate does. diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -632,7 +632,10 @@ def commonancestors(repo, subset, x): """ # only wants the heads of the set passed in - for r in heads(repo, fullreposet(repo), x, anyorder): + h = heads(repo, fullreposet(repo), x, anyorder) + if not h: + return baseset() + for r in h: subset &= dagop.revancestors(repo, baseset([r])) return subset diff --git a/tests/test-revset.t b/tests/test-revset.t --- a/tests/test-revset.t +++ b/tests/test-revset.t @@ -1063,6 +1063,12 @@ test common ancestors 8 9 +test ancestor variants of empty revision + + $ log 'ancestor(none())' + $ log 'ancestors(none())' + $ log 'commonancestors(none())' + test ancestors with depth limit (depth=0 selects the node itself)