diff mercurial/util.py @ 18678:423eee0b0b14

util: make ensuredirs safer against races
author Bryan O'Sullivan <bryano@fb.com>
date Wed, 13 Feb 2013 12:20:10 -0800
parents 4034b8d551b1
children 716cad930691
line wrap: on
line diff
--- a/mercurial/util.py	Wed Feb 13 11:07:01 2013 -0800
+++ b/mercurial/util.py	Wed Feb 13 12:20:10 2013 -0800
@@ -882,13 +882,20 @@
 
 def ensuredirs(name, mode=None):
     """race-safe recursive directory creation"""
+    if os.path.isdir(name):
+        return
+    parent = os.path.dirname(os.path.abspath(name))
+    if parent != name:
+        ensuredirs(parent, mode)
     try:
-        makedirs(name, mode)
+        os.mkdir(name)
     except OSError, err:
         if err.errno == errno.EEXIST and os.path.isdir(name):
             # someone else seems to have won a directory creation race
             return
         raise
+    if mode is not None:
+        os.chmod(name, mode)
 
 def readfile(path):
     fp = open(path, 'rb')