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>
--- 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: