# HG changeset patch # User Augie Fackler # Date 1474319739 14400 # Node ID 381293e1135eebd3b461ce426b6edc2f2ff13d9f # Parent c0410814002f467c24ef07ce73850ba15b306f8e copy: distinguish "file exists" cases and add a hint (BC) Users that want to add a copy record to an existing commit with 'hg commit --amend' should be guided towards this workflow, rather than reaching for some sort of uncommit-recommit flow. As part of this, distinguish in the top-line error message whether the file merely already exists (untracked) on disk or the file already exists in history. The full list of copy and rename cases and how they interact with flags are listed below: target exists --after --force | action n n * | copy n y * | (1) untracked n n | (4) NEWHINT untracked n y | (3) untracked y * | (2) y n n | (4) NEWHINT y n y | (3) y y n | (2) y y y | (3) deleted n n | copy deleted n y | (3) deleted y n | (1) deleted y y | (1) * = don't care (1) : not recording move - does not exist (2) preserve target contents (3) replace target contents (4) : not overwriting - file {exists,already committed} Credit to Kevin for wholly rewriting my table to cover more cases we discovered at the sprint. I think this change gets the hints correct in all cases, but I'd appreciate close inspection of the test cases to make sure I haven't gotten turned around in here. diff -r c0410814002f -r 381293e1135e mercurial/cmdutil.py --- a/mercurial/cmdutil.py Sun Oct 09 01:03:20 2016 +0900 +++ b/mercurial/cmdutil.py Mon Sep 19 17:15:39 2016 -0400 @@ -646,8 +646,26 @@ if not after and exists or after and state in 'mn': if not opts['force']: - ui.warn(_('%s: not overwriting - file exists\n') % - reltarget) + if state in 'mn': + msg = _('%s: not overwriting - file already committed\n') + if after: + flags = '--after --force' + else: + flags = '--force' + if rename: + hint = _('(hg rename %s to replace the file by ' + 'recording a rename)\n') % flags + else: + hint = _('(hg copy %s to replace the file by ' + 'recording a copy)\n') % flags + else: + msg = _('%s: not overwriting - file exists\n') + if rename: + hint = _('(hg rename --after to record the rename)\n') + else: + hint = _('(hg copy --after to record the copy)\n') + ui.warn(msg % reltarget) + ui.warn(hint) return if after: diff -r c0410814002f -r 381293e1135e tests/test-copy.t --- a/tests/test-copy.t Sun Oct 09 01:03:20 2016 +0900 +++ b/tests/test-copy.t Mon Sep 19 17:15:39 2016 -0400 @@ -226,11 +226,23 @@ C foo Trying to copy on top of an existing file fails, $ hg copy -A bar foo - foo: not overwriting - file exists + foo: not overwriting - file already committed + (hg copy --after --force to replace the file by recording a copy) +same error without the --after, so the user doesn't have to go through +two hints: + $ hg copy bar foo + foo: not overwriting - file already committed + (hg copy --force to replace the file by recording a copy) but it's considered modified after a copy --after --force $ hg copy -Af bar foo $ hg st -AC foo M foo bar +The hint for a file that exists but is not in file history doesn't +mention --force: + $ touch xyzzy + $ hg cp bar xyzzy + xyzzy: not overwriting - file exists + (hg copy --after to record the copy) $ cd .. diff -r c0410814002f -r 381293e1135e tests/test-rename.t --- a/tests/test-rename.t Sun Oct 09 01:03:20 2016 +0900 +++ b/tests/test-rename.t Mon Sep 19 17:15:39 2016 -0400 @@ -265,7 +265,8 @@ overwrite existing files (d2/b) $ hg rename d1/* d2 - d2/b: not overwriting - file exists + d2/b: not overwriting - file already committed + (hg rename --force to replace the file by recording a rename) moving d1/d11/a1 to d2/d11/a1 (glob) $ hg status -C A d2/a @@ -370,6 +371,7 @@ $ echo "ca" > d1/ca $ hg rename d1/ba d1/ca d1/ca: not overwriting - file exists + (hg rename --after to record the rename) $ hg status -C ? d1/ca $ hg update -C @@ -393,6 +395,7 @@ $ ln -s ba d1/ca $ hg rename --traceback d1/ba d1/ca d1/ca: not overwriting - file exists + (hg rename --after to record the rename) $ hg status -C ? d1/ca $ hg update -C