handle git patches that rename a file to more than one destination
authorAlexis S. L. Carvalho <alexis@cecm.usp.br>
Mon, 20 Nov 2006 19:32:45 -0200
changeset 3701 05c8704a3743
parent 3700 4c158de5f245
child 3702 70c3ee224c08
handle git patches that rename a file to more than one destination
mercurial/patch.py
tests/test-git-import
tests/test-git-import.out
--- a/mercurial/patch.py	Mon Nov 20 19:32:43 2006 -0200
+++ b/mercurial/patch.py	Mon Nov 20 19:32:45 2006 -0200
@@ -341,7 +341,7 @@
     if not patches:
         return
     copies = []
-    removes = []
+    removes = {}
     cfiles = patches.keys()
     cwd = repo.getcwd()
     if cwd:
@@ -350,16 +350,18 @@
         ctype, gp = patches[f]
         if ctype == 'RENAME':
             copies.append((gp.oldpath, gp.path, gp.copymod))
-            removes.append(gp.oldpath)
+            removes[gp.oldpath] = 1
         elif ctype == 'COPY':
             copies.append((gp.oldpath, gp.path, gp.copymod))
         elif ctype == 'DELETE':
-            removes.append(gp.path)
+            removes[gp.path] = 1
     for src, dst, after in copies:
         if not after:
             copyfile(src, dst, repo.root)
         repo.copy(src, dst, wlock=wlock)
+    removes = removes.keys()
     if removes:
+        removes.sort()
         repo.remove(removes, True, wlock=wlock)
     for f in patches:
         ctype, gp = patches[f]
--- a/tests/test-git-import	Mon Nov 20 19:32:43 2006 -0200
+++ b/tests/test-git-import	Mon Nov 20 19:32:45 2006 -0200
@@ -127,3 +127,19 @@
 
 hg locate copy2
 hg cat rename2
+
+echo % one file renamed multiple times
+hg import -mmultirenames - <<EOF
+diff --git a/rename2 b/rename3
+rename from rename2
+rename to rename3
+diff --git a/rename2 b/rename3-2
+rename from rename2
+rename to rename3-2
+EOF
+hg log -vCr. --template '{rev} {files} / {file_copies%filecopy}\n'
+
+hg locate rename2 rename3 rename3-2
+hg cat rename3
+echo
+hg cat rename3-2
--- a/tests/test-git-import.out	Mon Nov 20 19:32:43 2006 -0200
+++ b/tests/test-git-import.out	Mon Nov 20 19:32:45 2006 -0200
@@ -37,3 +37,20 @@
 b
 c
 a
+% one file renamed multiple times
+applying patch from stdin
+9 rename2 rename3 rename3-2 / rename3 (rename2)rename3-2 (rename2)
+rename2: No such file or directory
+rename3
+rename3-2
+a
+a
+b
+c
+a
+
+a
+a
+b
+c
+a