115
def _inventory_to_objects(inv, parent_invs, parent_invshamaps,
116
unusual_modes, iter_files_bytes):
117
"""Iterate over the objects that were introduced in a revision.
119
:param inv: Inventory to process
120
:param parent_invs: parent inventory SHA maps
121
:param parent_invshamaps: parent inventory SHA Map
122
:param unusual_modes: Unusual file modes
123
:param iter_files_bytes: Repository.iter_files_bytes-like callback
124
:return: Yields (path, object) entries
129
for path, ie in inv.entries():
130
if ie.kind in ("file", "symlink"):
131
for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
133
pie = pinv[ie.file_id]
134
except errors.NoSuchId:
137
if (pie.kind == ie.kind and
138
pie.text_sha1 == ie.text_sha1):
139
shamap[ie.file_id] = pinvshamap.lookup_blob(
140
pie.file_id, pie.revision)
143
if ie.kind == "file":
144
new_blobs.append((path, ie))
146
blob = symlink_to_blob(ie)
148
shamap[ie.file_id] = blob.id
149
new_trees[urlutils.dirname(path)] = ie.parent_id
150
elif ie.kind == "directory":
151
for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
153
pie = pinv[ie.file_id]
154
except errors.NoSuchId:
157
if (pie.kind == ie.kind and
158
pie.children.keys() == ie.children.keys()):
160
shamap[ie.file_id] = pinvshamap.lookup_tree(
162
except NotImplementedError:
167
new_trees[path] = ie.file_id
169
raise AssertionError(ie.kind)
171
for (path, fid), chunks in iter_files_bytes(
172
[(ie.file_id, ie.revision, (path, ie.file_id)) for (path, ie) in new_blobs]):
174
obj.data = "".join(chunks)
178
for fid in unusual_modes:
179
new_trees[inv.id2path(fid)] = inv[fid].parent_id
183
items = new_trees.items()
185
for path, file_id in items:
186
parent_id = inv[file_id].parent_id
187
if parent_id is not None:
188
parent_path = urlutils.dirname(path)
189
new_trees[parent_path] = parent_id
190
trees[path] = file_id
192
for path in sorted(trees.keys(), reverse=True):
193
ie = inv[trees[path]]
194
assert ie.kind == "directory"
195
obj = directory_to_tree(ie,
196
lambda ie: shamap[ie.file_id], unusual_modes)
198
shamap[ie.file_id] = obj.id
115
202
class BazaarObjectStore(BaseObjectStore):
116
203
"""A Git-style object store backed onto a Bazaar repository."""
176
263
return self.mapping.export_commit(rev, tree_sha, parent_lookup)
178
def _inventory_to_objects(self, inv, parent_invs, parent_invshamaps,
180
"""Iterate over the objects that were introduced in a revision.
182
:param inv: Inventory to process
183
:param parent_invs: parent inventory SHA maps
184
:param parent_invshamaps: parent inventory SHA Map
185
:param unusual_modes: Unusual file modes
186
:return: Yields (path, object) entries
191
for path, ie in inv.entries():
192
if ie.kind in ("file", "symlink"):
193
for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
195
pie = pinv[ie.file_id]
196
except errors.NoSuchId:
199
if (pie.kind == ie.kind and
200
pie.text_sha1 == ie.text_sha1):
201
shamap[ie.file_id] = pinvshamap.lookup_blob(
202
pie.file_id, pie.revision)
205
if ie.kind == "file":
208
blob = symlink_to_blob(ie)
210
shamap[ie.file_id] = blob.id
211
new_trees[urlutils.dirname(path)] = ie.parent_id
212
elif ie.kind == "directory":
213
for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
215
pie = pinv[ie.file_id]
216
except errors.NoSuchId:
219
if (pie.kind == ie.kind and
220
pie.children.keys() == ie.children.keys()):
222
shamap[ie.file_id] = pinvshamap.lookup_tree(
224
except NotImplementedError:
229
new_trees[path] = ie.file_id
231
raise AssertionError(ie.kind)
233
for ie, chunks in self.repository.iter_files_bytes(
234
[(ie.file_id, ie.revision, ie) for ie in new_blobs]):
236
obj._text = "".join(chunks)
238
shamap[ie.file_id] = obj.id
240
for fid in unusual_modes:
241
new_trees[inv.id2path(fid)] = inv[fid].parent_id
245
items = new_trees.items()
247
for path, file_id in items:
248
parent_id = inv[file_id].parent_id
249
if parent_id is not None:
250
parent_path = urlutils.dirname(path)
251
new_trees[parent_path] = parent_id
252
trees[path] = file_id
254
for path in sorted(trees.keys(), reverse=True):
255
ie = inv[trees[path]]
256
assert ie.kind == "directory"
257
obj = directory_to_tree(ie,
258
lambda ie: shamap[ie.file_id], unusual_modes)
260
shamap[ie.file_id] = obj.id
263
265
def _revision_to_objects(self, rev, inv):
264
266
unusual_modes = extract_unusual_modes(rev)
265
267
present_parents = self.repository.has_revisions(rev.parent_ids)
267
269
[p for p in rev.parent_ids if p in present_parents])
268
270
parent_invshamaps = [self._idmap.get_inventory_sha_map(r) for r in rev.parent_ids if r in present_parents]
270
for path, obj in self._inventory_to_objects(inv, parent_invs,
271
parent_invshamaps, unusual_modes):
272
for path, obj in _inventory_to_objects(inv, parent_invs,
273
parent_invshamaps, unusual_modes,
274
self.repository.iter_files_bytes):
274
277
tree_sha = obj.id