# HG changeset patch # User Pierre-Yves David # Date 1637725865 -3600 # Node ID af303ae33cd730e84bc8088f5519ca65cdda1624 # Parent 111098af6356871ffe8532955de81461b9fada28 dirstate-item: implement the comparison logic for mtime-second-ambiguous If the flag is set we now process it properly. We "just" need to actually set it and persist it. Differential Revision: https://phab.mercurial-scm.org/D11843 diff -r 111098af6356 -r af303ae33cd7 mercurial/cext/parsers.c --- a/mercurial/cext/parsers.c Wed Nov 24 04:40:00 2021 +0100 +++ b/mercurial/cext/parsers.c Wed Nov 24 04:51:05 2021 +0100 @@ -335,10 +335,20 @@ &other_second_ambiguous)) { return NULL; } - if ((self->flags & dirstate_flag_has_mtime) && - self->mtime_s == other_s && - (self->mtime_ns == other_ns || self->mtime_ns == 0 || - other_ns == 0)) { + if (!(self->flags & dirstate_flag_has_mtime)) { + Py_RETURN_FALSE; + } + if (self->mtime_s != other_s) { + Py_RETURN_FALSE; + } + if (self->mtime_ns == 0 || other_ns == 0) { + if (self->flags & dirstate_flag_mtime_second_ambiguous) { + Py_RETURN_FALSE; + } else { + Py_RETURN_TRUE; + } + } + if (self->mtime_ns == other_ns) { Py_RETURN_TRUE; } else { Py_RETURN_FALSE; diff -r 111098af6356 -r af303ae33cd7 mercurial/pure/parsers.py --- a/mercurial/pure/parsers.py Wed Nov 24 04:40:00 2021 +0100 +++ b/mercurial/pure/parsers.py Wed Nov 24 04:51:05 2021 +0100 @@ -310,9 +310,21 @@ return False self_ns = self._mtime_ns other_sec, other_ns, second_ambiguous = other_mtime - return self_sec == other_sec and ( - self_ns == other_ns or self_ns == 0 or other_ns == 0 - ) + if self_sec != other_sec: + # seconds are different theses mtime are definitly not equal + return False + elif other_ns == 0 or self_ns == 0: + # at least one side as no nano-seconds information + + if self._mtime_second_ambiguous: + # We cannot trust the mtime in this case + return False + else: + # the "seconds" value was reliable on its own. We are good to go. + return True + else: + # We have nano second information, let us use them ! + return self_ns == other_ns @property def state(self): diff -r 111098af6356 -r af303ae33cd7 rust/hg-core/src/dirstate/entry.rs --- a/rust/hg-core/src/dirstate/entry.rs Wed Nov 24 04:40:00 2021 +0100 +++ b/rust/hg-core/src/dirstate/entry.rs Wed Nov 24 04:51:05 2021 +0100 @@ -130,10 +130,17 @@ /// in that way, doing a simple comparison would cause many false /// negatives. pub fn likely_equal(self, other: Self) -> bool { - self.truncated_seconds == other.truncated_seconds - && (self.nanoseconds == other.nanoseconds - || self.nanoseconds == 0 - || other.nanoseconds == 0) + if self.truncated_seconds != other.truncated_seconds { + false + } else if self.nanoseconds == 0 || other.nanoseconds == 0 { + if self.second_ambiguous { + false + } else { + true + } + } else { + self.nanoseconds == other.nanoseconds + } } pub fn likely_equal_to_mtime_of(