/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/repofmt/knitrepo.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

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
    )
35
38
from bzrlib.decorators import needs_read_lock, needs_write_lock
36
39
from bzrlib.repository import (
37
40
    CommitBuilder,
38
 
    InterRepository,
39
 
    InterSameDataRepository,
40
 
    IsInWriteGroupError,
41
41
    MetaDirRepository,
42
42
    MetaDirRepositoryFormat,
43
43
    RepositoryFormat,
44
44
    RootCommitBuilder,
45
45
    )
46
 
from bzrlib import symbol_versioning
47
46
 
48
47
 
49
48
class _KnitParentsProvider(object):
211
210
    def _refresh_data(self):
212
211
        if not self.is_locked():
213
212
            return
214
 
        if self.is_in_write_group():
215
 
            raise IsInWriteGroupError(self)
216
213
        # Create a new transaction to force all knits to see the scope change.
217
214
        # This is safe because we're outside a write group.
218
215
        self.control_files._finish_transaction()
510
507
    def get_format_description(self):
511
508
        """See RepositoryFormat.get_format_description()."""
512
509
        return "Knit repository format 4"
513
 
 
514
 
 
515
 
class InterKnitRepo(InterSameDataRepository):
516
 
    """Optimised code paths between Knit based repositories."""
517
 
 
518
 
    @classmethod
519
 
    def _get_repo_format_to_test(self):
520
 
        return RepositoryFormatKnit1()
521
 
 
522
 
    @staticmethod
523
 
    def is_compatible(source, target):
524
 
        """Be compatible with known Knit formats.
525
 
 
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
528
 
        overly general.
529
 
        """
530
 
        try:
531
 
            are_knits = (isinstance(source._format, RepositoryFormatKnit) and
532
 
                isinstance(target._format, RepositoryFormatKnit))
533
 
        except AttributeError:
534
 
            return False
535
 
        return are_knits and InterRepository._same_model(source, target)
536
 
 
537
 
    @needs_read_lock
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]
552
 
        del 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
569
 
        else:
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.
573
 
            result_set = set(
574
 
                self.source._eliminate_revisions_not_present(required_revisions))
575
 
        return self.source.revision_ids_to_search_result(result_set)
576
 
 
577
 
 
578
 
InterRepository.register_optimiser(InterKnitRepo)