~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repofmt/knitrepo.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-11-22 22:27:58 UTC
  • mfrom: (5537.2.1 move-inter)
  • Revision ID: pqm@pqm.ubuntu.com-20101122222758-wr1j89eb778ypclt
(spiv) Move InterKnitRepo and InterWeaveRepo out of bzrlib/repository.py
 (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
    xml7,
33
33
    )
34
34
""")
35
 
from bzrlib import (
36
 
    symbol_versioning,
37
 
    )
38
35
from bzrlib.decorators import needs_read_lock, needs_write_lock
39
36
from bzrlib.repository import (
40
37
    CommitBuilder,
 
38
    InterRepository,
 
39
    InterSameDataRepository,
41
40
    IsInWriteGroupError,
42
41
    MetaDirRepository,
43
42
    MetaDirRepositoryFormat,
510
509
    def get_format_description(self):
511
510
        """See RepositoryFormat.get_format_description()."""
512
511
        return "Knit repository format 4"
 
512
 
 
513
 
 
514
class InterKnitRepo(InterSameDataRepository):
 
515
    """Optimised code paths between Knit based repositories."""
 
516
 
 
517
    @classmethod
 
518
    def _get_repo_format_to_test(self):
 
519
        return RepositoryFormatKnit1()
 
520
 
 
521
    @staticmethod
 
522
    def is_compatible(source, target):
 
523
        """Be compatible with known Knit formats.
 
524
 
 
525
        We don't test for the stores being of specific types because that
 
526
        could lead to confusing results, and there is no need to be
 
527
        overly general.
 
528
        """
 
529
        try:
 
530
            are_knits = (isinstance(source._format, RepositoryFormatKnit) and
 
531
                isinstance(target._format, RepositoryFormatKnit))
 
532
        except AttributeError:
 
533
            return False
 
534
        return are_knits and InterRepository._same_model(source, target)
 
535
 
 
536
    @needs_read_lock
 
537
    def search_missing_revision_ids(self, revision_id=None, find_ghosts=True):
 
538
        """See InterRepository.missing_revision_ids()."""
 
539
        if revision_id is not None:
 
540
            source_ids = self.source.get_ancestry(revision_id)
 
541
            if source_ids[0] is not None:
 
542
                raise AssertionError()
 
543
            source_ids.pop(0)
 
544
        else:
 
545
            source_ids = self.source.all_revision_ids()
 
546
        source_ids_set = set(source_ids)
 
547
        # source_ids is the worst possible case we may need to pull.
 
548
        # now we want to filter source_ids against what we actually
 
549
        # have in target, but don't try to check for existence where we know
 
550
        # we do not have a revision as that would be pointless.
 
551
        target_ids = set(self.target.all_revision_ids())
 
552
        possibly_present_revisions = target_ids.intersection(source_ids_set)
 
553
        actually_present_revisions = set(
 
554
            self.target._eliminate_revisions_not_present(possibly_present_revisions))
 
555
        required_revisions = source_ids_set.difference(actually_present_revisions)
 
556
        if revision_id is not None:
 
557
            # we used get_ancestry to determine source_ids then we are assured all
 
558
            # revisions referenced are present as they are installed in topological order.
 
559
            # and the tip revision was validated by get_ancestry.
 
560
            result_set = required_revisions
 
561
        else:
 
562
            # if we just grabbed the possibly available ids, then
 
563
            # we only have an estimate of whats available and need to validate
 
564
            # that against the revision records.
 
565
            result_set = set(
 
566
                self.source._eliminate_revisions_not_present(required_revisions))
 
567
        return self.source.revision_ids_to_search_result(result_set)
 
568
 
 
569
 
 
570
InterRepository.register_optimiser(InterKnitRepo)