# HG changeset patch # User pacien # Date 1644236638 -3600 # Node ID 1bb62821f080a49bcb4c3692746a4fc83e832151 # Parent 7dd5a2c0116ac234e939a015062c3f4ea68dea38 revlog: register changelogv2 C implementation in parsers This allows Python code to make use of the C implementation of the changelogv2 base operations when the C extensions are enabled. The `format_version` values are now shared between the C and Python sides, avoiding an additional translation for the selection of the format version to use. Differential Revision: https://phab.mercurial-scm.org/D12179 diff -r 7dd5a2c0116a -r 1bb62821f080 mercurial/cext/revlog.c --- a/mercurial/cext/revlog.c Mon Feb 14 12:34:02 2022 +0100 +++ b/mercurial/cext/revlog.c Mon Feb 07 13:23:58 2022 +0100 @@ -103,8 +103,7 @@ */ long rust_ext_compat; /* compatibility with being used in rust extensions */ - char format_version; /* size of index headers. Differs in v1 v.s. v2 - format */ + long format_version; /* format version selector (format_*) */ }; static Py_ssize_t index_length(const indexObject *self) @@ -133,9 +132,14 @@ /* A Revlogv2 index entry is 96 bytes long. */ static const long v2_entry_size = 96; -static const long format_v1 = 1; /* Internal only, could be any number */ -static const long format_v2 = 2; /* Internal only, could be any number */ -static const long format_cl2 = 3; /* Internal only, could be any number */ +/* A Changelogv2 index entry is 96 bytes long. */ +static const long cl2_entry_size = 96; + +/* Internal format version. + * Must match their counterparts in revlogutils/constants.py */ +static const long format_v1 = 1; /* constants.py: REVLOGV1 */ +static const long format_v2 = 0xDEAD; /* constants.py: REVLOGV2 */ +static const long format_cl2 = 0xD34D; /* constants.py: CHANGELOGV2 */ static const long entry_v1_offset_high = 0; static const long entry_v1_offset_offset_flags = 4; @@ -2979,10 +2983,10 @@ static int index_init(indexObject *self, PyObject *args, PyObject *kwargs) { - PyObject *data_obj, *inlined_obj, *revlogv2; + PyObject *data_obj, *inlined_obj; Py_ssize_t size; - static char *kwlist[] = {"data", "inlined", "revlogv2", NULL}; + static char *kwlist[] = {"data", "inlined", "format", NULL}; /* Initialize before argument-checking to avoid index_dealloc() crash. */ @@ -2999,10 +3003,11 @@ self->nodelen = 20; self->nullentry = NULL; self->rust_ext_compat = 1; - - revlogv2 = NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|O", kwlist, - &data_obj, &inlined_obj, &revlogv2)) + self->format_version = format_v1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|l", kwlist, + &data_obj, &inlined_obj, + &(self->format_version))) return -1; if (!PyObject_CheckBuffer(data_obj)) { PyErr_SetString(PyExc_TypeError, @@ -3014,12 +3019,12 @@ return -1; } - if (revlogv2 && PyObject_IsTrue(revlogv2)) { - self->format_version = format_v2; + if (self->format_version == format_v1) { + self->entry_size = v1_entry_size; + } else if (self->format_version == format_v2) { self->entry_size = v2_entry_size; - } else { - self->format_version = format_v1; - self->entry_size = v1_entry_size; + } else if (self->format_version == format_cl2) { + self->entry_size = cl2_entry_size; } self->nullentry = diff -r 7dd5a2c0116a -r 1bb62821f080 mercurial/pure/parsers.py --- a/mercurial/pure/parsers.py Mon Feb 14 12:34:02 2022 +0100 +++ b/mercurial/pure/parsers.py Mon Feb 07 13:23:58 2022 +0100 @@ -799,9 +799,14 @@ return self._offsets[i] -def parse_index2(data, inline, revlogv2=False): +def parse_index2(data, inline, format=revlog_constants.REVLOGV1): + if format == revlog_constants.CHANGELOGV2: + return parse_index_cl_v2(data) if not inline: - cls = IndexObject2 if revlogv2 else IndexObject + if format == revlog_constants.REVLOGV2: + cls = IndexObject2 + else: + cls = IndexObject return cls(data), None cls = InlinedIndexObject return cls(data, inline), (0, data) diff -r 7dd5a2c0116a -r 1bb62821f080 mercurial/revlog.py --- a/mercurial/revlog.py Mon Feb 14 12:34:02 2022 +0100 +++ b/mercurial/revlog.py Mon Feb 07 13:23:58 2022 +0100 @@ -103,6 +103,7 @@ REVLOGV0 REVLOGV1 REVLOGV2 +CHANGELOGV2 FLAG_INLINE_DATA FLAG_GENERALDELTA REVLOG_DEFAULT_FLAGS @@ -201,16 +202,13 @@ def parse_index_v2(data, inline): # call the C implementation to parse the index data - index, cache = parsers.parse_index2(data, inline, revlogv2=True) + index, cache = parsers.parse_index2(data, inline, format=REVLOGV2) return index, cache def parse_index_cl_v2(data, inline): # call the C implementation to parse the index data - assert not inline - from .pure.parsers import parse_index_cl_v2 - - index, cache = parse_index_cl_v2(data) + index, cache = parsers.parse_index2(data, inline, format=CHANGELOGV2) return index, cache diff -r 7dd5a2c0116a -r 1bb62821f080 tests/test-parseindex2.py --- a/tests/test-parseindex2.py Mon Feb 14 12:34:02 2022 +0100 +++ b/tests/test-parseindex2.py Mon Feb 07 13:23:58 2022 +0100 @@ -134,8 +134,8 @@ ) -def parse_index2(data, inline, revlogv2=False): - index, chunkcache = parsers.parse_index2(data, inline, revlogv2=revlogv2) +def parse_index2(data, inline, format=constants.REVLOGV1): + index, chunkcache = parsers.parse_index2(data, inline, format=format) return list(index), chunkcache