comparison 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
comparison
equal deleted inserted replaced
18677:539210ed2069 18678:423eee0b0b14
880 if mode is not None: 880 if mode is not None:
881 os.chmod(name, mode) 881 os.chmod(name, mode)
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 try: 885 if os.path.isdir(name):
886 makedirs(name, mode) 886 return
887 parent = os.path.dirname(os.path.abspath(name))
888 if parent != name:
889 ensuredirs(parent, mode)
890 try:
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')
895 try: 902 try:
896 return fp.read() 903 return fp.read()