~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

Merge pt1 hooks branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
from bzrlib.testament import Testament
53
53
""")
54
54
 
55
 
import sys
56
55
from bzrlib import (
57
56
    errors,
58
57
    registry,
1609
1608
        if symbol_versioning.deprecated_passed(revision_id):
1610
1609
            symbol_versioning.warn(
1611
1610
                'search_missing_revision_ids(revision_id=...) was '
1612
 
                'deprecated in 2.3.  Use revision_ids=[...] instead.',
 
1611
                'deprecated in 2.4.  Use revision_ids=[...] instead.',
1613
1612
                DeprecationWarning, stacklevel=3)
1614
1613
            if revision_ids is not None:
1615
1614
                raise AssertionError(
1786
1785
                not _mod_revision.is_null(revision_id)):
1787
1786
                self.get_revision(revision_id)
1788
1787
            return 0, []
1789
 
        # if there is no specific appropriate InterRepository, this will get
1790
 
        # the InterRepository base class, which raises an
1791
 
        # IncompatibleRepositories when asked to fetch.
1792
1788
        inter = InterRepository.get(source, self)
1793
1789
        return inter.fetch(revision_id=revision_id, pb=pb,
1794
1790
            find_ghosts=find_ghosts, fetch_spec=fetch_spec)
3008
3004
            control_files)
3009
3005
 
3010
3006
 
 
3007
class RepositoryFormatRegistry(registry.FormatRegistry):
 
3008
    """Repository format registry."""
 
3009
 
 
3010
    def __init__(self, other_registry=None):
 
3011
        super(RepositoryFormatRegistry, self).__init__(other_registry)
 
3012
        self._extra_formats = []
 
3013
 
 
3014
    def register(self, format):
 
3015
        """Register a new repository format."""
 
3016
        super(RepositoryFormatRegistry, self).register(
 
3017
            format.get_format_string(), format)
 
3018
 
 
3019
    def remove(self, format):
 
3020
        """Remove a registered repository format."""
 
3021
        super(RepositoryFormatRegistry, self).remove(
 
3022
            format.get_format_string())
 
3023
 
 
3024
    def register_extra(self, format):
 
3025
        """Register a repository format that can not be used in a metadir.
 
3026
 
 
3027
        This is mainly useful to allow custom repository formats, such as older
 
3028
        Bazaar formats and foreign formats, to be tested.
 
3029
        """
 
3030
        self._extra_formats.append(registry._ObjectGetter(format))
 
3031
 
 
3032
    def remove_extra(self, format):
 
3033
        """Remove an extra repository format.
 
3034
        """
 
3035
        self._extra_formats.remove(registry._ObjectGetter(format))
 
3036
 
 
3037
    def register_extra_lazy(self, module_name, member_name):
 
3038
        """Register a repository format lazily.
 
3039
        """
 
3040
        self._extra_formats.append(
 
3041
            registry._LazyObjectGetter(module_name, member_name))
 
3042
 
 
3043
    def get_default(self):
 
3044
        """Return the current default format."""
 
3045
        from bzrlib import bzrdir
 
3046
        return bzrdir.format_registry.make_bzrdir('default').repository_format
 
3047
 
 
3048
    def _get_extra(self):
 
3049
        result = []
 
3050
        for getter in self._extra_formats:
 
3051
            f = getter.get_obj()
 
3052
            if callable(f):
 
3053
                f = f()
 
3054
            result.append(f)
 
3055
        return result
 
3056
 
 
3057
    def _get_all(self):
 
3058
        """Return all repository formats, even those not usable in metadirs.
 
3059
        """
 
3060
        return [self.get(k) for k in self.keys()] + self._get_extra()
 
3061
 
 
3062
 
3011
3063
network_format_registry = registry.FormatRegistry()
3012
3064
"""Registry of formats indexed by their network name.
3013
3065
 
3017
3069
"""
3018
3070
 
3019
3071
 
3020
 
format_registry = registry.FormatRegistry(network_format_registry)
 
3072
format_registry = RepositoryFormatRegistry(network_format_registry)
3021
3073
"""Registry of formats, indexed by their BzrDirMetaFormat format string.
3022
3074
 
