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