15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
from bzrlib import osutils, ui, urlutils
18
from bzrlib.errors import InvalidRevisionId
18
from bzrlib.errors import InvalidRevisionId, NoSuchRevision
19
19
from bzrlib.inventory import Inventory
20
20
from bzrlib.repository import InterRepository
21
21
from bzrlib.trace import info
38
39
class BzrFetchGraphWalker(object):
40
"""GraphWalker implementation that uses a Bazaar repository."""
40
42
def __init__(self, repository, mapping):
41
43
self.repository = repository
122
127
raise AssertionError("Unknown blob kind, perms=%r." % (mode,))
125
def import_git_objects(repo, mapping, num_objects, object_iter, pb=None):
130
def import_git_objects(repo, mapping, object_iter, target_git_object_retriever,
126
132
"""Import a set of git objects into a bzr repository.
128
134
:param repo: Bazaar repository
129
135
:param mapping: Mapping to use
130
:param num_objects: Number of objects.
131
136
:param object_iter: Iterator over Git objects.
133
138
# TODO: a more (memory-)efficient implementation of this
135
for i, (o, _) in enumerate(object_iter):
137
pb.update("fetching objects", i, num_objects)
142
142
# Find and convert commit objects
143
for o in objects.itervalues():
143
for o in object_iter.iterobjects():
144
144
if isinstance(o, Commit):
145
145
rev = mapping.import_commit(o)
146
root_trees[rev.revision_id] = objects[o.tree]
146
root_trees[rev.revision_id] = object_iter[o.tree]
147
147
revisions[rev.revision_id] = rev
148
148
graph.append((rev.revision_id, rev.parent_ids))
149
149
# Order the revisions
159
159
inv = Inventory()
160
160
inv.revision_id = rev.revision_id
161
161
def lookup_object(sha):
164
return reconstruct_git_object(repo, mapping, sha)
162
if sha in object_iter:
163
return object_iter[sha]
164
return target_git_object_retriever(sha)
165
165
parent_invs = [repo.get_inventory(r) for r in rev.parent_ids]
166
166
import_git_tree(repo, mapping, "", root_tree, inv, parent_invs,
168
168
repo.add_revision(rev.revision_id, rev, inv)
171
def reconstruct_git_commit(repo, rev):
172
raise NotImplementedError(self.reconstruct_git_commit)
175
171
def reconstruct_git_object(repo, mapping, sha):
177
revid = mapping.revision_id_foreign_to_bzr(sha)
179
rev = repo.get_revision(revid)
180
except NoSuchRevision:
183
return reconstruct_git_commit(rev)
172
import pdb; pdb.set_trace()
199
188
"""See InterRepository.copy_content."""
200
189
self.fetch(revision_id, pb, find_ghosts=False)
202
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
205
mapping = self.source.get_mapping()
191
def fetch_objects(self, determine_wants, mapping, pb=None):
206
192
def progress(text):
207
193
pb.update("git: %s" % text.rstrip("\r\n"), 0, 0)
208
def determine_wants(heads):
209
if revision_id is None:
212
ret = [mapping.revision_id_bzr_to_foreign(revision_id)[0]]
213
return [rev for rev in ret if not self.target.has_revision(mapping.revision_id_foreign_to_bzr(rev))]
214
194
graph_walker = BzrFetchGraphWalker(self.target, mapping)
217
197
create_pb = pb = ui.ui_factory.nested_progress_bar()
198
target_git_object_retriever = GitObjectConverter(self.target, mapping)
219
201
self.target.lock_write()
221
203
self.target.start_write_group()
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,
205
objects_iter = self.source.fetch_objects(determine_wants,
207
target_git_object_retriever.__getitem__,
209
import_git_objects(self.target, mapping, objects_iter,
210
target_git_object_retriever, pb)
229
212
self.target.commit_write_group()
234
217
create_pb.finished()
219
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
222
mapping = self.source.get_mapping()
223
def determine_wants(heads):
224
if revision_id is None:
227
ret = [mapping.revision_id_bzr_to_foreign(revision_id)[0]]
228
return [rev for rev in ret if not self.target.has_revision(mapping.revision_id_foreign_to_bzr(rev))]
229
return self.fetch_objects(determine_wants, mapping, pb)
237
232
def is_compatible(source, target):
238
233
"""Be compatible with GitRepository."""