3023
3075
This can contain either format instances themselves, or classes/factories that
3128
3180
                                            kind='repository')
3129
3181
 
3130
3182
    @classmethod
 
3183
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4, 0)))
3131
3184
    def register_format(klass, format):
3132
 
        format_registry.register(format.get_format_string(), format)
 
3185
        format_registry.register(format)
3133
3186
 
3134
3187
    @classmethod
 
3188
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4, 0)))
3135
3189
    def unregister_format(klass, format):
3136
 
        format_registry.remove(format.get_format_string())
 
3190
        format_registry.remove(format)
3137
3191
 
3138
3192
    @classmethod
 
3193
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4, 0)))
3139
3194
    def get_default_format(klass):
3140
3195
        """Return the current default format."""
3141
 
        from bzrlib import bzrdir
3142
 
        return bzrdir.format_registry.make_bzrdir('default').repository_format
 
3196
        return format_registry.get_default()
3143
3197
 
3144
3198
    def get_format_string(self):
3145
3199
        """Return the ASCII format string that identifies this format.
3298
3352
    'RepositoryFormat6',
3299
3353
)
3300
3354
 
 
3355
format_registry.register_extra_lazy(
 
3356
    'bzrlib.repofmt.weaverepo',
 
3357
    'RepositoryFormat4')
 
3358
format_registry.register_extra_lazy(
 
3359
    'bzrlib.repofmt.weaverepo',
 
3360
    'RepositoryFormat5')
 
3361
format_registry.register_extra_lazy(
 
3362
    'bzrlib.repofmt.weaverepo',
 
3363
    'RepositoryFormat6')
 
3364
 
3301
3365
# formats which have no format string are not discoverable or independently
3302
3366
# creatable on disk, so are not registered in format_registry.  They're
3303
3367
# all in bzrlib.repofmt.weaverepo now.  When an instance of one of these is
3527
3591
        if symbol_versioning.deprecated_passed(revision_id):
3528
3592
            symbol_versioning.warn(
3529
3593
                'search_missing_revision_ids(revision_id=...) was '
3530
 
                'deprecated in 2.3.  Use revision_ids=[...] instead.',
 
3594
                'deprecated in 2.4.  Use revision_ids=[...] instead.',
3531
3595
                DeprecationWarning, stacklevel=2)
3532
3596
            if revision_ids is not None:
3533
3597
                raise AssertionError(
3902
3966
            fetch_spec=None):
3903
3967
        """See InterRepository.fetch()."""
3904
3968
        if fetch_spec is not None:
3905
 
            if (isinstance(fetch_spec, graph.NotInOtherForRevs) and
3906
 
                    len(fetch_spec.required_ids) == 1 and not
3907
 
                    fetch_spec.if_present_ids):
3908
 
                revision_id = list(fetch_spec.required_ids)[0]
3909
 
                del fetch_spec
3910
 
            else:
3911
 
                raise AssertionError("Not implemented yet...")
 
3969
            revision_ids = fetch_spec.get_keys()
 
3970
        else:
 
3971
            revision_ids = None
3912
3972
        ui.ui_factory.warn_experimental_format_fetch(self)
3913
3973
        if (not self.source.supports_rich_root()
3914
3974
            and self.target.supports_rich_root()):
3921
3981
            ui.ui_factory.show_user_warning('cross_format_fetch',
3922
3982
                from_format=self.source._format,
3923
3983
                to_format=self.target._format)
3924
 
        if revision_id:
3925
 
            search_revision_ids = [revision_id]
3926
 
        else:
3927
 
            search_revision_ids = None
3928
 
        revision_ids = self.target.search_missing_revision_ids(self.source,
3929
 
            revision_ids=search_revision_ids, find_ghosts=find_ghosts).get_keys()
 
3984
        if revision_ids is None:
 
3985
            if revision_id:
 
3986
                search_revision_ids = [revision_id]
 
3987
            else:
 
3988
                search_revision_ids = None
 
3989
            revision_ids = self.target.search_missing_revision_ids(self.source,
 
3990
                revision_ids=search_revision_ids,
 
3991
                find_ghosts=find_ghosts).get_keys()
3930
3992
        if not revision_ids:
3931
3993
            return 0, 0
3932
3994
        revision_ids = tsort.topo_sort(