# HG changeset patch # User Patrick Mezard # Date 2012-02-16 12:03:42 # Node ID d7829b2ecf3274ca1b8306b993a38cf1b5c57ce3 # Parent 131d1a09108a702c58bf6c458675a0b24f667a39 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 diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -475,9 +475,15 @@ class workingbackend(fsbackend): 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: diff --git a/tests/test-import-git.t b/tests/test-import-git.t --- a/tests/test-import-git.t +++ b/tests/test-import-git.t @@ -402,6 +402,23 @@ Renames and strip 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 - < 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 diff --git a/tests/test-import.t b/tests/test-import.t --- a/tests/test-import.t +++ b/tests/test-import.t @@ -663,7 +663,6 @@ test import with similarity and git and 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 @@ test import with similarity and git and applying ../rename.diff patching file a patching file b - removing a adding b applied to working directory $ hg st -C