~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-01-11 15:45:55 UTC
  • mfrom: (5588.1.1 bzr.dev)
  • Revision ID: pqm@pqm.ubuntu.com-20110111154555-xmu386vs0qoigyhl
(vila) Document the packaging helper scripts. (Max Bowsher)

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
    lockdir,
40
40
    lru_cache,
41
41
    osutils,
 
42
    pyutils,
42
43
    revision as _mod_revision,
43
44
    static_tuple,
44
45
    symbol_versioning,
52
53
from bzrlib.testament import Testament
53
54
""")
54
55
 
 
56
import sys
55
57
from bzrlib import (
56
58
    errors,
57
59
    registry,
113
115
 
114
116
        if committer is None:
115
117
            self._committer = self._config.username()
 
118
        elif not isinstance(committer, unicode):
 
119
            self._committer = committer.decode() # throw if non-ascii
116
120
        else:
117
121
            self._committer = committer
118
122
 
2825
2829
            % (name, from_module),
2826
2830
            DeprecationWarning,
2827
2831
            stacklevel=2)
2828
 
        m = __import__(from_module, globals(), locals(), [name])
2829
2832
        try:
2830
 
            return getattr(m, name)
 
2833
            return pyutils.get_named_object(from_module, name)
2831
2834
        except AttributeError:
2832
2835
            raise AttributeError('module %s has no name %s'
2833
 
                    % (m, name))
 
2836
                    % (sys.modules[from_module], name))
2834
2837
    globals()[name] = _deprecated_repository_forwarder
2835
2838
 
2836
2839
for _name in [
3349
3352
    'bzrlib.repofmt.pack_repo',
3350
3353
    'RepositoryFormatKnitPack6RichRoot',
3351
3354
    )
 
3355
format_registry.register_lazy(
 
3356
    'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
 
3357
    'bzrlib.repofmt.groupcompress_repo',
 
3358
    'RepositoryFormat2a',
 
3359
    )
3352
3360
 
3353
3361
# Development formats.
3354
 
# Obsolete but kept pending a CHK based subtree format.
 
3362
# Check their docstrings to see if/when they are obsolete.
3355
3363
format_registry.register_lazy(
3356
3364
    ("Bazaar development format 2 with subtree support "
3357
3365
        "(needs bzr.dev from before 1.8)\n"),
3358
3366
    'bzrlib.repofmt.pack_repo',
3359
3367
    'RepositoryFormatPackDevelopment2Subtree',
3360
3368
    )
3361
 
 
3362
 
# 1.14->1.16 go below here
3363
 
format_registry.register_lazy(
3364
 
    'Bazaar development format - group compression and chk inventory'
3365
 
        ' (needs bzr.dev from 1.14)\n',
3366
 
    'bzrlib.repofmt.groupcompress_repo',
3367
 
    'RepositoryFormatCHK1',
3368
 
    )
3369
 
 
3370
 
format_registry.register_lazy(
3371
 
    'Bazaar development format - chk repository with bencode revision '
3372
 
        'serialization (needs bzr.dev from 1.16)\n',
3373
 
    'bzrlib.repofmt.groupcompress_repo',
3374
 
    'RepositoryFormatCHK2',
3375
 
    )
3376
 
format_registry.register_lazy(
3377
 
    'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
3378
 
    'bzrlib.repofmt.groupcompress_repo',
3379
 
    'RepositoryFormat2a',
3380
 
    )
3381
3369
format_registry.register_lazy(
3382
3370
    'Bazaar development format 8\n',
3383
3371
    'bzrlib.repofmt.groupcompress_repo',
3565
3553
        return InterRepository._same_model(source, target)
3566
3554
 
3567
3555
 
3568
 
class InterWeaveRepo(InterSameDataRepository):
3569
 
    """Optimised code paths between Weave based repositories.
3570
 
 
3571
 
    This should be in bzrlib/repofmt/weaverepo.py but we have not yet
3572
 
    implemented lazy inter-object optimisation.
3573
 
    """
3574
 
 
3575
 
    @classmethod
3576
 
    def _get_repo_format_to_test(self):
3577
 
        from bzrlib.repofmt import weaverepo
3578
 
        return weaverepo.RepositoryFormat7()
3579
 
 
3580
 
    @staticmethod
3581
 
    def is_compatible(source, target):
3582
 
        """Be compatible with known Weave formats.
3583
 
 
3584
 
        We don't test for the stores being of specific types because that
3585
 
        could lead to confusing results, and there is no need to be
3586
 
        overly general.
3587
 
        """
3588
 
        from bzrlib.repofmt.weaverepo import (
3589
 
                RepositoryFormat5,
3590
 
                RepositoryFormat6,
3591
 
                RepositoryFormat7,
3592
 
                )
3593
 
        try:
3594
 
            return (isinstance(source._format, (RepositoryFormat5,
3595
 
                                                RepositoryFormat6,
3596
 
                                                RepositoryFormat7)) and
3597
 
                    isinstance(target._format, (RepositoryFormat5,
3598
 
                                                RepositoryFormat6,
3599
 
                                                RepositoryFormat7)))
3600
 
        except AttributeError:
3601
 
            return False
3602
 
 
3603
 
    @needs_write_lock
3604
 
    def copy_content(self, revision_id=None):
3605
 
        """See InterRepository.copy_content()."""
3606
 
        # weave specific optimised path:
3607
 
        try:
3608
 
            self.target.set_make_working_trees(self.source.make_working_trees())
3609
 
        except (errors.RepositoryUpgradeRequired, NotImplemented):
3610
 
            pass
3611
 
        # FIXME do not peek!
3612
 
        if self.source._transport.listable():
3613
 
            pb = ui.ui_factory.nested_progress_bar()
3614
 
            try:
3615
 
                self.target.texts.insert_record_stream(
3616
 
                    self.source.texts.get_record_stream(
3617
 
                        self.source.texts.keys(), 'topological', False))
3618
 
                pb.update('Copying inventory', 0, 1)
3619
 
                self.target.inventories.insert_record_stream(
3620
 
                    self.source.inventories.get_record_stream(
3621
 
                        self.source.inventories.keys(), 'topological', False))
3622
 
                self.target.signatures.insert_record_stream(
3623
 
                    self.source.signatures.get_record_stream(
3624
 
                        self.source.signatures.keys(),
3625
 
                        'unordered', True))
3626
 
                self.target.revisions.insert_record_stream(
3627
 
                    self.source.revisions.get_record_stream(
3628
 
                        self.source.revisions.keys(),
3629
 
                        'topological', True))
3630
 
            finally:
3631
 
                pb.finished()
3632
 
        else:
3633
 
            self.target.fetch(self.source, revision_id=revision_id)
3634
 
 
3635
 
    @needs_read_lock
3636
 
    def search_missing_revision_ids(self, revision_id=None, find_ghosts=True):
3637
 
        """See InterRepository.missing_revision_ids()."""
3638
 
        # we want all revisions to satisfy revision_id in source.
3639
 
        # but we don't want to stat every file here and there.
3640
 
        # we want then, all revisions other needs to satisfy revision_id
3641
 
        # checked, but not those that we have locally.
3642
 
        # so the first thing is to get a subset of the revisions to
3643
 
        # satisfy revision_id in source, and then eliminate those that
3644
 
        # we do already have.
3645
 
        # this is slow on high latency connection to self, but as this
3646
 
        # disk format scales terribly for push anyway due to rewriting
3647
 
        # inventory.weave, this is considered acceptable.
3648
 
        # - RBC 20060209
3649
 
        if revision_id is not None:
3650
 
            source_ids = self.source.get_ancestry(revision_id)
3651
 
            if source_ids[0] is not None:
3652
 
                raise AssertionError()
3653
 
            source_ids.pop(0)
3654
 
        else:
3655
 
            source_ids = self.source._all_possible_ids()
3656
 
        source_ids_set = set(source_ids)
3657
 
        # source_ids is the worst possible case we may need to pull.
3658
 
        # now we want to filter source_ids against what we actually
3659
 
        # have in target, but don't try to check for existence where we know
3660
 
        # we do not have a revision as that would be pointless.
3661
 
        target_ids = set(self.target._all_possible_ids())
3662
 
        possibly_present_revisions = target_ids.intersection(source_ids_set)
3663
 
        actually_present_revisions = set(
3664
 
            self.target._eliminate_revisions_not_present(possibly_present_revisions))
3665
 
        required_revisions = source_ids_set.difference(actually_present_revisions)
3666
 
        if revision_id is not None:
3667
 
            # we used get_ancestry to determine source_ids then we are assured all
3668
 
            # revisions referenced are present as they are installed in topological order.
3669
 
            # and the tip revision was validated by get_ancestry.
3670
 
            result_set = required_revisions
3671
 
        else:
3672
 
            # if we just grabbed the possibly available ids, then
3673
 
            # we only have an estimate of whats available and need to validate
3674
 
            # that against the revision records.
3675
 
            result_set = set(
3676
 
                self.source._eliminate_revisions_not_present(required_revisions))
3677
 
        return self.source.revision_ids_to_search_result(result_set)
3678
 
 
3679
 
 
3680
 
class InterKnitRepo(InterSameDataRepository):
3681
 
    """Optimised code paths between Knit based repositories."""
3682
 
 
3683
 
    @classmethod
3684
 
    def _get_repo_format_to_test(self):
3685
 
        from bzrlib.repofmt import knitrepo
3686
 
        return knitrepo.RepositoryFormatKnit1()
3687
 
 
3688
 
    @staticmethod
3689
 
    def is_compatible(source, target):
3690
 
        """Be compatible with known Knit formats.
3691
 
 
3692
 
        We don't test for the stores being of specific types because that
3693
 
        could lead to confusing results, and there is no need to be
3694
 
        overly general.
3695
 
        """
3696
 
        from bzrlib.repofmt.knitrepo import RepositoryFormatKnit
3697
 
        try:
3698
 
            are_knits = (isinstance(source._format, RepositoryFormatKnit) and
3699
 
                isinstance(target._format, RepositoryFormatKnit))
3700
 
        except AttributeError:
3701
 
            return False
3702
 
        return are_knits and InterRepository._same_model(source, target)
3703
 
 
3704
 
    @needs_read_lock
3705
 
    def search_missing_revision_ids(self, revision_id=None, find_ghosts=True):
3706
 
        """See InterRepository.missing_revision_ids()."""
3707
 
        if revision_id is not None:
3708
 
            source_ids = self.source.get_ancestry(revision_id)
3709
 
            if source_ids[0] is not None:
3710
 
                raise AssertionError()
3711
 
            source_ids.pop(0)
3712
 
        else:
3713
 
            source_ids = self.source.all_revision_ids()
3714
 
        source_ids_set = set(source_ids)
3715
 
        # source_ids is the worst possible case we may need to pull.
3716
 
        # now we want to filter source_ids against what we actually
3717
 
        # have in target, but don't try to check for existence where we know
3718
 
        # we do not have a revision as that would be pointless.
3719
 
        target_ids = set(self.target.all_revision_ids())
3720
 
        possibly_present_revisions = target_ids.intersection(source_ids_set)
3721
 
        actually_present_revisions = set(
3722
 
            self.target._eliminate_revisions_not_present(possibly_present_revisions))
3723
 
        required_revisions = source_ids_set.difference(actually_present_revisions)
3724
 
        if revision_id is not None:
3725
 
            # we used get_ancestry to determine source_ids then we are assured all
3726
 
            # revisions referenced are present as they are installed in topological order.
3727
 
            # and the tip revision was validated by get_ancestry.
3728
 
            result_set = required_revisions
3729
 
        else:
3730
 
            # if we just grabbed the possibly available ids, then
3731
 
            # we only have an estimate of whats available and need to validate
3732
 
            # that against the revision records.
3733
 
            result_set = set(
3734
 
                self.source._eliminate_revisions_not_present(required_revisions))
3735
 
        return self.source.revision_ids_to_search_result(result_set)
3736
 
 
3737
 
 
3738
3556
class InterDifferingSerializer(InterRepository):
3739
3557
 
3740
3558
    @classmethod
4076
3894
 
4077
3895
InterRepository.register_optimiser(InterDifferingSerializer)
4078
3896
InterRepository.register_optimiser(InterSameDataRepository)
4079
 
InterRepository.register_optimiser(InterWeaveRepo)
4080
 
InterRepository.register_optimiser(InterKnitRepo)
4081
3897
 
4082
3898
 
4083
3899
class CopyConverter(object):