507
510
def get_format_description(self):
508
511
"""See RepositoryFormat.get_format_description()."""
509
512
return "Knit repository format 4"
515
class InterKnitRepo(InterSameDataRepository):
516
"""Optimised code paths between Knit based repositories."""
519
def _get_repo_format_to_test(self):
520
return RepositoryFormatKnit1()
523
def is_compatible(source, target):
524
"""Be compatible with known Knit formats.
526
We don't test for the stores being of specific types because that
527
could lead to confusing results, and there is no need to be
531
are_knits = (isinstance(source._format, RepositoryFormatKnit) and
532
isinstance(target._format, RepositoryFormatKnit))
533
except AttributeError:
535
return are_knits and InterRepository._same_model(source, target)
538
def search_missing_revision_ids(self,
539
revision_id=symbol_versioning.DEPRECATED_PARAMETER,
540
find_ghosts=True, revision_ids=None, if_present_ids=None):
541
"""See InterRepository.search_missing_revision_ids()."""
542
if symbol_versioning.deprecated_passed(revision_id):
543
symbol_versioning.warn(
544
'search_missing_revision_ids(revision_id=...) was '
545
'deprecated in 2.4. Use revision_ids=[...] instead.',
546
DeprecationWarning, stacklevel=2)
547
if revision_ids is not None:
548
raise AssertionError(
549
'revision_ids is mutually exclusive with revision_id')
550
if revision_id is not None:
551
revision_ids = [revision_id]
553
source_ids_set = self._present_source_revisions_for(
554
revision_ids, if_present_ids)
555
# source_ids is the worst possible case we may need to pull.
556
# now we want to filter source_ids against what we actually
557
# have in target, but don't try to check for existence where we know
558
# we do not have a revision as that would be pointless.
559
target_ids = set(self.target.all_revision_ids())
560
possibly_present_revisions = target_ids.intersection(source_ids_set)
561
actually_present_revisions = set(
562
self.target._eliminate_revisions_not_present(possibly_present_revisions))
563
required_revisions = source_ids_set.difference(actually_present_revisions)
564
if revision_ids is not None:
565
# we used get_ancestry to determine source_ids then we are assured all
566
# revisions referenced are present as they are installed in topological order.
567
# and the tip revision was validated by get_ancestry.
568
result_set = required_revisions
570
# if we just grabbed the possibly available ids, then
571
# we only have an estimate of whats available and need to validate
572
# that against the revision records.
574
self.source._eliminate_revisions_not_present(required_revisions))
575
return self.source.revision_ids_to_search_result(result_set)
578
InterRepository.register_optimiser(InterKnitRepo)