Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/util.py @ 4341:f4a1eac52d43
Merge with stable
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Tue, 10 Apr 2007 14:05:15 -0500 |
parents | d4f0405fadac ce52deed83bc |
children | ec64f263e49a |
comparison
equal
deleted
inserted
replaced
4325:aa26759c6fb3 | 4341:f4a1eac52d43 |
---|---|
764 return False | 764 return False |
765 return True | 765 return True |
766 except: | 766 except: |
767 return True | 767 return True |
768 | 768 |
769 _umask = os.umask(0) | |
770 os.umask(_umask) | |
771 | |
769 def checkexec(path): | 772 def checkexec(path): |
770 """ | 773 """ |
771 Check whether the given path is on a filesystem with UNIX-like exec flags | 774 Check whether the given path is on a filesystem with UNIX-like exec flags |
772 | 775 |
773 Requires a directory (like /foo/.hg) | 776 Requires a directory (like /foo/.hg) |
1101 remote file access from higher level code. | 1104 remote file access from higher level code. |
1102 """ | 1105 """ |
1103 p = base | 1106 p = base |
1104 audit_p = audit | 1107 audit_p = audit |
1105 | 1108 |
1106 def mktempcopy(name): | 1109 def mktempcopy(name, emptyok=False): |
1107 d, fn = os.path.split(name) | 1110 d, fn = os.path.split(name) |
1108 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) | 1111 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) |
1109 os.close(fd) | 1112 os.close(fd) |
1110 ofp = posixfile(temp, "wb") | 1113 # Temporary files are created with mode 0600, which is usually not |
1114 # what we want. If the original file already exists, just copy | |
1115 # its mode. Otherwise, manually obey umask. | |
1116 try: | |
1117 st_mode = os.lstat(name).st_mode | |
1118 except OSError, inst: | |
1119 if inst.errno != errno.ENOENT: | |
1120 raise | |
1121 st_mode = 0666 & ~_umask | |
1122 os.chmod(temp, st_mode) | |
1123 if emptyok: | |
1124 return temp | |
1111 try: | 1125 try: |
1112 try: | 1126 try: |
1113 ifp = posixfile(name, "rb") | 1127 ifp = posixfile(name, "rb") |
1114 except IOError, inst: | 1128 except IOError, inst: |
1129 if inst.errno == errno.ENOENT: | |
1130 return temp | |
1115 if not getattr(inst, 'filename', None): | 1131 if not getattr(inst, 'filename', None): |
1116 inst.filename = name | 1132 inst.filename = name |
1117 raise | 1133 raise |
1134 ofp = posixfile(temp, "wb") | |
1118 for chunk in filechunkiter(ifp): | 1135 for chunk in filechunkiter(ifp): |
1119 ofp.write(chunk) | 1136 ofp.write(chunk) |
1120 ifp.close() | 1137 ifp.close() |
1121 ofp.close() | 1138 ofp.close() |
1122 except: | 1139 except: |
1123 try: os.unlink(temp) | 1140 try: os.unlink(temp) |
1124 except: pass | 1141 except: pass |
1125 raise | 1142 raise |
1126 st = os.lstat(name) | |
1127 os.chmod(temp, st.st_mode) | |
1128 return temp | 1143 return temp |
1129 | 1144 |
1130 class atomictempfile(posixfile): | 1145 class atomictempfile(posixfile): |
1131 """the file will only be copied when rename is called""" | 1146 """the file will only be copied when rename is called""" |
1132 def __init__(self, name, mode): | 1147 def __init__(self, name, mode): |
1133 self.__name = name | 1148 self.__name = name |
1134 self.temp = mktempcopy(name) | 1149 self.temp = mktempcopy(name, emptyok=('w' in mode)) |
1135 posixfile.__init__(self, self.temp, mode) | 1150 posixfile.__init__(self, self.temp, mode) |
1136 def rename(self): | 1151 def rename(self): |
1137 if not self.closed: | 1152 if not self.closed: |
1138 posixfile.close(self) | 1153 posixfile.close(self) |
1139 rename(self.temp, localpath(self.__name)) | 1154 rename(self.temp, localpath(self.__name)) |
1163 | 1178 |
1164 if mode[0] != "r": | 1179 if mode[0] != "r": |
1165 try: | 1180 try: |
1166 nlink = nlinks(f) | 1181 nlink = nlinks(f) |
1167 except OSError: | 1182 except OSError: |
1183 nlink = 0 | |
1168 d = os.path.dirname(f) | 1184 d = os.path.dirname(f) |
1169 if not os.path.isdir(d): | 1185 if not os.path.isdir(d): |
1170 os.makedirs(d) | 1186 os.makedirs(d) |
1171 else: | 1187 if atomic: |
1172 if atomic: | 1188 return atomicfile(f, mode) |
1173 return atomicfile(f, mode) | 1189 elif atomictemp: |
1174 elif atomictemp: | 1190 return atomictempfile(f, mode) |
1175 return atomictempfile(f, mode) | 1191 if nlink > 1: |
1176 if nlink > 1: | 1192 rename(mktempcopy(f), f) |
1177 rename(mktempcopy(f), f) | |
1178 return posixfile(f, mode) | 1193 return posixfile(f, mode) |
1179 | 1194 |
1180 return o | 1195 return o |
1181 | 1196 |
1182 class chunkbuffer(object): | 1197 class chunkbuffer(object): |