Always copy the necessary files before applying a git patch
authorAlexis S. L. Carvalho <alexis@cecm.usp.br>
Sat, 06 Oct 2007 15:30:15 -0300
changeset 5403 477136fa6571
parent 5402 ad0b580cad35
child 5404 67d3daa8ac42
Always copy the necessary files before applying a git patch This patch removes the "copymod" attribute from the gitpatch class. AFAICS, that attribute was only used to delay the copying of renamed/copied files if there are no other changes to the target, but in this case, if there are changes to the source, we'll end up copying the wrong version. This should fix issue762.
mercurial/patch.py
tests/test-git-import
tests/test-git-import.out
--- a/mercurial/patch.py	Sat Oct 06 15:30:15 2007 -0300
+++ b/mercurial/patch.py	Sat Oct 06 15:30:15 2007 -0300
@@ -151,7 +151,6 @@
             self.oldpath = None
             self.mode = None
             self.op = 'MODIFY'
-            self.copymod = False
             self.lineno = 0
             self.binary = False
 
@@ -182,7 +181,6 @@
         elif gp:
             if line.startswith('--- '):
                 if gp.op in ('COPY', 'RENAME'):
-                    gp.copymod = True
                     dopatch |= GP_FILTER
                 gitpatches.append(gp)
                 gp = None
@@ -858,7 +856,7 @@
 
         (dopatch, gitpatches) = readgitpatch(fp, firstline)
         for gp in gitpatches:
-            if gp.copymod:
+            if gp.op in ('COPY', 'RENAME'):
                 copyfile(gp.oldpath, gp.path, basedir=cwd)
 
         fp.seek(pos)
@@ -1030,15 +1028,13 @@
     for f in patches:
         ctype, gp = patches[f]
         if ctype == 'RENAME':
-            copies.append((gp.oldpath, gp.path, gp.copymod))
+            copies.append((gp.oldpath, gp.path))
             removes[gp.oldpath] = 1
         elif ctype == 'COPY':
-            copies.append((gp.oldpath, gp.path, gp.copymod))
+            copies.append((gp.oldpath, gp.path))
         elif ctype == 'DELETE':
             removes[gp.path] = 1
-    for src, dst, after in copies:
-        if not after:
-            copyfile(src, dst, repo.root)
+    for src, dst in copies:
         repo.copy(src, dst)
     removes = removes.keys()
     if removes:
--- a/tests/test-git-import	Sat Oct 06 15:30:15 2007 -0300
+++ b/tests/test-git-import	Sat Oct 06 15:30:15 2007 -0300
@@ -198,3 +198,19 @@
 EOF
 cat "foo bar"
 
+echo % copy then modify the original file
+hg import -m copy-mod-orig - <<EOF
+diff --git a/foo2 b/foo2
+index 257cc56..fe08ec6 100644
+--- a/foo2
++++ b/foo2
+@@ -1 +1,2 @@
+ foo
++new line
+diff --git a/foo2 b/foo3
+similarity index 100%
+copy from foo2
+copy to foo3
+EOF
+
+cat foo3
--- a/tests/test-git-import.out	Sat Oct 06 15:30:15 2007 -0300
+++ b/tests/test-git-import.out	Sat Oct 06 15:30:15 2007 -0300
@@ -63,3 +63,6 @@
 % filenames with spaces
 applying patch from stdin
 foo
+% copy then modify the original file
+applying patch from stdin
+foo