changeset 14385:7709cc983025

patch: git metadata was ignored if strip > 1 gitpatch objects emitted by iterhunks() are modified in place by applydiff(). Processing them earlier improves iterhunks() isolation. applydiff() modifying them should still be fixed though.
author Patrick Mezard <pmezard@gmail.com>
date Thu, 19 May 2011 22:44:01 +0200
parents 9d59c596eb9e
children c2ef8cc50748
files mercurial/patch.py tests/test-git-import.t
diffstat 2 files changed, 22 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/patch.py	Thu May 19 22:44:01 2011 +0200
+++ b/mercurial/patch.py	Thu May 19 22:44:01 2011 +0200
@@ -1158,14 +1158,12 @@
                 if not git:
                     git = True
                     gitpatches = scangitpatch(lr, x)
-                    yield 'git', gitpatches
                     for gp in gitpatches:
                         changed[gp.path] = gp
-                # else error?
+                    yield 'git', gitpatches
                 # copy/rename + modify should modify target, not source
-                gp = changed.get(bfile)
-                if gp and (gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD')
-                           or gp.mode):
+                gp = changed[bfile]
+                if gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD') or gp.mode:
                     afile = bfile
                 newfile = True
         elif x.startswith('---'):
--- a/tests/test-git-import.t	Thu May 19 22:44:01 2011 +0200
+++ b/tests/test-git-import.t	Thu May 19 22:44:01 2011 +0200
@@ -383,3 +383,22 @@
   a   0         -1 unset               b
   $ hg ci -m done
   $ cd ..
+
+Renames and strip
+
+  $ hg init renameandstrip
+  $ cd renameandstrip
+  $ echo a > a
+  $ hg ci -Am adda
+  adding a
+  $ hg import --no-commit -p2 - <<EOF
+  > diff --git a/foo/a b/foo/b
+  > rename from foo/a
+  > rename to foo/b
+  > EOF
+  applying patch from stdin
+  $ hg st --copies
+  A b
+    a
+  R a
+  $ cd ..