# HG changeset patch # User Augie Fackler # Date 1520280452 18000 # Node ID f3c314020beb0e6097c93dde3e8d025c4b8a46ec # Parent bf9a04d780846028f90e1477b01d9a66c60a258c osutil: implement minimal __getitem__ compatibility on our custom listdir type We previously declined to do this, but the removal of the deprecated os.stat_float_times() method in Python 3.7 forces our hand. Differential Revision: https://phab.mercurial-scm.org/D2695 diff -r bf9a04d78084 -r f3c314020beb mercurial/cext/osutil.c --- a/mercurial/cext/osutil.c Sun Mar 04 21:14:24 2018 -0500 +++ b/mercurial/cext/osutil.c Mon Mar 05 15:07:32 2018 -0500 @@ -121,6 +121,27 @@ o->ob_type->tp_free(o); } +static PyObject *listdir_stat_getitem(PyObject *self, PyObject *key) +{ + long index = PyLong_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 = { diff -r bf9a04d78084 -r f3c314020beb mercurial/policy.py --- a/mercurial/policy.py Sun Mar 04 21:14:24 2018 -0500 +++ b/mercurial/policy.py Mon Mar 05 15:07:32 2018 -0500 @@ -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, }