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