Mercurial > public > mercurial-scm > hg-stable
diff mercurial/revlogutils/sidedata.py @ 43034:294afb982a88
sidedata: add a function to read sidedata from revlog raw text
This implement the "reading" part of a `sidedata` flag processor.
Differential Revision: https://phab.mercurial-scm.org/D6890
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 04 Sep 2019 00:59:15 +0200 |
parents | 21025a4107d4 |
children | ea83abf95630 |
line wrap: on
line diff
--- a/mercurial/revlogutils/sidedata.py Mon Sep 09 14:03:12 2019 +0200 +++ b/mercurial/revlogutils/sidedata.py Wed Sep 04 00:59:15 2019 +0200 @@ -32,3 +32,32 @@ """ from __future__ import absolute_import + +import hashlib +import struct + +from .. import error + +SIDEDATA_HEADER = struct.Struct('>H') +SIDEDATA_ENTRY = struct.Struct('>HL20s') + +def sidedatareadprocessor(rl, text): + sidedata = {} + offset = 0 + nbentry, = SIDEDATA_HEADER.unpack(text[:SIDEDATA_HEADER.size]) + offset += SIDEDATA_HEADER.size + dataoffset = SIDEDATA_HEADER.size + (SIDEDATA_ENTRY.size * nbentry) + for i in range(nbentry): + nextoffset = offset + SIDEDATA_ENTRY.size + key, size, storeddigest = SIDEDATA_ENTRY.unpack(text[offset:nextoffset]) + offset = nextoffset + # read the data associated with that entry + nextdataoffset = dataoffset + size + entrytext = text[dataoffset:nextdataoffset] + readdigest = hashlib.sha1(entrytext).digest() + if storeddigest != readdigest: + raise error.SidedataHashError(key, storeddigest, readdigest) + sidedata[key] = entrytext + dataoffset = nextdataoffset + text = text[dataoffset:] + return text, True, sidedata