Mercurial > hg-stable
changeset 48443:9ae0353c9f5d
status: move the boundary comparison logic within the timestamp module
Some extensions will need it too. So lets isolate the logic. It also makes
things clearer.
Differential Revision: https://phab.mercurial-scm.org/D11799
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 23 Nov 2021 18:03:51 +0100 |
parents | eea70e3539ed |
children | c0d88407b7d4 |
files | mercurial/context.py mercurial/dirstateutils/timestamp.py |
diffstat | 2 files changed, 30 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/context.py Tue Nov 23 18:11:42 2021 +0100 +++ b/mercurial/context.py Tue Nov 23 18:03:51 2021 +0100 @@ -1823,29 +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 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 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) - ): + 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).
--- a/mercurial/dirstateutils/timestamp.py Tue Nov 23 18:11:42 2021 +0100 +++ b/mercurial/dirstateutils/timestamp.py Tue Nov 23 18:03:51 2021 +0100 @@ -99,3 +99,28 @@ 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 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 + # 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): + return None + else: + return file_mtime