Mercurial > hg
diff rust/hg-core/src/dirstate_tree/on_disk.rs @ 48260:269ff8978086
dirstate: store mtimes with nanosecond precision in memory
Keep integer seconds since the Unix epoch,
together with integer nanoseconds in the `0 <= n < 1e9` range.
For now, nanoseconds are still always zero.
This commit is about data structure changes.
Differential Revision: https://phab.mercurial-scm.org/D11684
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 18 Oct 2021 11:23:07 +0200 |
parents | b874e8d81a98 |
children | 9205d9be8b41 |
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate_tree/on_disk.rs Tue Oct 19 21:03:13 2021 +0200 +++ b/rust/hg-core/src/dirstate_tree/on_disk.rs Mon Oct 18 11:23:07 2021 +0200 @@ -317,7 +317,7 @@ &self, ) -> Result<dirstate_map::NodeData, DirstateV2ParseError> { if self.has_entry() { - Ok(dirstate_map::NodeData::Entry(self.assume_entry())) + Ok(dirstate_map::NodeData::Entry(self.assume_entry()?)) } else if let Some(mtime) = self.cached_directory_mtime()? { Ok(dirstate_map::NodeData::CachedDirectory { mtime }) } else { @@ -357,7 +357,7 @@ file_type | permisions } - fn assume_entry(&self) -> DirstateEntry { + fn assume_entry(&self) -> Result<DirstateEntry, DirstateV2ParseError> { // TODO: convert through raw bits instead? let wdir_tracked = self.flags().contains(Flags::WDIR_TRACKED); let p1_tracked = self.flags().contains(Flags::P1_TRACKED); @@ -372,11 +372,19 @@ let mtime = if self.flags().contains(Flags::HAS_FILE_MTIME) && !self.flags().contains(Flags::EXPECTED_STATE_IS_MODIFIED) { - Some(self.mtime.truncated_seconds.into()) + // TODO: replace this by `self.mtime.try_into()?` to use + // sub-second precision from the file. + // We don’t do this yet because other parts of the code + // always set it to zero. + let mtime = TruncatedTimestamp::from_already_truncated( + self.mtime.truncated_seconds.get(), + 0, + )?; + Some(mtime) } else { None }; - DirstateEntry::from_v2_data( + Ok(DirstateEntry::from_v2_data( wdir_tracked, p1_tracked, p2_info, @@ -384,14 +392,14 @@ mtime, None, None, - ) + )) } pub(super) fn entry( &self, ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> { if self.has_entry() { - Ok(Some(self.assume_entry())) + Ok(Some(self.assume_entry()?)) } else { Ok(None) } @@ -450,10 +458,7 @@ }; let mtime = if let Some(m) = mtime_opt { flags.insert(Flags::HAS_FILE_MTIME); - PackedTruncatedTimestamp { - truncated_seconds: m.into(), - nanoseconds: 0.into(), - } + m.into() } else { PackedTruncatedTimestamp::null() };