[PATCH 1 of 1] patch: update working directory in _applydiff, not in updatedir

Mads Kiilerich mads at kiilerich.com
Mon Apr 26 10:28:43 CDT 2010


# HG changeset patch
# User Mads Kiilerich <mads at kiilerich.com>
# Date 1272295709 -7200
# Node ID 07019a4ff5dc30df5cadcd6c350a1fdd9a920a0e
# Parent  5c474bb5ebb060a3d941a339bba35700f7fa8014
patch: update working directory in _applydiff, not in updatedir

Previously updatedir (which apparently except for that was intended to be
updatedirstate) modified the working directory, fixing stuff that applydiff
hadn't finished.  Now we do everything in applydiff.

diff --git a/mercurial/patch.py b/mercurial/patch.py
--- a/mercurial/patch.py
+++ b/mercurial/patch.py
@@ -1178,6 +1178,16 @@
 
     rejects += closefile()
 
+    for gp in changed.values():
+        if gp:
+            dst = util.canonpath(cwd, cwd, gp.path)
+            # git patches can add empty files which we didn't create above
+            if gp.op == 'ADD' and not os.path.exists(dst):
+                file(dst, 'w').close()
+            if gp.mode:
+                islink, isexec = gp.mode
+                util.set_flags(dst, islink, isexec)
+
     if rejects:
         return -1
     return err
@@ -1207,16 +1217,6 @@
         repo.copy(src, dst)
     if (not similarity) and removes:
         repo.remove(sorted(removes), True)
-    for f in patches:
-        gp = patches[f]
-        if gp and gp.mode:
-            islink, isexec = gp.mode
-            dst = repo.wjoin(gp.path)
-            # patch won't create empty files
-            if gp.op == 'ADD' and not os.path.exists(dst):
-                flags = (isexec and 'x' or '') + (islink and 'l' or '')
-                repo.wwrite(gp.path, '', flags)
-            util.set_flags(dst, islink, isexec)
     cmdutil.addremove(repo, cfiles, similarity=similarity)
     files = patches.keys()
     files.extend([r for r in removes if r not in files])


More information about the Mercurial-devel mailing list