equal
deleted
inserted
replaced
1003 remote file access from higher level code. |
1003 remote file access from higher level code. |
1004 """ |
1004 """ |
1005 p = base |
1005 p = base |
1006 audit_p = audit |
1006 audit_p = audit |
1007 |
1007 |
1008 def mktempcopy(name): |
1008 def mktempcopy(name, emptyok=False): |
1009 d, fn = os.path.split(name) |
1009 d, fn = os.path.split(name) |
1010 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) |
1010 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) |
1011 os.close(fd) |
1011 os.close(fd) |
1012 # Temporary files are created with mode 0600, which is usually not |
1012 # Temporary files are created with mode 0600, which is usually not |
1013 # what we want. If the original file already exists, just copy |
1013 # what we want. If the original file already exists, just copy |
1017 except OSError, inst: |
1017 except OSError, inst: |
1018 if inst.errno != errno.ENOENT: |
1018 if inst.errno != errno.ENOENT: |
1019 raise |
1019 raise |
1020 st_mode = 0666 & ~_umask |
1020 st_mode = 0666 & ~_umask |
1021 os.chmod(temp, st_mode) |
1021 os.chmod(temp, st_mode) |
|
1022 if emptyok: |
|
1023 return temp |
1022 try: |
1024 try: |
1023 try: |
1025 try: |
1024 ifp = posixfile(name, "rb") |
1026 ifp = posixfile(name, "rb") |
1025 except IOError, inst: |
1027 except IOError, inst: |
1026 if inst.errno == errno.ENOENT: |
1028 if inst.errno == errno.ENOENT: |
1041 |
1043 |
1042 class atomictempfile(posixfile): |
1044 class atomictempfile(posixfile): |
1043 """the file will only be copied when rename is called""" |
1045 """the file will only be copied when rename is called""" |
1044 def __init__(self, name, mode): |
1046 def __init__(self, name, mode): |
1045 self.__name = name |
1047 self.__name = name |
1046 self.temp = mktempcopy(name) |
1048 self.temp = mktempcopy(name, emptyok=('w' in mode)) |
1047 posixfile.__init__(self, self.temp, mode) |
1049 posixfile.__init__(self, self.temp, mode) |
1048 def rename(self): |
1050 def rename(self): |
1049 if not self.closed: |
1051 if not self.closed: |
1050 posixfile.close(self) |
1052 posixfile.close(self) |
1051 rename(self.temp, localpath(self.__name)) |
1053 rename(self.temp, localpath(self.__name)) |