##// END OF EJS Templates
util: make ensuredirs safer against races
Bryan O'Sullivan -
r18678:423eee0b default
parent child Browse files
Show More
@@ -306,8 +306,7 b' class vfs(abstractvfs):'
306 # to a directory. Let the posixfile() call below raise IOError.
306 # to a directory. Let the posixfile() call below raise IOError.
307 if basename:
307 if basename:
308 if atomictemp:
308 if atomictemp:
309 if not os.path.isdir(dirname):
309 util.ensuredirs(dirname, self.createmode)
310 util.ensuredirs(dirname, self.createmode)
311 return util.atomictempfile(f, mode, self.createmode)
310 return util.atomictempfile(f, mode, self.createmode)
312 try:
311 try:
313 if 'w' in mode:
312 if 'w' in mode:
@@ -325,8 +324,7 b' class vfs(abstractvfs):'
325 if e.errno != errno.ENOENT:
324 if e.errno != errno.ENOENT:
326 raise
325 raise
327 nlink = 0
326 nlink = 0
328 if not os.path.isdir(dirname):
327 util.ensuredirs(dirname, self.createmode)
329 util.ensuredirs(dirname, self.createmode)
330 if nlink > 0:
328 if nlink > 0:
331 if self._trustnlink is None:
329 if self._trustnlink is None:
332 self._trustnlink = nlink > 1 or util.checknlink(f)
330 self._trustnlink = nlink > 1 or util.checknlink(f)
@@ -345,9 +343,7 b' class vfs(abstractvfs):'
345 except OSError:
343 except OSError:
346 pass
344 pass
347
345
348 dirname = os.path.dirname(linkname)
346 util.ensuredirs(os.path.dirname(linkname), self.createmode)
349 if not os.path.exists(dirname):
350 util.ensuredirs(dirname, self.createmode)
351
347
352 if self._cansymlink:
348 if self._cansymlink:
353 try:
349 try:
@@ -882,13 +882,20 b' def makedirs(name, mode=None):'
882
882
883 def ensuredirs(name, mode=None):
883 def ensuredirs(name, mode=None):
884 """race-safe recursive directory creation"""
884 """race-safe recursive directory creation"""
885 if os.path.isdir(name):
886 return
887 parent = os.path.dirname(os.path.abspath(name))
888 if parent != name:
889 ensuredirs(parent, mode)
885 try:
890 try:
886 makedirs(name, mode)
891 os.mkdir(name)
887 except OSError, err:
892 except OSError, err:
888 if err.errno == errno.EEXIST and os.path.isdir(name):
893 if err.errno == errno.EEXIST and os.path.isdir(name):
889 # someone else seems to have won a directory creation race
894 # someone else seems to have won a directory creation race
890 return
895 return
891 raise
896 raise
897 if mode is not None:
898 os.chmod(name, mode)
892
899
893 def readfile(path):
900 def readfile(path):
894 fp = open(path, 'rb')
901 fp = open(path, 'rb')
General Comments 0
You need to be logged in to leave comments. Login now