121
122
raise AssertionError("Unknown blob kind, perms=%r." % (mode,))
124
def import_git_objects(repo, mapping, object_iter, pb=None):
125
def import_git_objects(repo, mapping, num_objects, object_iter, pb=None):
125
126
"""Import a set of git objects into a bzr repository.
127
128
:param repo: Bazaar repository
128
129
:param mapping: Mapping to use
130
:param num_objects: Number of objects.
129
131
:param object_iter: Iterator over Git objects.
131
133
# TODO: a more (memory-)efficient implementation of this
133
for i, o in enumerate(object_iter):
135
for i, (o, _) in enumerate(object_iter):
134
136
if pb is not None:
135
pb.update("fetching objects", i)
137
pb.update("fetching objects", i, num_objects)
136
138
objects[o.id] = o
161
163
return objects[sha]
162
164
return reconstruct_git_object(repo, mapping, sha)
163
165
parent_invs = [repo.get_inventory(r) for r in rev.parent_ids]
164
import_git_tree(repo, mapping, "", root_tree, inv, parent_invs, lookup_object)
166
import_git_tree(repo, mapping, "", root_tree, inv, parent_invs,
165
168
repo.add_revision(rev.revision_id, rev, inv)
218
221
self.target.start_write_group()
220
import_git_objects(self.target, mapping,
221
iter(self.source.fetch_objects(determine_wants, graph_walker,
223
(num_objects, objects_iter) = \
224
self.source.fetch_objects(determine_wants,
225
graph_walker, progress)
226
import_git_objects(self.target, mapping, num_objects,
224
229
self.target.commit_write_group()
233
238
"""Be compatible with GitRepository."""
234
239
# FIXME: Also check target uses VersionedFile
235
240
return (isinstance(source, GitRepository) and
236
target.supports_rich_root())
241
target.supports_rich_root() and
242
not isinstance(target, GitRepository))
245
class InterGitRepository(InterRepository):
247
_matching_repo_format = GitFormat()
250
def _get_repo_format_to_test():
253
def copy_content(self, revision_id=None, pb=None):
254
"""See InterRepository.copy_content."""
255
self.fetch(revision_id, pb, find_ghosts=False)
257
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
260
mapping = self.source.get_mapping()
262
info("git: %s", text)
264
if revision_id is None:
265
determine_wants = lambda x: [y for y in x.values() if not y in r.object_store]
267
args = [mapping.revision_id_bzr_to_foreign(revision_id)]
268
determine_wants = lambda x: [y for y in args if not y in r.object_store]
270
graphwalker = SimpleFetchGraphWalker(r.heads().values(), r.get_parents)
271
f, commit = r.object_store.add_pack()
273
self.source._git.fetch_pack(path, determine_wants, graphwalker, f.write, progress)
281
def is_compatible(source, target):
282
"""Be compatible with GitRepository."""
283
return (isinstance(source, GitRepository) and
284
isinstance(target, GitRepository))