Mercurial > hg
comparison mercurial/util.py @ 4336:1cc5fc1d0994
Merge with crew-stable.
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Mon, 09 Apr 2007 04:57:25 -0300 |
parents | d4f0405fadac ce52deed83bc |
children | 8b4d4f84b739 |
comparison
equal
deleted
inserted
replaced
4325:aa26759c6fb3 | 4336:1cc5fc1d0994 |
---|---|
802 '''return an is_link() function with default to fallback''' | 802 '''return an is_link() function with default to fallback''' |
803 if checklink(path): | 803 if checklink(path): |
804 return lambda x: os.path.islink(os.path.join(path, x)) | 804 return lambda x: os.path.islink(os.path.join(path, x)) |
805 return fallback | 805 return fallback |
806 | 806 |
807 _umask = os.umask(0) | |
808 os.umask(_umask) | |
809 | |
807 # Platform specific variants | 810 # Platform specific variants |
808 if os.name == 'nt': | 811 if os.name == 'nt': |
809 import msvcrt | 812 import msvcrt |
810 nulldev = 'NUL:' | 813 nulldev = 'NUL:' |
811 | 814 |
928 except ImportError: | 931 except ImportError: |
929 pass | 932 pass |
930 | 933 |
931 else: | 934 else: |
932 nulldev = '/dev/null' | 935 nulldev = '/dev/null' |
933 _umask = os.umask(0) | |
934 os.umask(_umask) | |
935 | 936 |
936 def rcfiles(path): | 937 def rcfiles(path): |
937 rcs = [os.path.join(path, 'hgrc')] | 938 rcs = [os.path.join(path, 'hgrc')] |
938 rcdir = os.path.join(path, 'hgrc.d') | 939 rcdir = os.path.join(path, 'hgrc.d') |
939 try: | 940 try: |
1101 remote file access from higher level code. | 1102 remote file access from higher level code. |
1102 """ | 1103 """ |
1103 p = base | 1104 p = base |
1104 audit_p = audit | 1105 audit_p = audit |
1105 | 1106 |
1106 def mktempcopy(name): | 1107 def mktempcopy(name, emptyok=False): |
1107 d, fn = os.path.split(name) | 1108 d, fn = os.path.split(name) |
1108 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) | 1109 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) |
1109 os.close(fd) | 1110 os.close(fd) |
1110 ofp = posixfile(temp, "wb") | 1111 # Temporary files are created with mode 0600, which is usually not |
1112 # what we want. If the original file already exists, just copy | |
1113 # its mode. Otherwise, manually obey umask. | |
1114 try: | |
1115 st_mode = os.lstat(name).st_mode | |
1116 except OSError, inst: | |
1117 if inst.errno != errno.ENOENT: | |
1118 raise | |
1119 st_mode = 0666 & ~_umask | |
1120 os.chmod(temp, st_mode) | |
1121 if emptyok: | |
1122 return temp | |
1111 try: | 1123 try: |
1112 try: | 1124 try: |
1113 ifp = posixfile(name, "rb") | 1125 ifp = posixfile(name, "rb") |
1114 except IOError, inst: | 1126 except IOError, inst: |
1127 if inst.errno == errno.ENOENT: | |
1128 return temp | |
1115 if not getattr(inst, 'filename', None): | 1129 if not getattr(inst, 'filename', None): |
1116 inst.filename = name | 1130 inst.filename = name |
1117 raise | 1131 raise |
1132 ofp = posixfile(temp, "wb") | |
1118 for chunk in filechunkiter(ifp): | 1133 for chunk in filechunkiter(ifp): |
1119 ofp.write(chunk) | 1134 ofp.write(chunk) |
1120 ifp.close() | 1135 ifp.close() |
1121 ofp.close() | 1136 ofp.close() |
1122 except: | 1137 except: |
1123 try: os.unlink(temp) | 1138 try: os.unlink(temp) |
1124 except: pass | 1139 except: pass |
1125 raise | 1140 raise |
1126 st = os.lstat(name) | |
1127 os.chmod(temp, st.st_mode) | |
1128 return temp | 1141 return temp |
1129 | 1142 |
1130 class atomictempfile(posixfile): | 1143 class atomictempfile(posixfile): |
1131 """the file will only be copied when rename is called""" | 1144 """the file will only be copied when rename is called""" |
1132 def __init__(self, name, mode): | 1145 def __init__(self, name, mode): |
1133 self.__name = name | 1146 self.__name = name |
1134 self.temp = mktempcopy(name) | 1147 self.temp = mktempcopy(name, emptyok=('w' in mode)) |
1135 posixfile.__init__(self, self.temp, mode) | 1148 posixfile.__init__(self, self.temp, mode) |
1136 def rename(self): | 1149 def rename(self): |
1137 if not self.closed: | 1150 if not self.closed: |
1138 posixfile.close(self) | 1151 posixfile.close(self) |
1139 rename(self.temp, localpath(self.__name)) | 1152 rename(self.temp, localpath(self.__name)) |
1163 | 1176 |
1164 if mode[0] != "r": | 1177 if mode[0] != "r": |
1165 try: | 1178 try: |
1166 nlink = nlinks(f) | 1179 nlink = nlinks(f) |
1167 except OSError: | 1180 except OSError: |
1181 nlink = 0 | |
1168 d = os.path.dirname(f) | 1182 d = os.path.dirname(f) |
1169 if not os.path.isdir(d): | 1183 if not os.path.isdir(d): |
1170 os.makedirs(d) | 1184 os.makedirs(d) |
1171 else: | 1185 if atomic: |
1172 if atomic: | 1186 return atomicfile(f, mode) |
1173 return atomicfile(f, mode) | 1187 elif atomictemp: |
1174 elif atomictemp: | 1188 return atomictempfile(f, mode) |
1175 return atomictempfile(f, mode) | 1189 if nlink > 1: |
1176 if nlink > 1: | 1190 rename(mktempcopy(f), f) |
1177 rename(mktempcopy(f), f) | |
1178 return posixfile(f, mode) | 1191 return posixfile(f, mode) |
1179 | 1192 |
1180 return o | 1193 return o |
1181 | 1194 |
1182 class chunkbuffer(object): | 1195 class chunkbuffer(object): |