import: handle git renames and --similarity (
issue3187)
There is no reason to discard copy sources from the set of files considered by
addremove(). It was done to handle the case where a first patch would create
'a' and a second one would move 'a' to 'b'. If these patches were applied with
--no-commit, 'a' would first be marked as added, then unlinked and dropped from
the dirstate but still passed to addremove(). A better fix is thus to exclude
removed files which ends being dropped from the dirstate instead of removed.
Reported by Jason Harris <jason@jasonfharris.com>
--- a/mercurial/patch.py Thu Feb 16 12:56:48 2012 +0100
+++ b/mercurial/patch.py Thu Feb 16 13:03:42 2012 +0100
@@ -475,9 +475,15 @@
addremoved = set(self.changed)
for src, dst in self.copied:
scmutil.dirstatecopy(self.ui, self.repo, wctx, src, dst)
- addremoved.discard(src)
- if (not self.similarity) and self.removed:
+ if self.removed:
wctx.forget(sorted(self.removed))
+ for f in self.removed:
+ if f not in self.repo.dirstate:
+ # File was deleted and no longer belongs to the
+ # dirstate, it was probably marked added then
+ # deleted, and should not be considered by
+ # addremove().
+ addremoved.discard(f)
if addremoved:
cwd = self.repo.getcwd()
if cwd:
--- a/tests/test-import-git.t Thu Feb 16 12:56:48 2012 +0100
+++ b/tests/test-import-git.t Thu Feb 16 13:03:42 2012 +0100
@@ -402,6 +402,23 @@
A b
a
R a
+
+Renames, similarity and git diff
+
+ $ hg revert -aC
+ undeleting a
+ forgetting b
+ $ rm b
+ $ hg import --similarity 90 --no-commit - <<EOF
+ > diff --git a/a b/b
+ > rename from a
+ > rename to b
+ > EOF
+ applying patch from stdin
+ $ hg st --copies
+ A b
+ a
+ R a
$ cd ..
Pure copy with existing destination
--- a/tests/test-import.t Thu Feb 16 12:56:48 2012 +0100
+++ b/tests/test-import.t Thu Feb 16 13:03:42 2012 +0100
@@ -663,7 +663,6 @@
applying ../rename.diff
patching file a
patching file b
- removing a
adding b
recording removal of a as rename to b (88% similar)
applied to working directory
@@ -679,7 +678,6 @@
applying ../rename.diff
patching file a
patching file b
- removing a
adding b
applied to working directory
$ hg st -C