--- a/mercurial/parsers.c Thu Jun 26 11:10:28 2014 -0400
+++ b/mercurial/parsers.c Tue May 27 15:17:38 2014 -0700
@@ -261,7 +261,7 @@
static PyObject *pack_dirstate(PyObject *self, PyObject *args)
{
PyObject *packobj = NULL;
- PyObject *map, *copymap, *pl;
+ PyObject *map, *copymap, *pl, *mtime_unset = NULL;
Py_ssize_t nbytes, pos, l;
PyObject *k, *v, *pn;
char *p, *s;
@@ -342,9 +342,15 @@
if (*s == 'n' && mtime == (uint32_t)now) {
/* See pure/parsers.py:pack_dirstate for why we do
* this. */
- if (PyDict_SetItem(map, k, dirstate_unset) == -1)
+ mtime = -1;
+ mtime_unset = Py_BuildValue(
+ "ciii", *s, mode, size, mtime);
+ if (!mtime_unset)
goto bail;
- mtime = -1;
+ if (PyDict_SetItem(map, k, mtime_unset) == -1)
+ goto bail;
+ Py_DECREF(mtime_unset);
+ mtime_unset = NULL;
}
putbe32(mode, p);
putbe32(size, p + 4);
@@ -374,6 +380,7 @@
return packobj;
bail:
+ Py_XDECREF(mtime_unset);
Py_XDECREF(packobj);
return NULL;
}