mercurial/revlogutils/nodemap.py
changeset 44317 78721bbdb2ab
parent 44316 55b12f2593c1
child 44318 20e125cdd719
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