diff -r 31076a2301f1 -r 19ae7730636a mercurial/windows.py --- a/mercurial/windows.py Thu Oct 24 15:23:52 2024 +0200 +++ b/mercurial/windows.py Sat Oct 26 00:58:01 2024 +0200 @@ -19,6 +19,7 @@ import winreg # pytype: disable=import-error from typing import ( + Any, AnyStr, BinaryIO, Iterable, @@ -676,13 +677,38 @@ class cachestat: - stat: Optional[os.stat_result] + stat: os.stat_result def __init__(self, path: bytes) -> None: - self.stat = None + self.stat = os.stat(path) def cacheable(self) -> bool: - return False + return bool(self.stat.st_ino) + + __hash__ = object.__hash__ + + def __eq__(self, other: Any) -> bool: + try: + # Only dev, ino, size, mtime and atime are likely to change. Out + # of these, we shouldn't compare atime but should compare the + # rest. However, one of the other fields changing indicates + # something fishy going on, so return False if anything but atime + # changes. + return ( + self.stat.st_ino == other.stat.st_ino + and self.stat.st_dev == other.stat.st_dev + and self.stat.st_nlink == other.stat.st_nlink + and self.stat.st_uid == other.stat.st_uid + and self.stat.st_gid == other.stat.st_gid + and self.stat.st_size == other.stat.st_size + and self.stat[stat.ST_MTIME] == other.stat[stat.ST_MTIME] + and self.stat[stat.ST_CTIME] == other.stat[stat.ST_CTIME] + ) + except AttributeError: + return False + + def __ne__(self, other: Any) -> bool: + return not self == other def lookupreg(