Patchwork D2695: osutil: implement minimal __getitem__ compatibility on our custom listdir type

login
register
mail settings
Submitter phabricator
Date March 6, 2018, 6:58 p.m.
Message ID <d3c31e646cfceb3c1c4d9f8259abce2d@localhost.localdomain>
Download mbox | patch
Permalink /patch/29073/
State Not Applicable
Headers show

Comments

phabricator - March 6, 2018, 6:58 p.m.
durin42 updated this revision to Diff 6675.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2695?vs=6655&id=6675

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

AFFECTED FILES
  mercurial/cext/osutil.c
  mercurial/policy.py

CHANGE DETAILS




To: durin42, #hg-reviewers, indygreg
Cc: mharbison72, indygreg, mercurial-devel

Patch

diff --git a/mercurial/policy.py b/mercurial/policy.py
--- a/mercurial/policy.py
+++ b/mercurial/policy.py
@@ -69,7 +69,7 @@ 
     (r'cext', r'bdiff'): 3,
     (r'cext', r'diffhelpers'): 1,
     (r'cext', r'mpatch'): 1,
-    (r'cext', r'osutil'): 3,
+    (r'cext', r'osutil'): 4,
     (r'cext', r'parsers'): 4,
 }
 
diff --git a/mercurial/cext/osutil.c b/mercurial/cext/osutil.c
--- a/mercurial/cext/osutil.c
+++ b/mercurial/cext/osutil.c
@@ -121,6 +121,27 @@ 
 	o->ob_type->tp_free(o);
 }
 
+static PyObject *listdir_stat_getitem(PyObject *self, PyObject *key)
+{
+	long index = PyInt_AsLong(key);
+	if (index == -1 && PyErr_Occurred()) {
+		return NULL;
+	}
+	if (index != 8) {
+		PyErr_Format(PyExc_IndexError, "osutil.stat objects only "
+		                               "support stat.ST_MTIME in "
+		                               "__getitem__");
+		return NULL;
+	}
+	return listdir_stat_st_mtime(self, NULL);
+}
+
+static PyMappingMethods listdir_stat_type_mapping_methods = {
+	(lenfunc)NULL,             /* mp_length */
+	(binaryfunc)listdir_stat_getitem,       /* mp_subscript */
+	(objobjargproc)NULL,    /* mp_ass_subscript */
+};
+
 static PyTypeObject listdir_stat_type = {
 	PyVarObject_HEAD_INIT(NULL, 0) /* header */
 	"osutil.stat",             /*tp_name*/
@@ -134,7 +155,7 @@ 
 	0,                         /*tp_repr*/
 	0,                         /*tp_as_number*/
 	0,                         /*tp_as_sequence*/
-	0,                         /*tp_as_mapping*/
+	&listdir_stat_type_mapping_methods, /*tp_as_mapping*/
 	0,                         /*tp_hash */
 	0,                         /*tp_call*/
 	0,                         /*tp_str*/
@@ -1352,7 +1373,7 @@ 
 	{NULL, NULL}
 };
 
-static const int version = 3;
+static const int version = 4;
 
 #ifdef IS_PY3K
 static struct PyModuleDef osutil_module = {