Patchwork D11847: status: keep second-ambiguous mtimes during fixup

login
register
mail settings
Submitter phabricator
Date Dec. 2, 2021, 7:05 p.m.
Message ID <differential-rev-PHID-DREV-2umu7f4na74u3mnid6re-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/50171/
State Superseded
Headers show

Comments

phabricator - Dec. 2, 2021, 7:05 p.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Now that we support the feature, we can keep "second ambiguous" mtime during the fixup phase.
  These are the mtime that would be ambiguous if we did not had sub-second précions.
  
  See the v2 format documentation for details.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  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
@@ -102,16 +102,23 @@ 
     """
     file_mtime = mtime_of(stat_result)
     file_second = file_mtime[0]
+    file_ns = file_mtime[1]
     boundary_second = present_mtime[0]
+    boundary_ns = present_mtime[1]
     # 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 and we cannot cache the
     # information.
     #
-    # However is the mtime is far away in the future, this is likely some
+    # However if the mtime is far away in the future, this is likely some
     # mismatch between the current clock and previous file system operation. So
     # mtime more than one days in the future are considered fine.
-    if boundary_second <= file_second < (3600 * 24 + boundary_second):
+    if boundary_second == file_second:
+        if file_ns and boundary_ns:
+            if file_ns < boundary_ns:
+                return timestamp((file_second, file_ns, True))
+        return None
+    elif boundary_second < file_second < (3600 * 24 + boundary_second):
         return None
     else:
         return file_mtime