diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -116,7 +116,6 @@ # UNC path pointing to root share (issue4557) self._rootdir = pathutil.normasprefix(root) self._dirty = False - self._lastnormaltime = timestamp.zero() self._ui = ui self._filecache = {} self._parentwriters = 0 @@ -430,7 +429,6 @@ for a in ("_map", "_branch", "_ignore"): if a in self.__dict__: delattr(self, a) - self._lastnormaltime = timestamp.zero() self._dirty = False self._parentwriters = 0 self._origpl = None @@ -493,11 +491,6 @@ self._check_new_tracked_filename(filename) (mode, size, mtime) = parentfiledata self._map.set_clean(filename, mode, size, mtime) - if mtime > self._lastnormaltime: - # Remember the most recent modification timeslot for status(), - # to make sure we won't miss future size-preserving file content - # modifications that happen within the same timeslot. - self._lastnormaltime = mtime @requires_no_parents_change def set_possibly_dirty(self, filename): @@ -581,15 +574,6 @@ has_meaningful_mtime=not possibly_dirty, parentfiledata=parentfiledata, ) - if ( - parentfiledata is not None - and parentfiledata[2] is not None - and parentfiledata[2] > self._lastnormaltime - ): - # Remember the most recent modification timeslot for status(), - # to make sure we won't miss future size-preserving file content - # modifications that happen within the same timeslot. - self._lastnormaltime = parentfiledata[2] def _check_new_tracked_filename(self, filename): scmutil.checkfilename(filename) @@ -693,7 +677,6 @@ def clear(self): self._map.clear() - self._lastnormaltime = timestamp.zero() self._dirty = True def rebuild(self, parent, allfiles, changedfiles=None): @@ -701,9 +684,7 @@ # Rebuild entire dirstate to_lookup = allfiles to_drop = [] - lastnormaltime = self._lastnormaltime self.clear() - self._lastnormaltime = lastnormaltime elif len(changedfiles) < 10: # Avoid turning allfiles into a set, which can be expensive if it's # large. @@ -818,7 +799,6 @@ break self._map.write(tr, st, now) - self._lastnormaltime = timestamp.zero() self._dirty = False def _dirignore(self, f): @@ -1216,7 +1196,6 @@ self._rootdir, self._ignorefiles(), self._checkexec, - self._lastnormaltime, bool(list_clean), bool(list_ignored), bool(list_unknown), @@ -1343,7 +1322,6 @@ checkexec = self._checkexec checklink = self._checklink copymap = self._map.copymap - lastnormaltime = self._lastnormaltime # We need to do full walks when either # - we're listing all clean files, or @@ -1399,12 +1377,10 @@ else: madd(fn) elif not t.mtime_likely_equal_to(timestamp.mtime_of(st)): - ladd(fn) - elif timestamp.mtime_of(st) == lastnormaltime: - # fn may have just been marked as normal and it may have - # changed in the same second without changing its size. - # This can happen if we quickly do multiple commits. - # Force lookup, so we don't miss such a racy file change. + # There might be a change in the future if for example the + # internal clock is off, but this is a case where the issues + # the user would face would be a lot worse and there is + # nothing we can really do. ladd(fn) elif listclean: cadd(fn) diff --git a/rust/hg-core/src/dirstate/status.rs b/rust/hg-core/src/dirstate/status.rs --- a/rust/hg-core/src/dirstate/status.rs +++ b/rust/hg-core/src/dirstate/status.rs @@ -12,7 +12,6 @@ use crate::dirstate_tree::on_disk::DirstateV2ParseError; use crate::{ - dirstate::TruncatedTimestamp, utils::hg_path::{HgPath, HgPathError}, PatternError, }; @@ -62,10 +61,6 @@ #[derive(Debug, Copy, Clone)] pub struct StatusOptions { - /// Remember the most recent modification timeslot for status, to make - /// sure we won't miss future size-preserving file content modifications - /// that happen within the same timeslot. - pub last_normal_time: TruncatedTimestamp, /// Whether we are on a filesystem with UNIX-like exec flags pub check_exec: bool, pub list_clean: bool, diff --git a/rust/hg-core/src/dirstate_tree/status.rs b/rust/hg-core/src/dirstate_tree/status.rs --- a/rust/hg-core/src/dirstate_tree/status.rs +++ b/rust/hg-core/src/dirstate_tree/status.rs @@ -532,8 +532,12 @@ if let Some(dirstate_mtime) = entry.truncated_mtime() { let fs_mtime = TruncatedTimestamp::for_mtime_of(fs_metadata) .expect("OS/libc does not support mtime?"); + // There might be a change in the future if for example the + // internal clock become off while process run, but this is a + // case where the issues the user would face + // would be a lot worse and there is nothing we + // can really do. mtime_looks_clean = fs_mtime.likely_equal(dirstate_mtime) - && !fs_mtime.likely_equal(self.options.last_normal_time) } else { // No mtime in the dirstate entry mtime_looks_clean = false diff --git a/rust/hg-cpython/src/dirstate.rs b/rust/hg-cpython/src/dirstate.rs --- a/rust/hg-cpython/src/dirstate.rs +++ b/rust/hg-cpython/src/dirstate.rs @@ -54,7 +54,6 @@ matcher: PyObject, ignorefiles: PyList, check_exec: bool, - last_normal_time: (u32, u32), list_clean: bool, list_ignored: bool, list_unknown: bool, diff --git a/rust/hg-cpython/src/dirstate/status.rs b/rust/hg-cpython/src/dirstate/status.rs --- a/rust/hg-cpython/src/dirstate/status.rs +++ b/rust/hg-cpython/src/dirstate/status.rs @@ -9,7 +9,6 @@ //! `hg-core` crate. From Python, this will be seen as //! `rustext.dirstate.status`. -use crate::dirstate::item::timestamp; use crate::{dirstate::DirstateMap, exceptions::FallbackError}; use cpython::exc::OSError; use cpython::{ @@ -103,13 +102,11 @@ root_dir: PyObject, ignore_files: PyList, check_exec: bool, - last_normal_time: (u32, u32), list_clean: bool, list_ignored: bool, list_unknown: bool, collect_traversed_dirs: bool, ) -> PyResult { - let last_normal_time = timestamp(py, last_normal_time)?; let bytes = root_dir.extract::(py)?; let root_dir = get_path_from_bytes(bytes.data(py)); @@ -135,7 +132,6 @@ ignore_files, StatusOptions { check_exec, - last_normal_time, list_clean, list_ignored, list_unknown, @@ -172,7 +168,6 @@ ignore_files, StatusOptions { check_exec, - last_normal_time, list_clean, list_ignored, list_unknown, @@ -224,7 +219,6 @@ ignore_files, StatusOptions { check_exec, - last_normal_time, list_clean, list_ignored, list_unknown, diff --git a/rust/rhg/src/commands/status.rs b/rust/rhg/src/commands/status.rs --- a/rust/rhg/src/commands/status.rs +++ b/rust/rhg/src/commands/status.rs @@ -12,7 +12,7 @@ use format_bytes::format_bytes; use hg; use hg::config::Config; -use hg::dirstate::{has_exec_bit, TruncatedTimestamp}; +use hg::dirstate::has_exec_bit; use hg::errors::HgError; use hg::manifest::Manifest; use hg::matchers::AlwaysMatcher; @@ -194,11 +194,6 @@ let mut dmap = repo.dirstate_map_mut()?; let options = StatusOptions { - // TODO should be provided by the dirstate parsing and - // hence be stored on dmap. Using a value that assumes we aren't - // below the time resolution granularity of the FS and the - // dirstate. - last_normal_time: TruncatedTimestamp::new_truncate(0, 0), // we're currently supporting file systems with exec flags only // anyway check_exec: true, @@ -369,7 +364,8 @@ let fs_path = hg_path_to_os_string(hg_path).expect("HgPath conversion"); let fs_metadata = vfs.symlink_metadata(&fs_path)?; let is_symlink = fs_metadata.file_type().is_symlink(); - // TODO: Also account for `FALLBACK_SYMLINK` and `FALLBACK_EXEC` from the dirstate + // TODO: Also account for `FALLBACK_SYMLINK` and `FALLBACK_EXEC` from the + // dirstate let fs_flags = if is_symlink { Some(b'l') } else if has_exec_bit(&fs_metadata) {