@@ -306,8 +306,7 @@ class vfs(abstractvfs):
# to a directory. Let the posixfile() call below raise IOError.
if basename:
if atomictemp:
- if not os.path.isdir(dirname):
- util.ensuredirs(dirname, self.createmode)
+ util.ensuredirs(dirname, self.createmode)
return util.atomictempfile(f, mode, self.createmode)
try:
if 'w' in mode:
@@ -325,8 +324,7 @@ class vfs(abstractvfs):
if e.errno != errno.ENOENT:
raise
nlink = 0
- if not os.path.isdir(dirname):
- util.ensuredirs(dirname, self.createmode)
+ util.ensuredirs(dirname, self.createmode)
if nlink > 0:
if self._trustnlink is None:
self._trustnlink = nlink > 1 or util.checknlink(f)
@@ -345,9 +343,7 @@ class vfs(abstractvfs):
except OSError:
pass
- dirname = os.path.dirname(linkname)
- if not os.path.exists(dirname):
- util.ensuredirs(dirname, self.createmode)
+ util.ensuredirs(os.path.dirname(linkname), self.createmode)
if self._cansymlink:
try:
@@ -16,7 +16,7 @@ hide platform-specific details from the
from i18n import _
import error, osutil, encoding, collections
import errno, re, shutil, sys, tempfile, traceback
-import os, time, datetime, calendar, textwrap, signal
+import os, stat, time, datetime, calendar, textwrap, signal
import imp, socket, urllib
if os.name == 'nt':
@@ -882,13 +882,20 @@ def makedirs(name, mode=None):
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')