261
262
with self.source_store.lock_read():
262
263
old_refs = self._get_target_bzr_refs()
263
264
new_refs = update_refs(old_refs)
264
revidmap = self.fetch_objects(
265
revidmap = self.fetch_revs(
265
266
[(git_sha, bzr_revid)
266
267
for (git_sha, bzr_revid) in new_refs.values()
267
268
if git_sha is None or not git_sha.startswith(SYMREF)],
285
286
result_refs[name] = (gitid, revid if not lossy else self.mapping.revision_id_foreign_to_bzr(gitid))
286
287
return revidmap, old_refs, result_refs
288
def fetch_objects(self, revs, lossy, limit=None):
289
def fetch_revs(self, revs, lossy, limit=None):
289
290
if not lossy and not self.mapping.roundtripping:
290
291
for git_sha, bzr_revid in revs:
291
292
if (bzr_revid is not None and
309
310
self.mapping.revision_id_bzr_to_foreign(old_revid)
310
311
except InvalidRevisionId:
311
refname = self.mapping.revid_as_refname(old_revid)
312
self.target_refs[refname] = git_sha
313
313
revidmap[old_revid] = (git_sha, new_revid)
314
314
self.target_store.add_objects(object_generator)
332
332
for revid in self.source.all_revision_ids()]
333
333
self._warn_slow()
335
revidmap = self.fetch_objects(stop_revisions, lossy=lossy)
335
revidmap = self.fetch_revs(stop_revisions, lossy=lossy)
336
336
except NoPushSupport:
337
337
raise NoRoundtrippingSupport(self.source, self.target)
338
338
return FetchResult(revidmap)
372
372
self._warn_slow()
373
373
with self.source_store.lock_read():
374
new_refs = self.target.send_pack(
374
result = self.target.send_pack(
375
375
git_update_refs, self.source_store.generate_lossy_pack_data)
376
if result is not None and not isinstance(result, dict):
377
for ref, error in result.ref_status.items():
379
raise RemoteGitError(
380
'unable to update ref %r: %s' % (ref, error))
381
new_refs = result.refs
382
else: # dulwich < 0.20.3
376
384
# FIXME: revidmap?
377
385
return revidmap, self.old_refs, new_refs
780
788
"""Be compatible with GitRepository."""
781
789
return (isinstance(source, RemoteGitRepository) and
782
790
isinstance(target, LocalGitRepository))
794
class InterLocalGitRemoteGitRepository(InterToGitRepository):
796
def fetch_refs(self, update_refs, lossy=False, overwrite=False):
797
"""Import the gist of the ancestry of a particular revision."""
799
raise LossyPushToSameVCS(self.source, self.target)
801
def git_update_refs(old_refs):
804
k: (v, None) for (k, v) in viewitems(old_refs)}
805
new_refs = update_refs(self.old_refs)
806
for name, (gitid, revid) in viewitems(new_refs):
808
gitid = self.source_store._lookup_revision_sha1(revid)
810
if remote_divergence(
811
old_refs.get(name), gitid, self.source_store):
812
raise DivergedBranches(self.source, self.target)
815
new_refs = self.target.send_pack(
817
self.source._git.generate_pack_data)
818
return None, self.old_refs, new_refs
821
def is_compatible(source, target):
822
return (isinstance(source, LocalGitRepository) and
823
isinstance(target, RemoteGitRepository))