# HG changeset patch # User Pierre-Yves David # Date 2021-04-05 10:21:01 # Node ID cc65cea90edb704350e9987cf76a6953ea438f7c # Parent 34e1fa4b548aedabaea646a918cba471f5266484 revlog: move the details of revlog "v1" 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/D10304 diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py --- a/mercurial/pure/parsers.py +++ b/mercurial/pure/parsers.py @@ -17,6 +17,7 @@ from .. import ( ) from ..revlogutils import nodemap as nodemaputil +from ..revlogutils import constants as revlog_constants stringio = pycompat.bytesio @@ -43,13 +44,13 @@ def offset_type(offset, type): class BaseIndexObject(object): # Format of an index entry according to Python's `struct` language - index_format = b">Qiiiiii20s12x" + index_format = revlog_constants.INDEX_ENTRY_V1.format # Size of a C unsigned long long int, platform independent big_int_size = struct.calcsize(b'>Q') # Size of a C long int, platform independent int_size = struct.calcsize(b'>i') # Size of the entire index format - index_size = struct.calcsize(index_format) + index_size = revlog_constants.INDEX_ENTRY_V1.size # An empty index entry, used as a default value to be overridden, or nullrev null_item = (0, 0, 0, -1, -1, -1, -1, nullid) diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -42,6 +42,7 @@ from .revlogutils.constants import ( FLAG_GENERALDELTA, FLAG_INLINE_DATA, INDEX_ENTRY_V0, + INDEX_ENTRY_V1, REVLOGV0, REVLOGV1, REVLOGV1_FLAGS, @@ -326,18 +327,6 @@ class revlogoldio(object): return INDEX_ENTRY_V0.pack(*e2) -# index ng: -# 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 -indexformatng = struct.Struct(b">Qiiiiii20s12x") -indexformatng_pack = indexformatng.pack versionformat = struct.Struct(b">I") versionformat_pack = versionformat.pack versionformat_unpack = versionformat.unpack @@ -349,7 +338,7 @@ versionformat_unpack = versionformat.unp class revlogio(object): def __init__(self): - self.size = indexformatng.size + self.size = INDEX_ENTRY_V1.size def parseindex(self, data, inline): # call the C implementation to parse the index data @@ -357,7 +346,7 @@ class revlogio(object): return index, cache def packentry(self, entry, node, version, rev): - p = indexformatng_pack(*entry) + p = INDEX_ENTRY_V1.pack(*entry) if rev == 0: p = versionformat_pack(version) + p[4:] return p diff --git a/mercurial/revlogutils/constants.py b/mercurial/revlogutils/constants.py --- a/mercurial/revlogutils/constants.py +++ b/mercurial/revlogutils/constants.py @@ -44,6 +44,19 @@ REVLOGV2_FLAGS = FLAG_INLINE_DATA # 20 bytes: nodeid INDEX_ENTRY_V0 = struct.Struct(b">4l20s20s20s") +## index v1 +# 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 +INDEX_ENTRY_V1 = struct.Struct(b">Qiiiiii20s12x") +assert INDEX_ENTRY_V1.size == 32 * 2 + # revlog index flags # For historical reasons, revlog's internal flags were exposed via the