mercurial/util.py
changeset 4331 ce52deed83bc
parent 4328 1083ae4b5f0e
child 4334 1cc5fc1d0994
child 4341 f4a1eac52d43
equal deleted inserted replaced
4330:1b9fc3f48861 4331:ce52deed83bc
  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))