mercurial/revlogutils/sidedata.py
changeset 47085 3aab2330b7d3
parent 46709 3d740058b467
child 47086 8bd769b5c941
equal deleted inserted replaced
47084:27f1191b1305 47085:3aab2330b7d3
    30 the concept.
    30 the concept.
    31 """
    31 """
    32 
    32 
    33 from __future__ import absolute_import
    33 from __future__ import absolute_import
    34 
    34 
       
    35 import collections
    35 import struct
    36 import struct
    36 
    37 
    37 from .. import error
    38 from .. import error, requirements as requirementsmod
       
    39 from ..revlogutils import constants, flagutil
    38 from ..utils import hashutil
    40 from ..utils import hashutil
    39 
    41 
    40 ## sidedata type constant
    42 ## sidedata type constant
    41 # reserve a block for testing purposes.
    43 # reserve a block for testing purposes.
    42 SD_TEST1 = 1
    44 SD_TEST1 = 1
    89         if storeddigest != readdigest:
    91         if storeddigest != readdigest:
    90             raise error.SidedataHashError(key, storeddigest, readdigest)
    92             raise error.SidedataHashError(key, storeddigest, readdigest)
    91         sidedata[key] = entrytext
    93         sidedata[key] = entrytext
    92         dataoffset = nextdataoffset
    94         dataoffset = nextdataoffset
    93     return sidedata
    95     return sidedata
       
    96 
       
    97 
       
    98 def get_sidedata_helpers(repo, remote_sd_categories, pull=False):
       
    99     # Computers for computing sidedata on-the-fly
       
   100     sd_computers = collections.defaultdict(list)
       
   101     # Computers for categories to remove from sidedata
       
   102     sd_removers = collections.defaultdict(list)
       
   103     to_generate = remote_sd_categories - repo._wanted_sidedata
       
   104     to_remove = repo._wanted_sidedata - remote_sd_categories
       
   105     if pull:
       
   106         to_generate, to_remove = to_remove, to_generate
       
   107 
       
   108     for revlog_kind, computers in repo._sidedata_computers.items():
       
   109         for category, computer in computers.items():
       
   110             if category in to_generate:
       
   111                 sd_computers[revlog_kind].append(computer)
       
   112             if category in to_remove:
       
   113                 sd_removers[revlog_kind].append(computer)
       
   114 
       
   115     sidedata_helpers = (repo, sd_computers, sd_removers)
       
   116     return sidedata_helpers
       
   117 
       
   118 
       
   119 def run_sidedata_helpers(store, sidedata_helpers, sidedata, rev):
       
   120     """Returns the sidedata for the given revision after running through
       
   121     the given helpers.
       
   122     - `store`: the revlog this applies to (changelog, manifest, or filelog
       
   123       instance)
       
   124     - `sidedata_helpers`: see `storageutil.emitrevisions`
       
   125     - `sidedata`: previous sidedata at the given rev, if any
       
   126     - `rev`: affected rev of `store`
       
   127     """
       
   128     repo, sd_computers, sd_removers = sidedata_helpers
       
   129     kind = store.revlog_kind
       
   130     flags_to_add = 0
       
   131     flags_to_remove = 0
       
   132     for _keys, sd_computer, _flags in sd_computers.get(kind, []):
       
   133         sidedata, flags = sd_computer(repo, store, rev, sidedata)
       
   134         flags_to_add |= flags[0]
       
   135         flags_to_remove |= flags[1]
       
   136     for keys, _computer, flags in sd_removers.get(kind, []):
       
   137         for key in keys:
       
   138             sidedata.pop(key, None)
       
   139         flags_to_remove |= flags
       
   140     return sidedata, (flags_to_add, flags_to_remove)
       
   141 
       
   142 
       
   143 def set_sidedata_spec_for_repo(repo):
       
   144     # prevent cycle metadata -> revlogutils.sidedata -> metadata
       
   145     from .. import metadata
       
   146 
       
   147     if requirementsmod.COPIESSDC_REQUIREMENT in repo.requirements:
       
   148         repo.register_wanted_sidedata(SD_FILES)
       
   149     repo.register_sidedata_computer(
       
   150         constants.KIND_CHANGELOG,
       
   151         SD_FILES,
       
   152         (SD_FILES,),
       
   153         metadata.copies_sidedata_computer,
       
   154         flagutil.REVIDX_HASCOPIESINFO,
       
   155     )