diff --git a/mercurial/cext/revlog.c b/mercurial/cext/revlog.c --- a/mercurial/cext/revlog.c +++ b/mercurial/cext/revlog.c @@ -103,8 +103,7 @@ struct indexObjectStruct { */ 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 @@ static const long v1_entry_size = 64; /* 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 Py_ssize_t inline_scan(indexObjec 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 @@ static int index_init(indexObject *self, 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 @@ static int index_init(indexObject *self, 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 --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py --- a/mercurial/pure/parsers.py +++ b/mercurial/pure/parsers.py @@ -799,9 +799,14 @@ class InlinedIndexObject(BaseIndexObject 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 --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -103,6 +103,7 @@ from .utils import ( REVLOGV0 REVLOGV1 REVLOGV2 +CHANGELOGV2 FLAG_INLINE_DATA FLAG_GENERALDELTA REVLOG_DEFAULT_FLAGS @@ -201,16 +202,13 @@ def parse_index_v1(data, inline): 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 --git a/tests/test-parseindex2.py b/tests/test-parseindex2.py --- a/tests/test-parseindex2.py +++ b/tests/test-parseindex2.py @@ -134,8 +134,8 @@ data_non_inlined = ( ) -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