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