759
738
paths = list(relpaths)
760
739
return set([self._mapper.unmap(path) for path in paths])
763
class InterWeaveRepo(InterSameDataRepository):
764
"""Optimised code paths between Weave based repositories.
768
def _get_repo_format_to_test(self):
769
return RepositoryFormat7()
772
def is_compatible(source, target):
773
"""Be compatible with known Weave formats.
775
We don't test for the stores being of specific types because that
776
could lead to confusing results, and there is no need to be
780
return (isinstance(source._format, (RepositoryFormat5,
782
RepositoryFormat7)) and
783
isinstance(target._format, (RepositoryFormat5,
786
except AttributeError:
790
def copy_content(self, revision_id=None):
791
"""See InterRepository.copy_content()."""
792
# weave specific optimised path:
794
self.target.set_make_working_trees(self.source.make_working_trees())
795
except (errors.RepositoryUpgradeRequired, NotImplemented):
798
if self.source._transport.listable():
799
pb = ui.ui_factory.nested_progress_bar()
801
self.target.texts.insert_record_stream(
802
self.source.texts.get_record_stream(
803
self.source.texts.keys(), 'topological', False))
804
pb.update('Copying inventory', 0, 1)
805
self.target.inventories.insert_record_stream(
806
self.source.inventories.get_record_stream(
807
self.source.inventories.keys(), 'topological', False))
808
self.target.signatures.insert_record_stream(
809
self.source.signatures.get_record_stream(
810
self.source.signatures.keys(),
812
self.target.revisions.insert_record_stream(
813
self.source.revisions.get_record_stream(
814
self.source.revisions.keys(),
815
'topological', True))
819
self.target.fetch(self.source, revision_id=revision_id)
822
def search_missing_revision_ids(self,
823
revision_id=symbol_versioning.DEPRECATED_PARAMETER,
824
find_ghosts=True, revision_ids=None, if_present_ids=None):
825
"""See InterRepository.search_missing_revision_ids()."""
826
# we want all revisions to satisfy revision_id in source.
827
# but we don't want to stat every file here and there.
828
# we want then, all revisions other needs to satisfy revision_id
829
# checked, but not those that we have locally.
830
# so the first thing is to get a subset of the revisions to
831
# satisfy revision_id in source, and then eliminate those that
832
# we do already have.
833
# this is slow on high latency connection to self, but as this
834
# disk format scales terribly for push anyway due to rewriting
835
# inventory.weave, this is considered acceptable.
837
if symbol_versioning.deprecated_passed(revision_id):
838
symbol_versioning.warn(
839
'search_missing_revision_ids(revision_id=...) was '
840
'deprecated in 2.4. Use revision_ids=[...] instead.',
841
DeprecationWarning, stacklevel=2)
842
if revision_ids is not None:
843
raise AssertionError(
844
'revision_ids is mutually exclusive with revision_id')
845
if revision_id is not None:
846
revision_ids = [revision_id]
848
source_ids_set = self._present_source_revisions_for(
849
revision_ids, if_present_ids)
850
# source_ids is the worst possible case we may need to pull.
851
# now we want to filter source_ids against what we actually
852
# have in target, but don't try to check for existence where we know
853
# we do not have a revision as that would be pointless.
854
target_ids = set(self.target._all_possible_ids())
855
possibly_present_revisions = target_ids.intersection(source_ids_set)
856
actually_present_revisions = set(
857
self.target._eliminate_revisions_not_present(possibly_present_revisions))
858
required_revisions = source_ids_set.difference(actually_present_revisions)
859
if revision_ids is not None:
860
# we used get_ancestry to determine source_ids then we are assured all
861
# revisions referenced are present as they are installed in topological order.
862
# and the tip revision was validated by get_ancestry.
863
result_set = required_revisions
865
# if we just grabbed the possibly available ids, then
866
# we only have an estimate of whats available and need to validate
867
# that against the revision records.
869
self.source._eliminate_revisions_not_present(required_revisions))
870
return self.source.revision_ids_to_search_result(result_set)
873
InterRepository.register_optimiser(InterWeaveRepo)
876
def get_extra_interrepo_test_combinations():
877
from bzrlib.repofmt import knitrepo
878
return [(InterRepository, RepositoryFormat5(),
879
knitrepo.RepositoryFormatKnit3())]
741
_legacy_formats = [RepositoryFormat4(),