Mercurial > public > mercurial-scm > hg
comparison mercurial/revlogutils/nodemap.py @ 44317:78721bbdb2ab
nodemap: code to parse the persistent binary nodemap data
We now have code to read back what we persisted. This will be put to use in
later changesets.
Differential Revision: https://phab.mercurial-scm.org/D7844
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 15 Jan 2020 15:48:47 +0100 |
parents | 55b12f2593c1 |
children | 20e125cdd719 |
comparison
equal
deleted
inserted
replaced
44316:55b12f2593c1 | 44317:78721bbdb2ab |
---|---|
308 return NO_ENTRY | 308 return NO_ENTRY |
309 elif isinstance(item, dict): | 309 elif isinstance(item, dict): |
310 return block_map[id(item)] | 310 return block_map[id(item)] |
311 else: | 311 else: |
312 return _transform_rev(item) | 312 return _transform_rev(item) |
313 | |
314 | |
315 def parse_data(data): | |
316 """parse parse nodemap data into a nodemap Trie""" | |
317 if (len(data) % S_BLOCK.size) != 0: | |
318 msg = "nodemap data size is not a multiple of block size (%d): %d" | |
319 raise error.Abort(msg % (S_BLOCK.size, len(data))) | |
320 if not data: | |
321 return Block() | |
322 block_map = {} | |
323 new_blocks = [] | |
324 for i in range(0, len(data), S_BLOCK.size): | |
325 block = Block() | |
326 ondisk_id = len(block_map) | |
327 block_map[ondisk_id] = block | |
328 block_data = data[i : i + S_BLOCK.size] | |
329 values = S_BLOCK.unpack(block_data) | |
330 new_blocks.append((block, values)) | |
331 for b, values in new_blocks: | |
332 for idx, v in enumerate(values): | |
333 if v == NO_ENTRY: | |
334 continue | |
335 elif v >= 0: | |
336 b[idx] = block_map[v] | |
337 else: | |
338 b[idx] = _transform_rev(v) | |
339 return block |