diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2087,10 +2087,17 @@ def _docommit(ui, repo, *pats, **opts): extra[b'close'] = b'1' if repo[b'.'].closesbranch(): - raise error.InputError( - _(b'current revision is already a branch closing head') - ) - elif not bheads: + # Not ideal, but let us do an extra status early to prevent early + # bail out. + matcher = scmutil.match(repo[None], pats, opts) + s = repo.status(match=matcher) + if s.modified or s.added or s.removed: + bheads = repo.branchheads(branch, closed=True) + else: + msg = _(b'current revision is already a branch closing head') + raise error.InputError(msg) + + if not bheads: raise error.InputError( _(b'branch "%s" has no heads to close') % branch ) diff --git a/tests/test-branches.t b/tests/test-branches.t --- a/tests/test-branches.t +++ b/tests/test-branches.t @@ -283,6 +283,19 @@ verify update will accept invalid legacy abort: current revision is already a branch closing head [10] + $ echo foo > b + $ hg commit -d '9 0' --close-branch -m 're-closing this branch' + + $ echo bar > b + $ hg commit -d '9 0' --close-branch -m 're-closing this branch' bh1 + abort: current revision is already a branch closing head + [10] + $ hg commit -d '9 0' --close-branch -m 're-closing this branch' b + + $ hg debugstrip --rev 13: --no-backup + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg revert --all --no-backup + $ hg log -r tip --debug changeset: 12:e3d49c0575d8fc2cb1cd6859c747c14f5f6d499f branch: b