Mercurial > public > mercurial-scm > hg-stable
diff rust/hg-core/src/repo.rs @ 52078: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 | a8cf6a852f11 |
children | 039b7caeb4d9 |
line wrap: on
line diff
--- a/rust/hg-core/src/repo.rs Mon Oct 14 14:14:21 2024 +0200 +++ b/rust/hg-core/src/repo.rs Thu Oct 03 16:35:31 2024 +0200 @@ -1,7 +1,9 @@ use crate::changelog::Changelog; use crate::config::{Config, ConfigError, ConfigParseError}; use crate::dirstate::DirstateParents; -use crate::dirstate_tree::dirstate_map::DirstateMapWriteMode; +use crate::dirstate_tree::dirstate_map::{ + DirstateIdentity, DirstateMapWriteMode, +}; use crate::dirstate_tree::on_disk::Docket as DirstateDocket; use crate::dirstate_tree::owning::OwningDirstateMap; use crate::errors::HgResultExt; @@ -34,7 +36,8 @@ const V2_MAX_READ_ATTEMPTS: usize = 5; -type DirstateMapIdentity = (Option<u64>, Option<Vec<u8>>, usize); +/// Docket file identity, data file uuid and the data size +type DirstateV2Identity = (Option<DirstateIdentity>, Option<Vec<u8>>, usize); /// A repository on disk pub struct Repo { @@ -311,13 +314,12 @@ .unwrap_or_default()) } - fn dirstate_identity(&self) -> Result<Option<u64>, HgError> { - use std::os::unix::fs::MetadataExt; + fn dirstate_identity(&self) -> Result<Option<DirstateIdentity>, HgError> { Ok(self .hg_vfs() .symlink_metadata("dirstate") .io_not_found_as_none()? - .map(|meta| meta.ino())) + .map(DirstateIdentity::from)) } pub fn dirstate_parents(&self) -> Result<DirstateParents, HgError> { @@ -355,10 +357,10 @@ /// Returns the information read from the dirstate docket necessary to /// check if the data file has been updated/deleted by another process /// since we last read the dirstate. - /// Namely, the inode, data file uuid and the data size. + /// Namely the docket file identity, data file uuid and the data size. fn get_dirstate_data_file_integrity( &self, - ) -> Result<DirstateMapIdentity, HgError> { + ) -> Result<DirstateV2Identity, HgError> { assert!( self.use_dirstate_v2(), "accessing dirstate data file ID without dirstate-v2"