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):