Patchwork D11799: status: move the boundary comparison logic within the timestamp module

login
register
mail settings
Submitter phabricator
Date Nov. 24, 2021, 11:16 a.m.
Message ID <differential-rev-PHID-DREV-cwfqcqh3q4th4xazb4im-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/50124/
State New
Headers show

Comments

phabricator - Nov. 24, 2021, 11:16 a.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Some extensions will need it too., so lets isolate the logic.
  
  This make things clearer too.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D11799

AFFECTED FILES
  mercurial/context.py
  mercurial/dirstateutils/timestamp.py

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/mercurial/dirstateutils/timestamp.py b/mercurial/dirstateutils/timestamp.py
--- a/mercurial/dirstateutils/timestamp.py
+++ b/mercurial/dirstateutils/timestamp.py
@@ -99,3 +99,29 @@ 
         subsec_nanos = nanos % billion
 
     return timestamp((secs, subsec_nanos))
+
+
+def reliable_mtime_of(stat_result, present_mtime):
+    """same as `mtime_of`, but return None if the date might be ambiguous
+
+    A modification time is reliable if it is older than "present_time" (or
+    sufficiently in the futur).
+
+    Otherwise a concurrent modification might happens with the same mtime.
+    """
+    file_mtime = mtime_of(stat_result)
+    file_second = file_mtime[0]
+    boundary_second = present_mtime[0]
+    # 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 happens right
+    # after with the same mtime and we cannot cache the information.
+    #
+    # However is the mtime is far away in the future, this is
+    # likely some mismatch between the current clock and
+    # previous file system write. So mtime more than one days
+    # in the future are considered fine.
+    if boundary_second <= file_second < (3600 * 24 + boundary_second):
+        return None
+    else:
+        return file_mtime
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -1823,28 +1823,12 @@ 
                     s = self[f].lstat()
                     mode = s.st_mode
                     size = s.st_size
-                    file_mtime = timestamp.mtime_of(s)
-                    cache_info = (mode, size, file_mtime)
-
-                    file_second = file_mtime[0]
-                    boundary_second = mtime_boundary[0]
-                    # 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 happens right
-                    # after with the same mtime and we cannot cache the information.
-                    #
-                    # However is the mtime is far away in the future, this is
-                    # likely some mismatch between the current clock and
-                    # previous file system write. So mtime more than one days
-                    # in the future are considered fine.
-                    if (
-                        boundary_second
-                        <= file_second
-                        < (3600 * 24 + boundary_second)
-                    ):
+                    file_mtime = timestamp.reliable_mtime_of(s, mtime_boundary)
+                    if file_mtime is not None:
+                        cache_info = (mode, size, file_mtime)
+                        fixup.append((f, cache_info))
+                    else:
                         clean.append(f)
-                    else:
-                        fixup.append((f, cache_info))
             except (IOError, OSError):
                 # A file become inaccessible in between? Mark it as deleted,
                 # matching dirstate behavior (issue5584).