# HG changeset patch # User Matt Harbison # Date 1446342346 14400 # Node ID 88c4e97b96691250ee446081cb00deb7c142fa46 # Parent 6fabc9317b78e43d9a272374ad15849852051dc5 scmutil: abort if an empty revision is given to revpair() When using 'extdiff --patch' to check the changes in a rebase, 'precursors(x)' evaluated to an empty set because I forgot the --hidden flag, so the other revision was used as the replacement for the empty set. The result was the patch for the other revision was diffed against itself, and the tool saying there were no differences. That's misleading since the expected diff args were silently changed, so it's better to bail out. The other uses of scmutil.revpair() are commands.diff and commands.status, and it doesn't make sense to allow an empty revision there either. The code here was suggested by Yuya Nishihara. diff -r 6fabc9317b78 -r 88c4e97b9669 mercurial/scmutil.py --- a/mercurial/scmutil.py Sun Nov 01 15:24:57 2015 -0200 +++ b/mercurial/scmutil.py Sat Oct 31 21:45:46 2015 -0400 @@ -717,6 +717,9 @@ if first is None: raise error.Abort(_('empty revision range')) + if (first == second and len(revs) >= 2 + and not all(revrange(repo, [r]) for r in revs)): + raise error.Abort(_('empty revision on one side of range')) # if top-level is range expression, the result must always be a pair if first == second and len(revs) == 1 and not _pairspec(revs[0]): diff -r 6fabc9317b78 -r 88c4e97b9669 tests/test-extdiff.t --- a/tests/test-extdiff.t Sun Nov 01 15:24:57 2015 -0200 +++ b/tests/test-extdiff.t Sat Oct 31 21:45:46 2015 -0400 @@ -70,6 +70,12 @@ [1] #endif +Specifying an empty revision should abort. + + $ hg extdiff --patch --rev 'ancestor()' --rev 1 + abort: empty revision on one side of range + [255] + Test diff during merge: $ hg update -C 0