diff -r 824ee4aaa09b -r 0d8ff1f4ab0c mercurial/cext/revlog.c --- a/mercurial/cext/revlog.c Thu Apr 15 12:08:34 2021 +0200 +++ b/mercurial/cext/revlog.c Thu Apr 08 00:01:11 2021 +0200 @@ -342,6 +342,38 @@ sidedata_offset, sidedata_comp_len); } } +/* + * Return the raw binary string representing a revision + */ +static PyObject *index_entry_binary(indexObject *self, PyObject *args) +{ + long rev; + int header; + const char *data; + char entry[v2_hdrsize]; + + Py_ssize_t length = index_length(self); + + if (!PyArg_ParseTuple(args, "lI", &rev, &header)) { + return NULL; + } + if (rev < 0 || rev >= length) { + PyErr_Format(PyExc_ValueError, "revlog index out of range: %ld", + rev); + return NULL; + }; + + data = index_deref(self, rev); + if (data == NULL) + return NULL; + if (rev == 0) { + // put the header at the start of the first entry + memcpy(entry, data, self->hdrsize); + putbe32(header, entry); + return PyBytes_FromStringAndSize(entry, self->hdrsize); + } + return PyBytes_FromStringAndSize(data, self->hdrsize); +} /* * Return the hash of node corresponding to the given rev. @@ -2859,6 +2891,8 @@ {"shortest", (PyCFunction)index_shortest, METH_VARARGS, "find length of shortest hex nodeid of a binary ID"}, {"stats", (PyCFunction)index_stats, METH_NOARGS, "stats for the index"}, + {"entry_binary", (PyCFunction)index_entry_binary, METH_VARARGS, + "return an entry in binary form"}, {NULL} /* Sentinel */ };