Patchwork D10951: dirstate-entry: introduce dedicated accessors for v1 serialization

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

Comments

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

REVISION SUMMARY
  In the spirit of changing the content and storage of the dirstate entry, we add
  new method that the code doing v1 serialisation can use.
  
  Adding such method to the C object is quite trivial.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  mercurial/cext/parsers.c
  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
@@ -64,6 +64,22 @@ 
         else:
             raise IndexError(idx)
 
+    def v1_state(self):
+        """return a "state" suitable for v1 serialization"""
+        return self._state
+
+    def v1_mode(self):
+        """return a "mode" suitable for v1 serialization"""
+        return self._mode
+
+    def v1_size(self):
+        """return a "size" suitable for v1 serialization"""
+        return self._size
+
+    def v1_mtime(self):
+        """return a "mtime" suitable for v1 serialization"""
+        return self._mtime
+
 
 def gettype(q):
     return int(q & 0xFFFF)
@@ -450,7 +466,14 @@ 
 
         if f in copymap:
             f = b"%s\0%s" % (f, copymap[f])
-        e = _pack(b">cllll", e[0], e[1], e[2], e[3], len(f))
+        e = _pack(
+            b">cllll",
+            e.v1_state(),
+            e.v1_mode(),
+            e.v1_size(),
+            e.v1_mtime(),
+            len(f),
+        )
         write(e)
         write(f)
     return cs.getvalue()
diff --git a/mercurial/cext/parsers.c b/mercurial/cext/parsers.c
--- a/mercurial/cext/parsers.c
+++ b/mercurial/cext/parsers.c
@@ -118,6 +118,38 @@ 
     0                      /* sq_inplace_repeat */
 };
 
+static PyObject *dirstatetuple_v1_state(dirstateTupleObject *self)
+{
+	return PyBytes_FromStringAndSize(&self->state, 1);
+};
+
+static PyObject *dirstatetuple_v1_mode(dirstateTupleObject *self)
+{
+	return PyInt_FromLong(self->mode);
+};
+
+static PyObject *dirstatetuple_v1_size(dirstateTupleObject *self)
+{
+	return PyInt_FromLong(self->size);
+};
+
+static PyObject *dirstatetuple_v1_mtime(dirstateTupleObject *self)
+{
+	return PyInt_FromLong(self->mtime);
+};
+
+static PyMethodDef dirstatetuple_methods[] = {
+    {"v1_state", (PyCFunction)dirstatetuple_v1_state, METH_NOARGS,
+     "return a \"state\" suitable for v1 serialization"},
+    {"v1_mode", (PyCFunction)dirstatetuple_v1_mode, METH_NOARGS,
+     "return a \"mode\" suitable for v1 serialization"},
+    {"v1_size", (PyCFunction)dirstatetuple_v1_size, METH_NOARGS,
+     "return a \"size\" suitable for v1 serialization"},
+    {"v1_mtime", (PyCFunction)dirstatetuple_v1_mtime, METH_NOARGS,
+     "return a \"mtime\" suitable for v1 serialization"},
+    {NULL} /* Sentinel */
+};
+
 PyTypeObject dirstateTupleType = {
     PyVarObject_HEAD_INIT(NULL, 0)      /* header */
     "dirstate_tuple",                   /* tp_name */
@@ -146,7 +178,7 @@ 
     0,                                  /* tp_weaklistoffset */
     0,                                  /* tp_iter */
     0,                                  /* tp_iternext */
-    0,                                  /* tp_methods */
+    dirstatetuple_methods,              /* tp_methods */
     0,                                  /* tp_members */
     0,                                  /* tp_getset */
     0,                                  /* tp_base */