260
262
with self.source_store.lock_read():
261
263
old_refs = self._get_target_bzr_refs()
262
264
new_refs = update_refs(old_refs)
263
revidmap = self.fetch_objects(
265
revidmap = self.fetch_revs(
264
266
[(git_sha, bzr_revid)
265
267
for (git_sha, bzr_revid) in new_refs.values()
266
268
if git_sha is None or not git_sha.startswith(SYMREF)],
284
286
result_refs[name] = (gitid, revid if not lossy else self.mapping.revision_id_foreign_to_bzr(gitid))
285
287
return revidmap, old_refs, result_refs
287
def fetch_objects(self, revs, lossy, limit=None):
289
def fetch_revs(self, revs, lossy, limit=None):
288
290
if not lossy and not self.mapping.roundtripping:
289
291
for git_sha, bzr_revid in revs:
290
292
if (bzr_revid is not None and
308
310
self.mapping.revision_id_bzr_to_foreign(old_revid)
309
311
except InvalidRevisionId:
310
refname = self.mapping.revid_as_refname(old_revid)
311
self.target_refs[refname] = git_sha
312
313
revidmap[old_revid] = (git_sha, new_revid)
313
314
self.target_store.add_objects(object_generator)
331
332
for revid in self.source.all_revision_ids()]
332
333
self._warn_slow()
334
revidmap = self.fetch_objects(stop_revisions, lossy=lossy)
335
revidmap = self.fetch_revs(stop_revisions, lossy=lossy)
335
336
except NoPushSupport:
336
337
raise NoRoundtrippingSupport(self.source, self.target)
337
338
return FetchResult(revidmap)
371
372
self._warn_slow()
372
373
with self.source_store.lock_read():
373
new_refs = self.target.send_pack(
374
result = self.target.send_pack(
374
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
375
384
# FIXME: revidmap?
376
385
return revidmap, self.old_refs, new_refs
403
412
def _target_has_shas(self, shas):
404
413
raise NotImplementedError(self._target_has_shas)
406
def get_determine_wants_heads(self, wants, include_tags=False):
415
def get_determine_wants_heads(self, wants, include_tags=False, tag_selector=None):
407
416
wants = set(wants)
409
418
def determine_wants(refs):
416
425
for k, sha in refs.items():
417
426
if k.endswith(ANNOTATED_TAG_SUFFIX):
429
tag_name = ref_to_tag_name(k)
432
if tag_selector and not tag_selector(tag_name):
421
434
if sha == ZERO_SHA:
503
516
raise NotImplementedError(self.fetch_objects)
505
def get_determine_wants_revids(self, revids, include_tags=False):
518
def get_determine_wants_revids(self, revids, include_tags=False, tag_selector=None):
507
520
for revid in set(revids):
508
521
if self.target.has_revision(revid):
510
523
git_sha, mapping = self.source.lookup_bzr_revision_id(revid)
511
524
wants.add(git_sha)
512
return self.get_determine_wants_heads(wants, include_tags=include_tags)
525
return self.get_determine_wants_heads(
526
wants, include_tags=include_tags, tag_selector=tag_selector)
514
528
def fetch(self, revision_id=None, find_ghosts=False,
515
529
mapping=None, fetch_spec=None, include_tags=False, lossy=False):
682
696
result.refs = wants_recorder.remote_refs
685
def get_determine_wants_revids(self, revids, include_tags=False):
699
def get_determine_wants_revids(self, revids, include_tags=False, tag_selector=None):
687
701
for revid in set(revids):
688
702
if revid == NULL_REVISION:
690
704
git_sha, mapping = self.source.lookup_bzr_revision_id(revid)
691
705
wants.add(git_sha)
692
return self.get_determine_wants_heads(wants, include_tags=include_tags)
706
return self.get_determine_wants_heads(wants, include_tags=include_tags, tag_selector=tag_selector)
694
708
def get_determine_wants_branches(self, branches, include_tags=False):
695
709
def determine_wants(refs):
774
788
"""Be compatible with GitRepository."""
775
789
return (isinstance(source, RemoteGitRepository) and
776
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))