566
566
def _maybe_fetch(self, source, target, revision_id):
567
567
if not source.repository.has_same_location(target.repository):
569
tags_to_fetch = set(source.tags.get_reverse_tag_dict())
570
except errors.TagsNotSupported:
572
fetch_spec = _mod_graph.NotInOtherForRevs(target.repository,
573
source.repository, [revision_id],
574
if_present_ids=tags_to_fetch).execute()
575
target.fetch(source, fetch_spec=fetch_spec)
568
target.fetch(source, revision_id)
577
570
def find_base(self):
578
571
revisions = [_mod_revision.ensure_null(self.this_basis),
589
582
elif len(lcas) == 1:
590
583
self.base_rev_id = list(lcas)[0]
591
584
else: # len(lcas) > 1
592
self._is_criss_cross = True
593
585
if len(lcas) > 2:
594
586
# find_unique_lca can only handle 2 nodes, so we have to
595
587
# start back at the beginning. It is a shame to traverse
601
593
self.base_rev_id = self.revision_graph.find_unique_lca(
603
sorted_lca_keys = self.revision_graph.find_merge_order(
605
if self.base_rev_id == _mod_revision.NULL_REVISION:
606
self.base_rev_id = sorted_lca_keys[0]
595
self._is_criss_cross = True
608
596
if self.base_rev_id == _mod_revision.NULL_REVISION:
609
597
raise errors.UnrelatedBranches()
610
598
if self._is_criss_cross:
611
599
trace.warning('Warning: criss-cross merge encountered. See bzr'
612
600
' help criss-cross.')
613
601
trace.mutter('Criss-cross lcas: %r' % lcas)
614
if self.base_rev_id in lcas:
615
trace.mutter('Unable to find unique lca. '
616
'Fallback %r as best option.' % self.base_rev_id)
617
interesting_revision_ids = set(lcas)
618
interesting_revision_ids.add(self.base_rev_id)
602
interesting_revision_ids = [self.base_rev_id]
603
interesting_revision_ids.extend(lcas)
619
604
interesting_trees = dict((t.get_revision_id(), t)
620
605
for t in self.this_branch.repository.revision_trees(
621
606
interesting_revision_ids))
622
607
self._cached_trees.update(interesting_trees)
623
if self.base_rev_id in lcas:
624
self.base_tree = interesting_trees[self.base_rev_id]
626
self.base_tree = interesting_trees.pop(self.base_rev_id)
608
self.base_tree = interesting_trees.pop(self.base_rev_id)
609
sorted_lca_keys = self.revision_graph.find_merge_order(
627
611
self._lca_trees = [interesting_trees[key]
628
612
for key in sorted_lca_keys]