Patchwork D10974: dirstate-entry: add a `need_delay` method

login
register
mail settings
Submitter phabricator
Date July 4, 2021, 9:55 p.m.
Message ID <differential-rev-PHID-DREV-kexyb4vfgd7l6oh7v6ao-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/49289/
State Superseded
Headers show

Comments

phabricator - July 4, 2021, 9:55 p.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  This abstract the internal processing need for entry that would have an
  ambiguous mtime (If I understand things correctly).

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  mercurial/cext/parsers.c
  mercurial/dirstate.py
  mercurial/pure/parsers.py

CHANGE DETAILS




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

Patch

diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py
--- a/mercurial/pure/parsers.py
+++ b/mercurial/pure/parsers.py
@@ -153,6 +153,10 @@ 
         """return a "mtime" suitable for v1 serialization"""
         return self._mtime
 
+    def need_delay(self, now):
+        """True if the stored mtime would be ambiguous with the current time"""
+        return self._state == b'n' and self._mtime == now
+
 
 def gettype(q):
     return int(q & 0xFFFF)
diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -754,7 +754,7 @@ 
         if delaywrite > 0:
             # do we have any files to delay for?
             for f, e in pycompat.iteritems(self._map):
-                if e.state == b'n' and e[3] == now:
+                if e.need_delay(now):
                     import time  # to avoid useless import
 
                     # rather than sleep n seconds, sleep until the next
diff --git a/mercurial/cext/parsers.c b/mercurial/cext/parsers.c
--- a/mercurial/cext/parsers.c
+++ b/mercurial/cext/parsers.c
@@ -141,6 +141,20 @@ 
 	return PyInt_FromLong(self->mtime);
 };
 
+static PyObject *dirstatetuple_need_delay(dirstateTupleObject *self,
+                                          PyObject *value)
+{
+	long now;
+	if (!pylong_to_long(value, &now)) {
+		return NULL;
+	}
+	if (self->state == 'n' && self->mtime == now) {
+		Py_RETURN_TRUE;
+	} else {
+		Py_RETURN_FALSE;
+	}
+};
+
 static PyMethodDef dirstatetuple_methods[] = {
     {"v1_state", (PyCFunction)dirstatetuple_v1_state, METH_NOARGS,
      "return a \"state\" suitable for v1 serialization"},
@@ -150,6 +164,8 @@ 
      "return a \"size\" suitable for v1 serialization"},
     {"v1_mtime", (PyCFunction)dirstatetuple_v1_mtime, METH_NOARGS,
      "return a \"mtime\" suitable for v1 serialization"},
+    {"need_delay", (PyCFunction)dirstatetuple_need_delay, METH_O,
+     "True if the stored mtime would be ambiguous with the current time"},
     {NULL} /* Sentinel */
 };