amend: fix copy records handling (issue3410) stable
authorPatrick Mezard <patrick@mezard.eu>
Mon, 30 Apr 2012 20:45:45 +0200
branchstable
changeset 16553 9224cc2e99cc
parent 16552 90ca344a7c55
child 16554 ae2664ee0223
amend: fix copy records handling (issue3410) Messing with the dirstate before the intermediate commit seems error prone. Instead, commit and recompute the copies with copies.pathcopies(), then use that with commitctx(). Since copies.pathcopies() does not support file replacement very well, the whole .renamed() condition in samefile() is removed and the "file replacement caused by differing copy source" effect is discarded. Test shamelessly stolen from Idan Kamara <idankk86@gmail.com>
mercurial/cmdutil.py
tests/test-commit-amend.t
--- a/mercurial/cmdutil.py	Mon Apr 30 20:36:29 2012 +0200
+++ b/mercurial/cmdutil.py	Mon Apr 30 20:45:45 2012 +0200
@@ -1296,9 +1296,6 @@
 
     wlock = repo.wlock()
     try:
-        # Fix up dirstate for copies and renames
-        duplicatecopies(repo, None, base.node())
-
         # First, do a regular commit to record all changes in the working
         # directory (if there are any)
         node = commit(ui, repo, commitfunc, pats, opts)
@@ -1326,6 +1323,8 @@
             date = ctx.date()
             message = ctx.description()
             extra = ctx.extra()
+            # Recompute copies (avoid recording a -> b -> a)
+            copied = copies.pathcopies(base, ctx)
 
             # Prune files which were reverted by the updates: if old introduced
             # file X and our intermediate commit, node, renamed that file, then
@@ -1339,8 +1338,7 @@
                     if f in base.manifest():
                         b = base.filectx(f)
                         return (a.data() == b.data()
-                                and a.flags() == b.flags()
-                                and a.renamed() == b.renamed())
+                                and a.flags() == b.flags())
                     else:
                         return False
                 else:
@@ -1349,7 +1347,13 @@
 
             def filectxfn(repo, ctx_, path):
                 try:
-                    return ctx.filectx(path)
+                    fctx = ctx[path]
+                    flags = fctx.flags()
+                    mctx = context.memfilectx(fctx.path(), fctx.data(),
+                                              islink='l' in flags,
+                                              isexec='x' in flags,
+                                              copied=copied.get(path))
+                    return mctx
                 except KeyError:
                     raise IOError()
         else:
--- a/tests/test-commit-amend.t	Mon Apr 30 20:36:29 2012 +0200
+++ b/tests/test-commit-amend.t	Mon Apr 30 20:45:45 2012 +0200
@@ -293,11 +293,23 @@
   $ hg cp a f
   $ mv f.orig f
   $ hg ci --amend -m replacef
-  saved backup bundle to $TESTTMP/.hg/strip-backup/0ce2c92dc50d-amend-backup.hg
+  saved backup bundle to $TESTTMP/.hg/strip-backup/20a7413547f9-amend-backup.hg
   $ hg st --change . --copies
-  M f
   $ hg log -r . --template "{file_copies}\n"
-  f (a)
+  
+
+Move added file (issue3410):
+
+  $ echo g >> g
+  $ hg ci -Am g
+  adding g
+  $ hg mv g h
+  $ hg ci --amend
+  saved backup bundle to $TESTTMP/.hg/strip-backup/5daa77a5d616-amend-backup.hg
+  $ hg st --change . --copies h
+  A h
+  $ hg log -r . --template "{file_copies}\n"
+  
 
 Can't rollback an amend: