~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: 2011-05-19 10:51:37 UTC
  • mfrom: (5891.1.3 api-docs)
  • Revision ID: pqm@pqm.ubuntu.com-20110519105137-amzagrral2ldm1lq
(spiv) Fix the formatting of more docstrings. (Andrew Bennetts)

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
 
    CommitBuilder,
41
 
    MetaDirRepository,
42
 
    MetaDirRepositoryFormat,
 
37
    InterRepository,
 
38
    IsInWriteGroupError,
43
39
    RepositoryFormat,
44
 
    RootCommitBuilder,
45
 
    )
 
40
    )
 
41
from bzrlib.vf_repository import (
 
42
    InterSameDataRepository,
 
43
    MetaDirVersionedFileRepository,
 
44
    MetaDirVersionedFileRepositoryFormat,
 
45
    VersionedFileCommitBuilder,
 
46
    VersionedFileRootCommitBuilder,
 
47
    )
 
48
from bzrlib import symbol_versioning
46
49
 
47
50
 
48
51
class _KnitParentsProvider(object):
102
105
        return result
103
106
 
104
107
 
105
 
class KnitRepository(MetaDirRepository):
 
108
class KnitRepository(MetaDirVersionedFileRepository):
106
109
    """Knit format repository."""
107
110
 
108
111
    # These attributes are inherited from the Repository base class. Setting
114
117
 
115
118
    def __init__(self, _format, a_bzrdir, control_files, _commit_builder_class,
116
119
        _serializer):
117
 
        MetaDirRepository.__init__(self, _format, a_bzrdir, control_files)
 
120
        super(KnitRepository, self).__init__(_format, a_bzrdir, control_files)
118
121
        self._commit_builder_class = _commit_builder_class
119
122
        self._serializer = _serializer
120
123
        self._reconcile_fixes_text_parents = True
210
213
    def _refresh_data(self):
211
214
        if not self.is_locked():
212
215
            return
 
216
        if self.is_in_write_group():
 
217
            raise IsInWriteGroupError(self)
213
218
        # Create a new transaction to force all knits to see the scope change.
214
219
        # This is safe because we're outside a write group.
215
220
        self.control_files._finish_transaction()
229
234
    def _make_parents_provider(self):
230
235
        return _KnitsParentsProvider(self.revisions)
231
236
 
232
 
    def _find_inconsistent_revision_parents(self, revisions_iterator=None):
233
 
        """Find revisions with different parent lists in the revision object
234
 
        and in the index graph.
235
 
 
236
 
        :param revisions_iterator: None, or an iterator of (revid,
237
 
            Revision-or-None). This iterator controls the revisions checked.
238
 
        :returns: an iterator yielding tuples of (revison-id, parents-in-index,
239
 
            parents-in-revision).
240
 
        """
241
 
        if not self.is_locked():
242
 
            raise AssertionError()
243
 
        vf = self.revisions
244
 
        if revisions_iterator is None:
245
 
            revisions_iterator = self._iter_revisions(None)
246
 
        for revid, revision in revisions_iterator:
247
 
            if revision is None:
248
 
                pass
249
 
            parent_map = vf.get_parent_map([(revid,)])
250
 
            parents_according_to_index = tuple(parent[-1] for parent in
251
 
                parent_map[(revid,)])
252
 
            parents_according_to_revision = tuple(revision.parent_ids)
253
 
            if parents_according_to_index != parents_according_to_revision:
254
 
                yield (revid, parents_according_to_index,
255
 
                    parents_according_to_revision)
256
 
 
257
 
    def _check_for_inconsistent_revision_parents(self):
258
 
        inconsistencies = list(self._find_inconsistent_revision_parents())
259
 
        if inconsistencies:
260
 
            raise errors.BzrCheckError(
261
 
                "Revision knit has inconsistent parents.")
262
 
 
263
 
    def revision_graph_can_have_wrong_parents(self):
264
 
        # The revision.kndx could potentially claim a revision has a different
265
 
        # parent to the revision text.
266
 
        return True
267
 
 
268
 
 
269
 
class RepositoryFormatKnit(MetaDirRepositoryFormat):
 
237
 
 
238
class RepositoryFormatKnit(MetaDirVersionedFileRepositoryFormat):
270
239
    """Bzr repository knit format (generalized).
271
240
 
272
241
    This repository format has:
301
270
    _fetch_order = 'topological'
302
271
    _fetch_uses_deltas = True
303
272
    fast_deltas = False
 
273
    supports_funky_characters = True
 
274
    # The revision.kndx could potentially claim a revision has a different
 
275
    # parent to the revision text.
 
276
    revision_graph_can_have_wrong_parents = True
304
277
 
305
278
    def _get_inventories(self, repo_transport, repo, name='inventory'):
306
279
        mapper = versionedfile.ConstantMapper(name)
409
382
    """
