260
260
# Remember for next time
261
261
existing_children = set()
263
for child_mode, name, child_hexsha in tree.entries():
263
for name, child_mode, child_hexsha in tree.iteritems():
264
264
existing_children.add(name)
265
265
child_path = posixpath.join(path, name)
266
266
if type(base_tree) is Tree:
275
275
if stat.S_ISDIR(child_mode):
276
276
subinvdelta, grandchildmodes = import_git_tree(texts, mapping,
277
277
child_path, name, (child_base_hexsha, child_hexsha), base_inv,
278
file_id, revision_id, parent_invs, lookup_object,
278
file_id, revision_id, parent_invs, lookup_object,
279
279
(child_base_mode, child_mode), store_updater, lookup_file_id,
280
280
allow_submodules=allow_submodules)
281
281
elif S_ISGITLINK(child_mode): # submodule
307
307
def verify_commit_reconstruction(target_git_object_retriever, lookup_object,
308
o, rev, ret_tree, parent_trees, mapping, unusual_modes):
308
o, rev, ret_tree, parent_trees, mapping, unusual_modes, verifiers):
309
309
new_unusual_modes = mapping.export_unusual_file_modes(rev)
310
310
if new_unusual_modes != unusual_modes:
311
311
raise AssertionError("unusual modes don't match: %r != %r" % (
312
312
unusual_modes, new_unusual_modes))
313
313
# Verify that we can reconstruct the commit properly
314
rec_o = target_git_object_retriever._reconstruct_commit(rev, o.tree, True)
314
rec_o = target_git_object_retriever._reconstruct_commit(rev, o.tree, True,
316
317
raise AssertionError("Reconstructed commit differs: %r != %r" % (
378
379
rev.inventory_sha1, inv = repo.add_inventory_by_delta(basis_id,
379
380
inv_delta, rev.revision_id, rev.parent_ids, base_inv)
380
# FIXME: Check verifiers
381
382
testament = StrictTestament3(rev, inv)
382
383
calculated_verifiers = { "testament3-sha1": testament.as_sha1() }
383
384
if roundtrip_revid is not None:
396
397
if "verify" in debug.debug_flags:
397
398
verify_commit_reconstruction(target_git_object_retriever,
398
399
lookup_object, o, rev, ret_tree, parent_trees, mapping,
400
unusual_modes, verifiers)
402
403
def import_git_objects(repo, mapping, object_iter,
513
514
if revision_id is not None:
514
515
interesting_heads = [revision_id]
515
516
elif fetch_spec is not None:
516
interesting_heads = fetch_spec.heads
517
recipe = fetch_spec.get_recipe()
518
if recipe[0] in ("search", "proxy-search"):
519
interesting_heads = recipe[1]
521
raise AssertionError("Unsupported search result type %s" % recipe[0])
518
523
interesting_heads = None
519
524
def determine_wants(refs):
520
525
if interesting_heads is None:
521
ret = [sha for (ref, sha) in refs.iteritems() if not ref.endswith("^{}")]
526
todo = [(sha, None) for (ref, sha) in refs.iteritems() if not ref.endswith("^{}")]
523
ret = [self.source.lookup_bzr_revision_id(revid)[0] for revid in interesting_heads if revid not in (None, NULL_REVISION)]
524
return [rev for rev in ret if not self.target.has_revision(self.source.lookup_foreign_revision_id(rev))]
525
(pack_hint, _, remote_refs) = self.fetch_objects(determine_wants, mapping, pb)
528
todo = [(self.source.lookup_bzr_revision_id(revid)[0], revid) for revid in interesting_heads if revid not in (None, NULL_REVISION)]
530
for (sha, revid) in todo:
532
revid = self.source.lookup_foreign_revision_id(sha)
533
if not self.target.has_revision(revid):
537
(pack_hint, _, remote_refs) = self.fetch_objects(determine_wants,
526
539
if pack_hint is not None and self.target._format.pack_compresses:
527
540
self.target.pack(hint=pack_hint)
528
541
return remote_refs
672
685
if revision_id is not None:
673
686
args = [mapping.revision_id_bzr_to_foreign(revision_id)[0]]
674
687
elif fetch_spec is not None:
675
args = [mapping.revision_id_bzr_to_foreign(revid)[0] for revid in fetch_spec.heads]
688
recipe = fetch_spec.get_recipe()
689
if recipe[0] in ("search", "proxy-search"):
692
raise AssertionError("Unsupported search result type %s" % recipe[0])
693
args = [mapping.revision_id_bzr_to_foreign(revid)[0] for revid in heads]
676
694
if branches is not None:
677
695
determine_wants = lambda x: [x[y] for y in branches if not x[y] in r.object_store]
678
696
elif fetch_spec is None and revision_id is None: