comparison mercurial/revlogutils/sidedata.py @ 47085:3aab2330b7d3

sidedata: move sidedata-related utils to the dedicated module Differential Revision: https://phab.mercurial-scm.org/D10360
author Rapha?l Gom?s <rgomes@octobus.net>
date Mon, 19 Apr 2021 11:22:24 +0200
parents 3d740058b467
children 8bd769b5c941
comparison
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 )