diff --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -310,3 +310,33 @@ return block_map[id(item)] else: return _transform_rev(item) + + +def parse_data(data): + """parse serialized nodemap data into a nodemap Trie""" + if (len(data) % S_BLOCK.size) != 0: + msg = "nodemap data size is not a multiple of block size (%d): %d" + raise error.Abort(msg % (S_BLOCK.size, len(data))) + if not data: + return Block() + block_map = {} + for i in range(0, len(data), S_BLOCK.size): + block = _parse_block(block_map, data[i : i + S_BLOCK.size]) + return block + + +def _parse_block(block_map, block_data): + """Parse the serialization of an individual block + """ + block = Block() + ondisk_id = len(block_map) + block_map[ondisk_id] = block + values = S_BLOCK.unpack(block_data) + for idx, v in enumerate(values): + if v == NO_ENTRY: + continue + elif v >= 0: + block[idx] = block_map[v] + else: + block[idx] = _transform_rev(v) + return block