Mercurial > public > mercurial-scm > hg
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() |