changeset 52055:0529e1a468dd

rust-dirstate: make the reliable timestamp comparison more usable from outside This is going to be used with pre-computed times unlike in status.
author Raphaël Gomès <rgomes@octobus.net>
date Wed, 16 Oct 2024 17:19:38 +0200
parents ea0467ed76aa
children 7ea1cb46b590
files rust/hg-core/src/dirstate/entry.rs
diffstat 1 files changed, 14 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate/entry.rs	Thu Oct 03 16:35:31 2024 +0200
+++ b/rust/hg-core/src/dirstate/entry.rs	Wed Oct 16 17:19:38 2024 +0200
@@ -116,7 +116,12 @@
         metadata: &fs::Metadata,
         boundary: &Self,
     ) -> io::Result<Option<Self>> {
-        let mut mtime = Self::for_mtime_of(metadata)?;
+        Ok(Self::for_mtime_of(metadata)?.for_reliable_mtime_of_self(boundary))
+    }
+
+    /// See [`Self::for_reliable_mtime_of`]
+    pub fn for_reliable_mtime_of_self(&self, boundary: &Self) -> Option<Self> {
+        let mut new = *self;
         // If the mtime of the ambiguous file is younger (or equal) to the
         // starting point of the `status` walk, we cannot garantee that
         // another, racy, write will not happen right after with the same mtime
@@ -126,23 +131,23 @@
         // mismatch between the current clock and previous file system
         // operation. So mtime more than one days in the future are considered
         // fine.
-        let reliable = if mtime.truncated_seconds == boundary.truncated_seconds
+        let reliable = if self.truncated_seconds == boundary.truncated_seconds
         {
-            mtime.second_ambiguous = true;
-            mtime.nanoseconds != 0
+            new.second_ambiguous = true;
+            self.nanoseconds != 0
                 && boundary.nanoseconds != 0
-                && mtime.nanoseconds < boundary.nanoseconds
+                && self.nanoseconds < boundary.nanoseconds
         } else {
             // `truncated_seconds` is less than 2**31,
             // so this does not overflow `u32`:
             let one_day_later = boundary.truncated_seconds + 24 * 3600;
-            mtime.truncated_seconds < boundary.truncated_seconds
-                || mtime.truncated_seconds > one_day_later
+            self.truncated_seconds < boundary.truncated_seconds
+                || self.truncated_seconds > one_day_later
         };
         if reliable {
-            Ok(Some(mtime))
+            Some(new)
         } else {
-            Ok(None)
+            None
         }
     }