mercurial/cmdutil.py
branchstable
changeset 48976 877d7e1a4223
parent 48384 9f1b9e128788
child 48978 c80544aa4971
child 49067 770e1352e9f9
--- a/mercurial/cmdutil.py	Fri Mar 18 21:37:22 2022 -0700
+++ b/mercurial/cmdutil.py	Fri Mar 18 21:15:54 2022 -0700
@@ -2906,7 +2906,14 @@
         filestoamend = {f for f in wctx.files() if matcher(f)}
 
         changes = len(filestoamend) > 0
-        if changes:
+        changeset_copies = (
+            repo.ui.config(b'experimental', b'copies.read-from')
+            != b'filelog-only'
+        )
+        # If there are changes to amend or if copy information needs to be read
+        # from the changeset extras, we cannot take the fast path of using
+        # filectxs from the old commit.
+        if changes or changeset_copies:
             # Recompute copies (avoid recording a -> b -> a)
             copied = copies.pathcopies(base, wctx, matcher)
             if old.p2:
@@ -2927,19 +2934,19 @@
 
             def filectxfn(repo, ctx_, path):
                 try:
+                    # Return None for removed files.
+                    if path in wctx.removed():
+                        return None
+
                     # If the file being considered is not amongst the files
-                    # to be amended, we should return the file context from the
+                    # to be amended, we should use the file context from the
                     # old changeset. This avoids issues when only some files in
                     # the working copy are being amended but there are also
                     # changes to other files from the old changeset.
-                    if path not in filestoamend:
-                        return old.filectx(path)
-
-                    # Return None for removed files.
-                    if path in wctx.removed():
-                        return None
-
-                    fctx = wctx[path]
+                    if path in filestoamend:
+                        fctx = wctx[path]
+                    else:
+                        fctx = old.filectx(path)
                     flags = fctx.flags()
                     mctx = context.memfilectx(
                         repo,