parsers: ensure revlog index node tree is initialized before insertion
Currently, the revlog index C implementation assumes its node tree will be
initialized before a new element is inserted by revnum. For example, revlog.py
executes 'self.index.insert(-1, e)' in _addrevision(). This is only safe
because the node tree has been initialized by a "node in self.nodemap"
check made in addrevision().
(For context, this was discovered while developing an experimental revlog
mixin which stores "elided nodes" via a separate code path from
_addrevision(); that new code path segfaults without this patch.)
--- a/mercurial/parsers.c Wed Dec 03 22:56:42 2014 +0900
+++ b/mercurial/parsers.c Thu Dec 04 12:02:02 2014 -0500
@@ -1978,6 +1978,9 @@
PyErr_SetString(PyExc_ValueError, "rev out of range");
return -1;
}
+
+ if (nt_init(self) == -1)
+ return -1;
return nt_insert(self, node, (int)rev);
}