115
115
def _inventory_to_objects(inv, parent_invs, parent_invshamaps,
116
unusual_modes, iter_files_bytes):
116
unusual_modes, iter_files_bytes, has_ghost_parents):
117
117
"""Iterate over the objects that were introduced in a revision.
119
119
:param inv: Inventory to process
129
129
for path, ie in inv.entries():
130
if ie.kind in ("file", "symlink"):
131
for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
130
if ie.kind == "file":
131
if ie.revision == inv.revision_id:
132
new_blobs.append((path, ie))
133
new_trees[urlutils.dirname(path)] = ie.parent_id
134
elif has_ghost_parents:
135
for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
137
pie = pinv[ie.file_id]
138
except errors.NoSuchId:
141
if (pie.kind == ie.kind and
142
pie.text_sha1 == ie.text_sha1):
143
shamap[ie.file_id] = pinvshamap.lookup_blob(
144
pie.file_id, pie.revision)
147
new_blobs.append((path, ie))
148
new_trees[urlutils.dirname(path)] = ie.parent_id
149
elif ie.kind == "symlink":
150
blob = symlink_to_blob(ie)
151
for pinv in parent_invs:
133
153
pie = pinv[ie.file_id]
134
154
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)
157
if (ie.kind == pie.kind and
158
ie.symlink_target == pie.symlink_target):
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
162
shamap[ie.file_id] = blob.id
163
new_trees[urlutils.dirname(path)] = ie.parent_id
150
164
elif ie.kind == "directory":
151
165
for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
169
183
raise AssertionError(ie.kind)
171
185
for (path, fid), chunks in iter_files_bytes(
172
[(ie.file_id, ie.revision, (path, ie.file_id)) for (path, ie) in new_blobs]):
186
[(ie.file_id, ie.revision, (path, ie.file_id))
187
for (path, ie) in new_blobs]):
174
189
obj.data = "".join(chunks)
176
191
shamap[fid] = obj.id
193
assert all([ie.file_id in shamap for (path, ie) in new_blobs])
178
195
for fid in unusual_modes:
179
196
new_trees[inv.id2path(fid)] = inv[fid].parent_id
265
282
def _revision_to_objects(self, rev, inv):
266
283
unusual_modes = extract_unusual_modes(rev)
267
284
present_parents = self.repository.has_revisions(rev.parent_ids)
285
has_ghost_parents = (len(rev.parent_ids) < len(present_parents))
268
286
parent_invs = self.parent_invs_cache.get_inventories(
269
287
[p for p in rev.parent_ids if p in present_parents])
270
288
parent_invshamaps = [self._idmap.get_inventory_sha_map(r) for r in rev.parent_ids if r in present_parents]
272
290
for path, obj in _inventory_to_objects(inv, parent_invs,
273
291
parent_invshamaps, unusual_modes,
274
self.repository.iter_files_bytes):
292
self.repository.iter_files_bytes, has_ghost_parents):
277
295
tree_sha = obj.id