Mercurial > public > mercurial-scm > hg
diff mercurial/dirstatemap.py @ 52050:ea0467ed76aa
rust-dirstate-map: use a more precise identity
This is closer to the behavior of what Python does. So far, we were checking
only the inode, but this might not be good enough for the v1 case.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Thu, 03 Oct 2024 16:35:31 +0200 |
parents | af54626bf358 |
children | 82e2c99c84f3 |
line wrap: on
line diff
--- a/mercurial/dirstatemap.py Mon Oct 14 14:14:21 2024 +0200 +++ b/mercurial/dirstatemap.py Thu Oct 03 16:35:31 2024 +0200 @@ -5,6 +5,8 @@ from __future__ import annotations +import stat + from typing import ( Optional, TYPE_CHECKING, @@ -678,12 +680,7 @@ parents = self._v1_map(e) else: parents = self.docket.parents - inode = ( - self.identity.stat.st_ino - if self.identity is not None - and self.identity.stat is not None - else None - ) + identity = self._get_rust_identity() testing.wait_on_cfg( self._ui, b'dirstate.post-docket-read-file' ) @@ -697,7 +694,7 @@ self.docket.data_size, self.docket.tree_metadata, self.docket.uuid, - inode, + identity, ) parents = self.docket.parents else: @@ -711,16 +708,31 @@ self.get = self._map.get return self._map - def _v1_map(self, from_v2_exception=None): + def _get_rust_identity(self): self._set_identity() - inode = ( - self.identity.stat.st_ino - if self.identity is not None and self.identity.stat is not None - else None - ) + identity = None + if self.identity is not None and self.identity.stat is not None: + stat_info = self.identity.stat + identity = rustmod.DirstateIdentity( + mode=stat_info.st_mode, + dev=stat_info.st_dev, + ino=stat_info.st_ino, + nlink=stat_info.st_nlink, + uid=stat_info.st_uid, + gid=stat_info.st_gid, + size=stat_info.st_size, + mtime=stat_info[stat.ST_MTIME], + mtime_nsec=0, + ctime=stat_info[stat.ST_CTIME], + ctime_nsec=0, + ) + return identity + + def _v1_map(self, from_v2_exception=None): + identity = self._get_rust_identity() try: self._map, parents = rustmod.DirstateMap.new_v1( - self._readdirstatefile(), inode + self._readdirstatefile(), identity ) except OSError as e: if from_v2_exception is not None: