Patchwork D11667: copy: recommend `--at-rev .` if target was added in parent commit

login
register
mail settings
Submitter phabricator
Date Oct. 14, 2021, 8:12 p.m.
Message ID <differential-rev-PHID-DREV-36tivz4ol5ufwbahfnmu-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/49991/
State Superseded
Headers show

Comments

phabricator - Oct. 14, 2021, 8:12 p.m.
martinvonz created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  If the target file was added in the working copy parent, it's much
  more likely that the user meant to use `--at-rev .` (to record the
  copy/rename in the that commit) than `--force` (to replace the
  just-added file by another file).

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D11667

AFFECTED FILES
  mercurial/cmdutil.py
  tests/test-rename-rev.t

CHANGE DETAILS




To: martinvonz, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-rename-rev.t b/tests/test-rename-rev.t
--- a/tests/test-rename-rev.t
+++ b/tests/test-rename-rev.t
@@ -42,6 +42,17 @@ 
     d1/b
   A d1/d
     d1/b
+# Should get helpful message if we try to copy or rename after commit
+  $ hg cp --forget --at-rev . d1/d
+  saved backup bundle to $TESTTMP/.hg/strip-backup/3f7c325d3f9e-46f377bb-uncopy.hg
+  $ hg cp d1/b d1/d
+  d1/d: not overwriting - file already committed
+  ('hg copy --at-rev .' to record the copy in the parent of the working copy)
+  [1]
+  $ hg mv d1/b d1/d
+  d1/d: not overwriting - file already committed
+  ('hg rename --at-rev .' to record the rename in the parent of the working copy)
+  [1]
 
 Test moved file (not copied) using 'hg cp' command
 
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1678,26 +1678,41 @@ 
             if not opts[b'force']:
                 if already_commited:
                     msg = _(b'%s: not overwriting - file already committed\n')
-                    if after:
-                        flags = b'--after --force'
-                    else:
-                        flags = b'--force'
-                    if rename:
-                        hint = (
-                            _(
-                                b"('hg rename %s' to replace the file by "
-                                b'recording a rename)\n'
+                    if abstarget in pctx and any(
+                        abssrc in gpctx and abstarget not in gpctx
+                        for gpctx in pctx.parents()
+                    ):
+                        if rename:
+                            hint = _(
+                                b"('hg rename --at-rev .' to record the rename "
+                                b"in the parent of the working copy)\n"
+                            )
+                        else:
+                            hint = _(
+                                b"('hg copy --at-rev .' to record the copy in "
+                                b"the parent of the working copy)\n"
                             )
-                            % flags
-                        )
                     else:
-                        hint = (
-                            _(
-                                b"('hg copy %s' to replace the file by "
-                                b'recording a copy)\n'
+                        if after:
+                            flags = b'--after --force'
+                        else:
+                            flags = b'--force'
+                        if rename:
+                            hint = (
+                                _(
+                                    b"('hg rename %s' to replace the file by "
+                                    b'recording a rename)\n'
+                                )
+                                % flags
                             )
-                            % flags
-                        )
+                        else:
+                            hint = (
+                                _(
+                                    b"('hg copy %s' to replace the file by "
+                                    b'recording a copy)\n'
+                                )
+                                % flags
+                            )
                 else:
                     msg = _(b'%s: not overwriting - file exists\n')
                     if rename: