# HG changeset patch # User Pierre-Yves David # Date 1617618072 -7200 # Node ID 85e3a630cad9aea93a2548a0a0fe329be74f7a11 # Parent cc65cea90edb704350e9987cf76a6953ea438f7c revlog: move the details of revlog "v2" index inside revlog.utils.constants the revlog module is quite large and this kind of format information would handy for other module. So let us start to gather this information about the format in a more appropriate place. We update various reference to this information to use the new "source of truth" in the process. Differential Revision: https://phab.mercurial-scm.org/D10305 diff -r cc65cea90edb -r 85e3a630cad9 mercurial/pure/parsers.py --- a/mercurial/pure/parsers.py Mon Apr 05 12:21:01 2021 +0200 +++ b/mercurial/pure/parsers.py Mon Apr 05 12:21:12 2021 +0200 @@ -243,21 +243,8 @@ class Index2Mixin(object): - # 6 bytes: offset - # 2 bytes: flags - # 4 bytes: compressed length - # 4 bytes: uncompressed length - # 4 bytes: base rev - # 4 bytes: link rev - # 4 bytes: parent 1 rev - # 4 bytes: parent 2 rev - # 32 bytes: nodeid - # 8 bytes: sidedata offset - # 4 bytes: sidedata compressed length - # 20 bytes: Padding to align to 96 bytes (see RevlogV2Plan wiki page) - index_format = b">Qiiiiii20s12xQi20x" - index_size = struct.calcsize(index_format) - assert index_size == 96, index_size + index_format = revlog_constants.INDEX_ENTRY_V2.format + index_size = revlog_constants.INDEX_ENTRY_V2.size null_item = (0, 0, 0, -1, -1, -1, -1, nullid, 0, 0) def replace_sidedata_info(self, i, sidedata_offset, sidedata_length): diff -r cc65cea90edb -r 85e3a630cad9 mercurial/revlog.py --- a/mercurial/revlog.py Mon Apr 05 12:21:01 2021 +0200 +++ b/mercurial/revlog.py Mon Apr 05 12:21:12 2021 +0200 @@ -43,6 +43,7 @@ FLAG_INLINE_DATA, INDEX_ENTRY_V0, INDEX_ENTRY_V1, + INDEX_ENTRY_V2, REVLOGV0, REVLOGV1, REVLOGV1_FLAGS, @@ -87,7 +88,6 @@ storageutil, stringutil, ) -from .pure import parsers as pureparsers # blanked usage of all the name to prevent pyflakes constraints # We need these name available in the module for extensions. @@ -352,20 +352,16 @@ return p -indexformatv2 = struct.Struct(pureparsers.Index2Mixin.index_format) -indexformatv2_pack = indexformatv2.pack - - class revlogv2io(object): def __init__(self): - self.size = indexformatv2.size + self.size = INDEX_ENTRY_V2.size def parseindex(self, data, inline): index, cache = parsers.parse_index2(data, inline, revlogv2=True) return index, cache def packentry(self, entry, node, version, rev): - p = indexformatv2_pack(*entry) + p = INDEX_ENTRY_V2.pack(*entry) if rev == 0: p = versionformat_pack(version) + p[4:] return p diff -r cc65cea90edb -r 85e3a630cad9 mercurial/revlogutils/constants.py --- a/mercurial/revlogutils/constants.py Mon Apr 05 12:21:01 2021 +0200 +++ b/mercurial/revlogutils/constants.py Mon Apr 05 12:21:12 2021 +0200 @@ -57,6 +57,21 @@ INDEX_ENTRY_V1 = struct.Struct(b">Qiiiiii20s12x") assert INDEX_ENTRY_V1.size == 32 * 2 +# 6 bytes: offset +# 2 bytes: flags +# 4 bytes: compressed length +# 4 bytes: uncompressed length +# 4 bytes: base rev +# 4 bytes: link rev +# 4 bytes: parent 1 rev +# 4 bytes: parent 2 rev +# 32 bytes: nodeid +# 8 bytes: sidedata offset +# 4 bytes: sidedata compressed length +# 20 bytes: Padding to align to 96 bytes (see RevlogV2Plan wiki page) +INDEX_ENTRY_V2 = struct.Struct(b">Qiiiiii20s12xQi20x") +assert INDEX_ENTRY_V2.size == 32 * 3 + # revlog index flags # For historical reasons, revlog's internal flags were exposed via the