Mercurial > public > mercurial-scm > hg
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 ) |