When applying a git diff, ensure that the target dir exists for new files
authorStefan Rusek <stefan@rusek.org>
Tue, 09 Dec 2008 14:27:47 +0100
changeset 7505 fe0e02f952b0
parent 7500 ab3fb222b345
child 7506 abd2bc899d86
When applying a git diff, ensure that the target dir exists for new files
mercurial/patch.py
--- a/mercurial/patch.py	Wed Dec 10 11:30:11 2008 +0100
+++ b/mercurial/patch.py	Tue Dec 09 14:27:47 2008 +0100
@@ -22,17 +22,20 @@
 
 # helper functions
 
-def copyfile(src, dst, basedir=None):
-    if not basedir:
-        basedir = os.getcwd()
-
-    abssrc, absdst = [os.path.join(basedir, n) for n in (src, dst)]
+def copyfile(src, dst, basedir):
+    abssrc, absdst = [util.canonpath(basedir, basedir, x) for x in [src, dst]]
     if os.path.exists(absdst):
         raise util.Abort(_("cannot create %s: destination already exists") %
                          dst)
 
-    if not os.path.isdir(basedir):
-        os.makedirs(basedir)
+    dstdir = os.path.dirname(absdst)
+    if dstdir and not os.path.isdir(dstdir):
+        try:
+            os.makedirs(dstdir)
+        except:
+            raise util.Abort(
+                _("cannot create %s: unable to create destination directory")
+                % dst)            
 
     util.copyfile(abssrc, absdst)
 
@@ -977,9 +980,7 @@
             cwd = os.getcwd()
             for gp in gitpatches:
                 if gp.op in ('COPY', 'RENAME'):
-                    src, dst = [util.canonpath(cwd, cwd, x)
-                                for x in [gp.oldpath, gp.path]]
-                    copyfile(src, dst)
+                    copyfile(gp.oldpath, gp.path, cwd)
                 changed[gp.path] = gp
         else:
             raise util.Abort(_('unsupported parser state: %s') % state)