738
746
paths = list(relpaths)
739
747
return set([self._mapper.unmap(path) for path in paths])
750
class InterWeaveRepo(InterSameDataRepository):
751
"""Optimised code paths between Weave based repositories.
755
def _get_repo_format_to_test(self):
756
return RepositoryFormat7()
759
def is_compatible(source, target):
760
"""Be compatible with known Weave formats.
762
We don't test for the stores being of specific types because that
763
could lead to confusing results, and there is no need to be
767
return (isinstance(source._format, (RepositoryFormat5,
769
RepositoryFormat7)) and
770
isinstance(target._format, (RepositoryFormat5,
773
except AttributeError:
777
def copy_content(self, revision_id=None):
778
"""See InterRepository.copy_content()."""
779
# weave specific optimised path:
781
self.target.set_make_working_trees(self.source.make_working_trees())
782
except (errors.RepositoryUpgradeRequired, NotImplemented):
785
if self.source._transport.listable():
786
pb = ui.ui_factory.nested_progress_bar()
788
self.target.texts.insert_record_stream(
789
self.source.texts.get_record_stream(
790
self.source.texts.keys(), 'topological', False))
791
pb.update('Copying inventory', 0, 1)
792
self.target.inventories.insert_record_stream(
793
self.source.inventories.get_record_stream(
794
self.source.inventories.keys(), 'topological', False))
795
self.target.signatures.insert_record_stream(
796
self.source.signatures.get_record_stream(
797
self.source.signatures.keys(),
799
self.target.revisions.insert_record_stream(
800
self.source.revisions.get_record_stream(
801
self.source.revisions.keys(),
802
'topological', True))
806
self.target.fetch(self.source, revision_id=revision_id)
809
def search_missing_revision_ids(self, revision_id=None, find_ghosts=True):
810
"""See InterRepository.missing_revision_ids()."""
811
# we want all revisions to satisfy revision_id in source.
812
# but we don't want to stat every file here and there.
813
# we want then, all revisions other needs to satisfy revision_id
814
# checked, but not those that we have locally.
815
# so the first thing is to get a subset of the revisions to
816
# satisfy revision_id in source, and then eliminate those that
817
# we do already have.
818
# this is slow on high latency connection to self, but as this
819
# disk format scales terribly for push anyway due to rewriting
820
# inventory.weave, this is considered acceptable.
822
if revision_id is not None:
823
source_ids = self.source.get_ancestry(revision_id)
824
if source_ids[0] is not None:
825
raise AssertionError()
828
source_ids = self.source._all_possible_ids()
829
source_ids_set = set(source_ids)
830
# source_ids is the worst possible case we may need to pull.
831
# now we want to filter source_ids against what we actually
832
# have in target, but don't try to check for existence where we know
833
# we do not have a revision as that would be pointless.
834
target_ids = set(self.target._all_possible_ids())
835
possibly_present_revisions = target_ids.intersection(source_ids_set)
836
actually_present_revisions = set(
837
self.target._eliminate_revisions_not_present(possibly_present_revisions))
838
required_revisions = source_ids_set.difference(actually_present_revisions)
839
if revision_id is not None:
840
# we used get_ancestry to determine source_ids then we are assured all
841
# revisions referenced are present as they are installed in topological order.
842
# and the tip revision was validated by get_ancestry.
843
result_set = required_revisions
845
# if we just grabbed the possibly available ids, then
846
# we only have an estimate of whats available and need to validate
847
# that against the revision records.
849
self.source._eliminate_revisions_not_present(required_revisions))
850
return self.source.revision_ids_to_search_result(result_set)
741
853
_legacy_formats = [RepositoryFormat4(),
742
854
RepositoryFormat5(),
743
855
RepositoryFormat6()]
858
InterRepository.register_optimiser(InterWeaveRepo)