copy: recommend `--at-rev .` if target was added in parent commit
authorMartin von Zweigbergk <martinvonz@google.com>
Thu, 14 Oct 2021 10:58:39 -0700
changeset 48247 c62e4397eb28
parent 48246 2f7caef017d9
child 48248 7f23a472068f
copy: recommend `--at-rev .` if target was added in parent commit 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). Differential Revision: https://phab.mercurial-scm.org/D11667
mercurial/cmdutil.py
tests/test-rename-rev.t
--- a/mercurial/cmdutil.py	Mon Oct 18 10:14:44 2021 +0200
+++ b/mercurial/cmdutil.py	Thu Oct 14 10:58:39 2021 -0700
@@ -1678,26 +1678,44 @@
             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'
+                    # Check if if the target was added in the parent and the
+                    # source already existed in the grandparent.
+                    looks_like_copy_in_pctx = abstarget in pctx and any(
+                        abssrc in gpctx and abstarget not in gpctx
+                        for gpctx in pctx.parents()
+                    )
+                    if looks_like_copy_in_pctx:
+                        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:
--- a/tests/test-rename-rev.t	Mon Oct 18 10:14:44 2021 +0200
+++ b/tests/test-rename-rev.t	Thu Oct 14 10:58:39 2021 -0700
@@ -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