comparison mercurial/util.py @ 36781:ffa3026d4196

cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime The latter is floating point by default, and we've been doing os.stat_float_times(False). Unfortunately, os.stat_float_times was removed between Python 3.7.0a1 and 3.7.0b2, so we have to stop using it. Differential Revision: https://phab.mercurial-scm.org/D2696
author Augie Fackler <augie@google.com>
date Mon, 05 Mar 2018 12:30:20 -0500
parents ca201470abb4
children 86ba6e3eba4e
comparison
equal deleted inserted replaced
36780:f3c314020beb 36781:ffa3026d4196
1565 shutil.copymode(src, dest) 1565 shutil.copymode(src, dest)
1566 if oldstat and oldstat.stat: 1566 if oldstat and oldstat.stat:
1567 newstat = filestat.frompath(dest) 1567 newstat = filestat.frompath(dest)
1568 if newstat.isambig(oldstat): 1568 if newstat.isambig(oldstat):
1569 # stat of copied file is ambiguous to original one 1569 # stat of copied file is ambiguous to original one
1570 advanced = (oldstat.stat.st_mtime + 1) & 0x7fffffff 1570 advanced = (
1571 oldstat.stat[stat.ST_MTIME] + 1) & 0x7fffffff
1571 os.utime(dest, (advanced, advanced)) 1572 os.utime(dest, (advanced, advanced))
1572 except shutil.Error as inst: 1573 except shutil.Error as inst:
1573 raise Abort(str(inst)) 1574 raise Abort(str(inst))
1574 1575
1575 def copyfiles(src, dst, hardlink=None, progress=lambda t, pos: None): 1576 def copyfiles(src, dst, hardlink=None, progress=lambda t, pos: None):
1961 try: 1962 try:
1962 # if ambiguity between stat of new and old file is 1963 # if ambiguity between stat of new and old file is
1963 # avoided, comparison of size, ctime and mtime is enough 1964 # avoided, comparison of size, ctime and mtime is enough
1964 # to exactly detect change of a file regardless of platform 1965 # to exactly detect change of a file regardless of platform
1965 return (self.stat.st_size == old.stat.st_size and 1966 return (self.stat.st_size == old.stat.st_size and
1966 self.stat.st_ctime == old.stat.st_ctime and 1967 self.stat[stat.ST_CTIME] == old.stat[stat.ST_CTIME] and
1967 self.stat.st_mtime == old.stat.st_mtime) 1968 self.stat[stat.ST_MTIME] == old.stat[stat.ST_MTIME])
1968 except AttributeError: 1969 except AttributeError:
1969 pass 1970 pass
1970 try: 1971 try:
1971 return self.stat is None and old.stat is None 1972 return self.stat is None and old.stat is None
1972 except AttributeError: 1973 except AttributeError:
2001 2002
2002 Advancing mtime "if isambig(oldstat)" ensures "S[n-1].mtime != 2003 Advancing mtime "if isambig(oldstat)" ensures "S[n-1].mtime !=
2003 S[n].mtime", even if size of a file isn't changed. 2004 S[n].mtime", even if size of a file isn't changed.
2004 """ 2005 """
2005 try: 2006 try:
2006 return (self.stat.st_ctime == old.stat.st_ctime) 2007 return (self.stat[stat.ST_CTIME] == old.stat[stat.ST_CTIME])
2007 except AttributeError: 2008 except AttributeError:
2008 return False 2009 return False
2009 2010
2010 def avoidambig(self, path, old): 2011 def avoidambig(self, path, old):
2011 """Change file stat of specified path to avoid ambiguity 2012 """Change file stat of specified path to avoid ambiguity
2016 appropriate privileges for 'path'. This returns False in this 2017 appropriate privileges for 'path'. This returns False in this
2017 case. 2018 case.
2018 2019
2019 Otherwise, this returns True, as "ambiguity is avoided". 2020 Otherwise, this returns True, as "ambiguity is avoided".
2020 """ 2021 """
2021 advanced = (old.stat.st_mtime + 1) & 0x7fffffff 2022 advanced = (old.stat[stat.ST_MTIME] + 1) & 0x7fffffff
2022 try: 2023 try:
2023 os.utime(path, (advanced, advanced)) 2024 os.utime(path, (advanced, advanced))
2024 except OSError as inst: 2025 except OSError as inst:
2025 if inst.errno == errno.EPERM: 2026 if inst.errno == errno.EPERM:
2026 # utime() on the file created by another user causes EPERM, 2027 # utime() on the file created by another user causes EPERM,
2067 if oldstat and oldstat.stat: 2068 if oldstat and oldstat.stat:
2068 rename(self._tempname, filename) 2069 rename(self._tempname, filename)
2069 newstat = filestat.frompath(filename) 2070 newstat = filestat.frompath(filename)
2070 if newstat.isambig(oldstat): 2071 if newstat.isambig(oldstat):
2071 # stat of changed file is ambiguous to original one 2072 # stat of changed file is ambiguous to original one
2072 advanced = (oldstat.stat.st_mtime + 1) & 0x7fffffff 2073 advanced = (oldstat.stat[stat.ST_MTIME] + 1) & 0x7fffffff
2073 os.utime(filename, (advanced, advanced)) 2074 os.utime(filename, (advanced, advanced))
2074 else: 2075 else:
2075 rename(self._tempname, filename) 2076 rename(self._tempname, filename)
2076 2077
2077 def discard(self): 2078 def discard(self):