commit: warn the user when a commit already exists

Sometimes, a commit will result in an exact match of a preexisting
commit, and if that commit isn't a branch head, hg will incorrectly
note that it created a new head. Instead, we should warn the user that
commit already existed in the repository.

In practice, this bug is rather uncommon, and will only occur when the
usr explicitly sets the date.

Please note that this commit contains an API change to
cmdutil.commitstatus()

Differential Revision: https://phab.mercurial-scm.org/D9257
parent 4404f129341e
......@@ -3113,13 +3113,18 @@ def buildcommittext(repo, ctx, subs, extramsg):
return b"\n".join(edittext)
def commitstatus(repo, node, branch, bheads=None, opts=None):
def commitstatus(repo, node, branch, bheads=None, tip=None, opts=None):
if opts is None:
opts = {}
ctx = repo[node]
parents = ctx.parents()
if (
if tip is not None and repo.changelog.tip() == tip:
# avoid reporting something like "committed new head" when
# recommitting old changesets, and issue a helpful warning
# for most instances
repo.ui.warn(_("warning: commit already existed in the repository!\n"))
elif (
not opts.get(b'amend')
and bheads
and node not in bheads
......
......@@ -851,11 +851,14 @@ def _dobackout(ui, repo, node=None, rev=None, **opts):
message, opts.get(b'user'), opts.get(b'date'), match, editor=e
)
# save to detect changes
tip = repo.changelog.tip()
newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
if not newnode:
ui.status(_(b"nothing changed\n"))
return 1
cmdutil.commitstatus(repo, newnode, branch, bheads)
cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
def nice(node):
return b'%d:%s' % (repo.changelog.rev(node), short(node))
......@@ -2024,6 +2027,7 @@ def _docommit(ui, repo, *pats, **opts):
branch = repo[None].branch()
bheads = repo.branchheads(branch)
tip = repo.changelog.tip()
extra = {}
if opts.get(b'close_branch') or opts.get(b'force_close_branch'):
......@@ -2113,7 +2117,7 @@ def _docommit(ui, repo, *pats, **opts):
ui.status(_(b"nothing changed\n"))
return 1
cmdutil.commitstatus(repo, node, branch, bheads, opts)
cmdutil.commitstatus(repo, node, branch, bheads, tip, opts)
if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
status(
......
......@@ -819,5 +819,5 @@ Ensure that backout out the same changeset twice performs correctly:
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg backout 2
removing 3
created new head
warning: commit already existed in the repository!
changeset 3:8f188de730d9 backs out changeset 2:cccc23d9d68f
......@@ -1868,6 +1868,7 @@ Verify naming of temporary files and that extension is preserved
$ hg update -q -C 1
$ hg mv f f.txt
$ hg ci -qm "f.txt"
warning: commit already existed in the repository!
$ hg update -q -C 2
$ hg merge -y -r tip --tool echo \
> --config merge-tools.echo.args='$base $local $other $output' \
......
......@@ -1010,7 +1010,7 @@ draft:
$ hg up -C 1
0 files updated, 0 files merged, 4 files removed, 0 files unresolved
$ mkcommit C
created new head
warning: commit already existed in the repository!
$ hg phase -r 2
2: public
......@@ -1027,6 +1027,7 @@ Same, but for secret:
7: draft
$ mkcommit F
test-debug-phase: new rev 8: x -> 2
warning: commit already existed in the repository!
test-hook-close-phase: de414268ec5ce2330c590b942fbb5ff0b0ca1a0a: -> secret
$ hg phase -r tip
8: secret
......@@ -1037,7 +1038,7 @@ But what about obsoleted changesets?
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ mkcommit H
test-debug-phase: new rev 5: x -> 2
created new head
warning: commit already existed in the repository!
test-hook-close-phase: a030c6be5127abc010fcbff1851536552e6951a8: -> secret
$ hg phase -r 5
5: secret
......
......@@ -204,5 +204,6 @@
$ hg update -r '.^' -q
$ echo 1 > A
$ hg commit -m foo -A A
warning: commit already existed in the repository!
$ hg log -r . -T '{node}\n'
383ce605500277f879b7460a16ba620eb6930b7f
......@@ -405,8 +405,10 @@ Rename a->b, then amend b->c, and working copy change c->d. After unamend, shoul
$ hg co -q 0
$ hg mv a b
$ hg ci -qm 'move to a b'
warning: commit already existed in the repository!
$ hg mv b c
$ hg amend
warning: commit already existed in the repository!
$ hg mv c d
$ hg unamend
$ hg st --copies --change .
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment