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 ) |