410
383
 
411
384
    repository_class = KnitRepository
412
 
    _commit_builder_class = CommitBuilder
 
385
    _commit_builder_class = VersionedFileCommitBuilder
413
386
    @property
414
387
    def _serializer(self):
415
388
        return xml5.serializer_v5
443
416
    """
444
417
 
445
418
    repository_class = KnitRepository
446
 
    _commit_builder_class = RootCommitBuilder
 
419
    _commit_builder_class = VersionedFileRootCommitBuilder
447
420
    rich_root_data = True
448
421
    experimental = True
449
422
    supports_tree_reference = True
485
458
    """
486
459
 
487
460
    repository_class = KnitRepository
488
 
    _commit_builder_class = RootCommitBuilder
 
461
    _commit_builder_class = VersionedFileRootCommitBuilder
489
462
    rich_root_data = True
490
463
    supports_tree_reference = False
491
464
    @property
507
480
    def get_format_description(self):
508
481
        """See RepositoryFormat.get_format_description()."""
509
482
        return "Knit repository format 4"
 
483
 
 
484
 
 
485
class InterKnitRepo(InterSameDataRepository):
 
486
    """Optimised code paths between Knit based repositories."""
 
487
 
 
488
    @classmethod
 
489
    def _get_repo_format_to_test(self):
 
490
        return RepositoryFormatKnit1()
 
491
 
 
492
    @staticmethod
 
493
    def is_compatible(source, target):
 
494
        """Be compatible with known Knit formats.
 
495
 
 
496
        We don't test for the stores being of specific types because that
 
497
        could lead to confusing results, and there is no need to be
 
498
        overly general.
 
499
        """
 
500
        try:
 
501
            are_knits = (isinstance(source._format, RepositoryFormatKnit) and
 
502
                isinstance(target._format, RepositoryFormatKnit))
 
503
        except AttributeError:
 
504
            return False
 
505
        return are_knits and InterRepository._same_model(source, target)
 
506
 
 
507
    @needs_read_lock
 
508
    def search_missing_revision_ids(self,
 
509
            revision_id=symbol_versioning.DEPRECATED_PARAMETER,
 
510
            find_ghosts=True, revision_ids=None, if_present_ids=None):
 
511
        """See InterRepository.search_missing_revision_ids()."""
 
512
        if symbol_versioning.deprecated_passed(revision_id):
 
513
            symbol_versioning.warn(
 
514
                'search_missing_revision_ids(revision_id=...) was '
 
515
                'deprecated in 2.4.  Use revision_ids=[...] instead.',
 
516
                DeprecationWarning, stacklevel=2)
 
517
            if revision_ids is not None:
 
518
                raise AssertionError(
 
519
                    'revision_ids is mutually exclusive with revision_id')
 
520
            if revision_id is not None:
 
521
                revision_ids = [revision_id]
 
522
        del revision_id
 
523
        source_ids_set = self._present_source_revisions_for(
 
524
            revision_ids, if_present_ids)
 
525
        # source_ids is the worst possible case we may need to pull.
 
526
        # now we want to filter source_ids against what we actually
 
527
        # have in target, but don't try to check for existence where we know
 
528
        # we do not have a revision as that would be pointless.
 
529
        target_ids = set(self.target.all_revision_ids())
 
530
        possibly_present_revisions = target_ids.intersection(source_ids_set)
 
531
        actually_present_revisions = set(
 
532
            self.target._eliminate_revisions_not_present(possibly_present_revisions))
 
533
        required_revisions = source_ids_set.difference(actually_present_revisions)
 
534
        if revision_ids is not None:
 
535
            # we used get_ancestry to determine source_ids then we are assured all
 
536
            # revisions referenced are present as they are installed in topological order.
 
537
            # and the tip revision was validated by get_ancestry.
 
538
            result_set = required_revisions
 
539
        else:
 
540
            # if we just grabbed the possibly available ids, then
 
541
            # we only have an estimate of whats available and need to validate
 
542
            # that against the revision records.
 
543
            result_set = set(
 
544
                self.source._eliminate_revisions_not_present(required_revisions))
 
545
        return self.source.revision_ids_to_search_result(result_set)
 
546
 
 
547
 
 
548
InterRepository.register_optimiser(InterKnitRepo)