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