##// END OF EJS Templates
util: fix race in makedirs()...
Adam Simpkins -
r29017:07be8682 stable
parent child Browse files
Show More
@@ -539,7 +539,7 b' class vfs(abstractvfs):'
539 # to a directory. Let the posixfile() call below raise IOError.
539 # to a directory. Let the posixfile() call below raise IOError.
540 if basename:
540 if basename:
541 if atomictemp:
541 if atomictemp:
542 util.ensuredirs(dirname, self.createmode, notindexed)
542 util.makedirs(dirname, self.createmode, notindexed)
543 return util.atomictempfile(f, mode, self.createmode)
543 return util.atomictempfile(f, mode, self.createmode)
544 try:
544 try:
545 if 'w' in mode:
545 if 'w' in mode:
@@ -556,7 +556,7 b' class vfs(abstractvfs):'
556 if e.errno != errno.ENOENT:
556 if e.errno != errno.ENOENT:
557 raise
557 raise
558 nlink = 0
558 nlink = 0
559 util.ensuredirs(dirname, self.createmode, notindexed)
559 util.makedirs(dirname, self.createmode, notindexed)
560 if nlink > 0:
560 if nlink > 0:
561 if self._trustnlink is None:
561 if self._trustnlink is None:
562 self._trustnlink = nlink > 1 or util.checknlink(f)
562 self._trustnlink = nlink > 1 or util.checknlink(f)
@@ -583,7 +583,7 b' class vfs(abstractvfs):'
583 except OSError:
583 except OSError:
584 pass
584 pass
585
585
586 util.ensuredirs(os.path.dirname(linkname), self.createmode)
586 util.makedirs(os.path.dirname(linkname), self.createmode)
587
587
588 if self._cansymlink:
588 if self._cansymlink:
589 try:
589 try:
@@ -1420,7 +1420,12 b' class atomictempfile(object):'
1420 self.discard()
1420 self.discard()
1421
1421
1422 def makedirs(name, mode=None, notindexed=False):
1422 def makedirs(name, mode=None, notindexed=False):
1423 """recursive directory creation with parent mode inheritance"""
1423 """recursive directory creation with parent mode inheritance
1424
1425 Newly created directories are marked as "not to be indexed by
1426 the content indexing service", if ``notindexed`` is specified
1427 for "write" mode access.
1428 """
1424 try:
1429 try:
1425 makedir(name, notindexed)
1430 makedir(name, notindexed)
1426 except OSError as err:
1431 except OSError as err:
@@ -1432,29 +1437,13 b' def makedirs(name, mode=None, notindexed'
1432 if parent == name:
1437 if parent == name:
1433 raise
1438 raise
1434 makedirs(parent, mode, notindexed)
1439 makedirs(parent, mode, notindexed)
1435 makedir(name, notindexed)
1440 try:
1436 if mode is not None:
1441 makedir(name, notindexed)
1437 os.chmod(name, mode)
1442 except OSError as err:
1438
1443 # Catch EEXIST to handle races
1439 def ensuredirs(name, mode=None, notindexed=False):
1444 if err.errno == errno.EEXIST:
1440 """race-safe recursive directory creation
1445 return
1441
1446 raise
1442 Newly created directories are marked as "not to be indexed by
1443 the content indexing service", if ``notindexed`` is specified
1444 for "write" mode access.
1445 """
1446 if os.path.isdir(name):
1447 return
1448 parent = os.path.dirname(os.path.abspath(name))
1449 if parent != name:
1450 ensuredirs(parent, mode, notindexed)
1451 try:
1452 makedir(name, notindexed)
1453 except OSError as err:
1454 if err.errno == errno.EEXIST and os.path.isdir(name):
1455 # someone else seems to have won a directory creation race
1456 return
1457 raise
1458 if mode is not None:
1447 if mode is not None:
1459 os.chmod(name, mode)
1448 os.chmod(name, mode)
1460
1449
General Comments 0
You need to be logged in to leave comments. Login now