~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bzrdir.py

(gz) Never raise KnownFailure in tests,
 use knownFailure method instead (Martin [gz])

Show diffs side-by-side

added added

removed removed

Lines of Context:
46
46
    transport as _mod_transport,
47
47
    ui,
48
48
    urlutils,
49
 
    vf_search,
50
49
    win32utils,
51
50
    workingtree_3,
52
51
    workingtree_4,
56
55
    do_catching_redirections,
57
56
    local,
58
57
    )
59
 
from bzrlib.i18n import gettext
60
58
""")
61
59
 
62
60
from bzrlib.trace import (
67
65
from bzrlib import (
68
66
    config,
69
67
    controldir,
 
68
    hooks,
70
69
    registry,
71
70
    )
72
71
from bzrlib.symbol_versioning import (
201
200
                if (result_repo.user_url == result.user_url
202
201
                    and not require_stacking and
203
202
                    revision_id is not None):
204
 
                    fetch_spec = vf_search.PendingAncestryResult(
 
203
                    fetch_spec = graph.PendingAncestryResult(
205
204
                        [revision_id], local_repo)
206
205
                    result_repo.fetch(local_repo, fetch_spec=fetch_spec)
207
206
                else:
222
221
            # the tree and fail.
223
222
            result.root_transport.local_abspath('.')
224
223
            if result_repo is None or result_repo.make_working_trees():
225
 
                self.open_workingtree().clone(result, revision_id=revision_id)
 
224
                self.open_workingtree().clone(result)
226
225
        except (errors.NoWorkingTree, errors.NotLocalUrl):
227
226
            pass
228
227
        return result
233
232
        t = _mod_transport.get_transport(url)
234
233
        t.ensure_base()
235
234
 
 
235
    @staticmethod
 
236
    def find_bzrdirs(transport, evaluate=None, list_current=None):
 
237
        """Find bzrdirs recursively from current location.
 
238
 
 
239
        This is intended primarily as a building block for more sophisticated
 
240
        functionality, like finding trees under a directory, or finding
 
241
        branches that use a given repository.
 
242
 
 
243
        :param evaluate: An optional callable that yields recurse, value,
 
244
            where recurse controls whether this bzrdir is recursed into
 
245
            and value is the value to yield.  By default, all bzrdirs
 
246
            are recursed into, and the return value is the bzrdir.
 
247
        :param list_current: if supplied, use this function to list the current
 
248
            directory, instead of Transport.list_dir
 
249
        :return: a generator of found bzrdirs, or whatever evaluate returns.
 
250
        """
 
251
        if list_current is None:
 
252
            def list_current(transport):
 
253
                return transport.list_dir('')
 
254
        if evaluate is None:
 
255
            def evaluate(bzrdir):
 
256
                return True, bzrdir
 
257
 
 
258
        pending = [transport]
 
259
        while len(pending) > 0:
 
260
            current_transport = pending.pop()
 
261
            recurse = True
 
262
            try:
 
263
                bzrdir = BzrDir.open_from_transport(current_transport)
 
264
            except (errors.NotBranchError, errors.PermissionDenied):
 
265
                pass
 
266
            else:
 
267
                recurse, value = evaluate(bzrdir)
 
268
                yield value
 
269
            try:
 
270
                subdirs = list_current(current_transport)
 
271
            except (errors.NoSuchFile, errors.PermissionDenied):
 
272
                continue
 
273
            if recurse:
 
274
                for subdir in sorted(subdirs, reverse=True):
 
275
                    pending.append(current_transport.clone(subdir))
 
276
 
 
277
    @staticmethod
 
278
    def find_branches(transport):
 
279
        """Find all branches under a transport.
 
280
 
 
281
        This will find all branches below the transport, including branches
 
282
        inside other branches.  Where possible, it will use
 
283
        Repository.find_branches.
 
284
 
 
285
        To list all the branches that use a particular Repository, see
 
286
        Repository.find_branches
 
287
        """
 
288
        def evaluate(bzrdir):
 
289
            try:
 
290
                repository = bzrdir.open_repository()
 
291
            except errors.NoRepositoryPresent:
 
292
                pass
 
293
            else:
 
294
                return False, ([], repository)
 
295
            return True, (bzrdir.list_branches(), None)
 
296
        ret = []
 
297
        for branches, repo in BzrDir.find_bzrdirs(transport,
 
298
                                                  evaluate=evaluate):
 
299
            if repo is not None:
 
300
                ret.extend(repo.find_branches())
 
301
            if branches is not None:
 
302
                ret.extend(branches)
 
303
        return ret
 
304
 
 
305
    @staticmethod
 
306
    def create_branch_and_repo(base, force_new_repo=False, format=None):
 
307
        """Create a new BzrDir, Branch and Repository at the url 'base'.
 
308
 
 
309
        This will use the current default BzrDirFormat unless one is
 
310
        specified, and use whatever
 
311
        repository format that that uses via bzrdir.create_branch and
 
312
        create_repository. If a shared repository is available that is used
 
313
        preferentially.
 
314
 
 
315
        The created Branch object is returned.
 
316
 
 
317
        :param base: The URL to create the branch at.
 
318
        :param force_new_repo: If True a new repository is always created.
 
319
        :param format: If supplied, the format of branch to create.  If not
 
320
            supplied, the default is used.
 
321
        """
 
322
        bzrdir = BzrDir.create(base, format)
 
323
        bzrdir._find_or_create_repository(force_new_repo)
 
324
        return bzrdir.create_branch()
 
325
 
236
326
    def determine_repository_policy(self, force_new_repo=False, stack_on=None,
237
327
                                    stack_on_pwd=None, require_stacking=False):
238
328
        """Return an object representing a policy to use.
371
461
        if revision_id is not None:
372
462
            fetch_spec_factory.add_revision_ids([revision_id])
373
463
            fetch_spec_factory.source_branch_stop_revision_id = revision_id
374
 
        if possible_transports is None:
375
 
            possible_transports = []
376
 
        else:
377
 
            possible_transports = list(possible_transports) + [
378
 
                self.root_transport]
379
464
        target_transport = _mod_transport.get_transport(url,
380
465
            possible_transports)
381
466
        target_transport.ensure_base()
382
467
        cloning_format = self.cloning_metadir(stacked)
383
468
        # Create/update the result branch
384
 
        try:
385
 
            result = controldir.ControlDir.open_from_transport(target_transport)
386
 
        except errors.NotBranchError:
387
 
            result = cloning_format.initialize_on_transport(target_transport)
 
469
        result = cloning_format.initialize_on_transport(target_transport)
388
470
        source_branch, source_repository = self._find_source_repo(
389
471
            add_cleanup, source_branch)
390
472
        fetch_spec_factory.source_branch = source_branch
396
478
            stacked_branch_url = None
397
479
        repository_policy = result.determine_repository_policy(
398
480
            force_new_repo, stacked_branch_url, require_stacking=stacked)
399
 
        result_repo, is_new_repo = repository_policy.acquire_repository(
400
 
            possible_transports=possible_transports)
 
481
        result_repo, is_new_repo = repository_policy.acquire_repository()
401
482
        add_cleanup(result_repo.lock_write().unlock)
402
483
        fetch_spec_factory.source_repo = source_repository
403
484
        fetch_spec_factory.target_repo = result_repo
424
505
        mutter("created new branch %r" % (result_branch,))
425
506
 
426
507
        # Create/update the result working tree
427
 
        if (create_tree_if_local and not result.has_workingtree() and
 
508
        if (create_tree_if_local and
428
509
            isinstance(target_transport, local.LocalTransport) and
429
510
            (result_repo is None or result_repo.make_working_trees())):
430
511
            wt = result.create_workingtree(accelerator_tree=accelerator_tree,
462
543
                    stacked=stacked)
463
544
        return result
464
545
 
 
546
 
 
547
 
 
548
    @staticmethod
 
549
    def create_branch_convenience(base, force_new_repo=False,
 
550
                                  force_new_tree=None, format=None,
 
551
                                  possible_transports=None):
 
552
        """Create a new BzrDir, Branch and Repository at the url 'base'.
 
553
 
 
554
        This is a convenience function - it will use an existing repository
 
555
        if possible, can be told explicitly whether to create a working tree or
 
556
        not.
 
557
 
 
558
        This will use the current default BzrDirFormat unless one is
 
559
        specified, and use whatever
 
560
        repository format that that uses via bzrdir.create_branch and
 
561
        create_repository. If a shared repository is available that is used
 
562
        preferentially. Whatever repository is used, its tree creation policy
 
563
        is followed.
 
564
 
 
565
        The created Branch object is returned.
 
566
        If a working tree cannot be made due to base not being a file:// url,
 
567
        no error is raised unless force_new_tree is True, in which case no
 
568
        data is created on disk and NotLocalUrl is raised.
 
569
 
 
570
        :param base: The URL to create the branch at.
 
571
        :param force_new_repo: If True a new repository is always created.
 
572
        :param force_new_tree: If True or False force creation of a tree or
 
573
                               prevent such creation respectively.
 
574
        :param format: Override for the bzrdir format to create.
 
575
        :param possible_transports: An optional reusable transports list.
 
576
        """
 
577
        if force_new_tree:
 
578
            # check for non local urls
 
579
            t = _mod_transport.get_transport(base, possible_transports)
 
580
            if not isinstance(t, local.LocalTransport):
 
581
                raise errors.NotLocalUrl(base)
 
582
        bzrdir = BzrDir.create(base, format, possible_transports)
 
583
        repo = bzrdir._find_or_create_repository(force_new_repo)
 
584
        result = bzrdir.create_branch()
 
585
        if force_new_tree or (repo.make_working_trees() and
 
586
                              force_new_tree is None):
 
587
            try:
 
588
                bzrdir.create_workingtree()
 
589
            except errors.NotLocalUrl:
 
590
                pass
 
591
        return result
 
592
 
 
593
    @staticmethod
 
594
    def create_standalone_workingtree(base, format=None):
 
595
        """Create a new BzrDir, WorkingTree, Branch and Repository at 'base'.
 
596
 
 
597
        'base' must be a local path or a file:// url.
 
598
 
 
599
        This will use the current default BzrDirFormat unless one is
 
600
        specified, and use whatever
 
601
        repository format that that uses for bzrdirformat.create_workingtree,
 
602
        create_branch and create_repository.
 
603
 
 
604
        :param format: Override for the bzrdir format to create.
 
605
        :return: The WorkingTree object.
 
606
        """
 
607
        t = _mod_transport.get_transport(base)
 
608
        if not isinstance(t, local.LocalTransport):
 
609
            raise errors.NotLocalUrl(base)
 
610
        bzrdir = BzrDir.create_branch_and_repo(base,
 
611
                                               force_new_repo=True,
 
612
                                               format=format).bzrdir
 
613
        return bzrdir.create_workingtree()
 
614
 
465
615
    @deprecated_method(deprecated_in((2, 3, 0)))
466
616
    def generate_backup_name(self, base):
467
617
        return self._available_backup_name(base)
484
634
            old_path = self.root_transport.abspath('.bzr')
485
635
            backup_dir = self._available_backup_name('backup.bzr')
486
636
            new_path = self.root_transport.abspath(backup_dir)
487
 
            ui.ui_factory.note(gettext('making backup of {0}\n  to {1}').format(
488
 
                urlutils.unescape_for_display(old_path, 'utf-8'),
489
 
                urlutils.unescape_for_display(new_path, 'utf-8')))
 
637
            ui.ui_factory.note('making backup of %s\n  to %s'
 
638
                               % (old_path, new_path,))
490
639
            self.root_transport.copy_tree('.bzr', backup_dir)
491
640
            return (old_path, new_path)
492
641
        finally:
507
656
            try:
508
657
                to_path = '.bzr.retired.%d' % i
509
658
                self.root_transport.rename('.bzr', to_path)
510
 
                note(gettext("renamed {0} to {1}").format(
511
 
                    self.root_transport.abspath('.bzr'), to_path))
 
659
                note("renamed %s to %s"
 
660
                    % (self.root_transport.abspath('.bzr'), to_path))
512
661
                return
513
662
            except (errors.TransportError, IOError, errors.PathError):
514
663
                i += 1
541
690
                return None
542
691
            # find the next containing bzrdir
543
692
            try:
544
 
                found_bzrdir = self.open_containing_from_transport(
 
693
                found_bzrdir = BzrDir.open_containing_from_transport(
545
694
                    next_transport)[0]
546
695
            except errors.NotBranchError:
547
696
                return None
664
813
        # add new tests for it to the appropriate place.
665
814
        return filename == '.bzr' or filename.startswith('.bzr/')
666
815
 
 
816
    @staticmethod
 
817
    def open_unsupported(base):
 
818
        """Open a branch which is not supported."""
 
819
        return BzrDir.open(base, _unsupported=True)
 
820
 
 
821
    @staticmethod
 
822
    def open(base, _unsupported=False, possible_transports=None):
 
823
        """Open an existing bzrdir, rooted at 'base' (url).
 
824
 
 
825
        :param _unsupported: a private parameter to the BzrDir class.
 
826
        """
 
827
        t = _mod_transport.get_transport(base, possible_transports)
 
828
        return BzrDir.open_from_transport(t, _unsupported=_unsupported)
 
829
 
 
830
    @staticmethod
 
831
    def open_from_transport(transport, _unsupported=False,
 
832
                            _server_formats=True):
 
833
        """Open a bzrdir within a particular directory.
 
834
 
 
835
        :param transport: Transport containing the bzrdir.
 
836
        :param _unsupported: private.
 
837
        """
 
838
        for hook in BzrDir.hooks['pre_open']:
 
839
            hook(transport)
 
840
        # Keep initial base since 'transport' may be modified while following
 
841
        # the redirections.
 
842
        base = transport.base
 
843
        def find_format(transport):
 
844
            return transport, controldir.ControlDirFormat.find_format(
 
845
                transport, _server_formats=_server_formats)
 
846
 
 
847
        def redirected(transport, e, redirection_notice):
 
848
            redirected_transport = transport._redirected_to(e.source, e.target)
 
849
            if redirected_transport is None:
 
850
                raise errors.NotBranchError(base)
 
851
            note('%s is%s redirected to %s',
 
852
                 transport.base, e.permanently, redirected_transport.base)
 
853
            return redirected_transport
 
854
 
 
855
        try:
 
856
            transport, format = do_catching_redirections(find_format,
 
857
                                                         transport,
 
858
                                                         redirected)
 
859
        except errors.TooManyRedirections:
 
860
            raise errors.NotBranchError(base)
 
861
 
 
862
        format.check_support_status(_unsupported)
 
863
        return format.open(transport, _found=True)
 
864
 
 
865
    @staticmethod
 
866
    def open_containing(url, possible_transports=None):
 
867
        """Open an existing branch which contains url.
 
868
 
 
869
        :param url: url to search from.
 
870
 
 
871
        See open_containing_from_transport for more detail.
 
872
        """
 
873
        transport = _mod_transport.get_transport(url, possible_transports)
 
874
        return BzrDir.open_containing_from_transport(transport)
 
875
 
 
876
    @staticmethod
 
877
    def open_containing_from_transport(a_transport):
 
878
        """Open an existing branch which contains a_transport.base.
 
879
 
 
880
        This probes for a branch at a_transport, and searches upwards from there.
 
881
 
 
882
        Basically we keep looking up until we find the control directory or
 
883
        run into the root.  If there isn't one, raises NotBranchError.
 
884
        If there is one and it is either an unrecognised format or an unsupported
 
885
        format, UnknownFormatError or UnsupportedFormatError are raised.
 
886
        If there is one, it is returned, along with the unused portion of url.
 
887
 
 
888
        :return: The BzrDir that contains the path, and a Unicode path
 
889
                for the rest of the URL.
 
890
        """
 
891
        # this gets the normalised url back. I.e. '.' -> the full path.
 
892
        url = a_transport.base
 
893
        while True:
 
894
            try:
 
895
                result = BzrDir.open_from_transport(a_transport)
 
896
                return result, urlutils.unescape(a_transport.relpath(url))
 
897
            except errors.NotBranchError, e:
 
898
                pass
 
899
            try:
 
900
                new_t = a_transport.clone('..')
 
901
            except errors.InvalidURLJoin:
 
902
                # reached the root, whatever that may be
 
903
                raise errors.NotBranchError(path=url)
 
904
            if new_t.base == a_transport.base:
 
905
                # reached the root, whatever that may be
 
906
                raise errors.NotBranchError(path=url)
 
907
            a_transport = new_t
 
908
 
 
909
    @classmethod
 
910
    def open_tree_or_branch(klass, location):
 
911
        """Return the branch and working tree at a location.
 
912
 
 
913
        If there is no tree at the location, tree will be None.
 
914
        If there is no branch at the location, an exception will be
 
915
        raised
 
916
        :return: (tree, branch)
 
917
        """
 
918
        bzrdir = klass.open(location)
 
919
        return bzrdir._get_tree_branch()
 
920
 
 
921
    @classmethod
 
922
    def open_containing_tree_or_branch(klass, location):
 
923
        """Return the branch and working tree contained by a location.
 
924
 
 
925
        Returns (tree, branch, relpath).
 
926
        If there is no tree at containing the location, tree will be None.
 
927
        If there is no branch containing the location, an exception will be
 
928
        raised
 
929
        relpath is the portion of the path that is contained by the branch.
 
930
        """
 
931
        bzrdir, relpath = klass.open_containing(location)
 
932
        tree, branch = bzrdir._get_tree_branch()
 
933
        return tree, branch, relpath
 
934
 
 
935
    @classmethod
 
936
    def open_containing_tree_branch_or_repository(klass, location):
 
937
        """Return the working tree, branch and repo contained by a location.
 
938
 
 
939
        Returns (tree, branch, repository, relpath).
 
940
        If there is no tree containing the location, tree will be None.
 
941
        If there is no branch containing the location, branch will be None.
 
942
        If there is no repository containing the location, repository will be
 
943
        None.
 
944
        relpath is the portion of the path that is contained by the innermost
 
945
        BzrDir.
 
946
 
 
947
        If no tree, branch or repository is found, a NotBranchError is raised.
 
948
        """
 
949
        bzrdir, relpath = klass.open_containing(location)
 
950
        try:
 
951
            tree, branch = bzrdir._get_tree_branch()
 
952
        except errors.NotBranchError:
 
953
            try:
 
954
                repo = bzrdir.find_repository()
 
955
                return None, None, repo, relpath
 
956
            except (errors.NoRepositoryPresent):
 
957
                raise errors.NotBranchError(location)
 
958
        return tree, branch, branch.repository, relpath
 
959
 
667
960
    def _cloning_metadir(self):
668
961
        """Produce a metadir suitable for cloning with.
669
962
 
709
1002
 
710
1003
        :require_stacking: If True, non-stackable formats will be upgraded
711
1004
            to similar stackable formats.
712
 
        :returns: a ControlDirFormat with all component formats either set
 
1005
        :returns: a BzrDirFormat with all component formats either set
713
1006
            appropriately or set to None if that component should not be
714
1007
            created.
715
1008
        """
727
1020
            format.require_stacking()
728
1021
        return format
729
1022
 
 
1023
    @classmethod
 
1024
    def create(cls, base, format=None, possible_transports=None):
 
1025
        """Create a new BzrDir at the url 'base'.
 
1026
 
 
1027
        :param format: If supplied, the format of branch to create.  If not
 
1028
            supplied, the default is used.
 
1029
        :param possible_transports: If supplied, a list of transports that
 
1030
            can be reused to share a remote connection.
 
1031
        """
 
1032
        if cls is not BzrDir:
 
1033
            raise AssertionError("BzrDir.create always creates the"
 
1034
                "default format, not one of %r" % cls)
 
1035
        t = _mod_transport.get_transport(base, possible_transports)
 
1036
        t.ensure_base()
 
1037
        if format is None:
 
1038
            format = controldir.ControlDirFormat.get_default_format()
 
1039
        return format.initialize_on_transport(t)
 
1040
 
730
1041
    def get_branch_transport(self, branch_format, name=None):
731
1042
        """Get the transport for use by branch format in this BzrDir.
732
1043
 
766
1077
        """
767
1078
        raise NotImplementedError(self.get_workingtree_transport)
768
1079
 
769
 
    @classmethod
770
 
    def create(cls, base, format=None, possible_transports=None):
771
 
        """Create a new BzrDir at the url 'base'.
772
 
 
773
 
        :param format: If supplied, the format of branch to create.  If not
774
 
            supplied, the default is used.
775
 
        :param possible_transports: If supplied, a list of transports that
776
 
            can be reused to share a remote connection.
 
1080
 
 
1081
class BzrDirHooks(hooks.Hooks):
 
1082
    """Hooks for BzrDir operations."""
 
1083
 
 
1084
    def __init__(self):
 
1085
        """Create the default hooks."""
 
1086
        hooks.Hooks.__init__(self, "bzrlib.bzrdir", "BzrDir.hooks")
 
1087
        self.add_hook('pre_open',
 
1088
            "Invoked before attempting to open a BzrDir with the transport "
 
1089
            "that the open will use.", (1, 14))
 
1090
        self.add_hook('post_repo_init',
 
1091
            "Invoked after a repository has been initialized. "
 
1092
            "post_repo_init is called with a "
 
1093
            "bzrlib.bzrdir.RepoInitHookParams.",
 
1094
            (2, 2))
 
1095
 
 
1096
# install the default hooks
 
1097
BzrDir.hooks = BzrDirHooks()
 
1098
 
 
1099
 
 
1100
class RepoInitHookParams(object):
 
1101
    """Object holding parameters passed to `*_repo_init` hooks.
 
1102
 
 
1103
    There are 4 fields that hooks may wish to access:
 
1104
 
 
1105
    :ivar repository: Repository created
 
1106
    :ivar format: Repository format
 
1107
    :ivar bzrdir: The bzrdir for the repository
 
1108
    :ivar shared: The repository is shared
 
1109
    """
 
1110
 
 
1111
    def __init__(self, repository, format, a_bzrdir, shared):
 
1112
        """Create a group of RepoInitHook parameters.
 
1113
 
 
1114
        :param repository: Repository created
 
1115
        :param format: Repository format
 
1116
        :param bzrdir: The bzrdir for the repository
 
1117
        :param shared: The repository is shared
777
1118
        """
778
 
        if cls is not BzrDir:
779
 
            raise AssertionError("BzrDir.create always creates the "
780
 
                "default format, not one of %r" % cls)
781
 
        return controldir.ControlDir.create(base, format=format,
782
 
                possible_transports=possible_transports)
 
1119
        self.repository = repository
 
1120
        self.format = format
 
1121
        self.bzrdir = a_bzrdir
 
1122
        self.shared = shared
 
1123
 
 
1124
    def __eq__(self, other):
 
1125
        return self.__dict__ == other.__dict__
783
1126
 
784
1127
    def __repr__(self):
785
 
        return "<%s at %r>" % (self.__class__.__name__, self.user_url)
 
1128
        if self.repository:
 
1129
            return "<%s for %s>" % (self.__class__.__name__,
 
1130
                self.repository)
 
1131
        else:
 
1132
            return "<%s for %s>" % (self.__class__.__name__,
 
1133
                self.bzrdir)
786
1134
 
787
1135
 
788
1136
class BzrDirMeta1(BzrDir):
798
1146
        """See BzrDir.can_convert_format()."""
799
1147
        return True
800
1148
 
801
 
    def create_branch(self, name=None, repository=None,
802
 
            append_revisions_only=None):
 
1149
    def create_branch(self, name=None, repository=None):
803
1150
        """See BzrDir.create_branch."""
804
 
        if name is None:
805
 
            name = self._get_selected_branch()
806
1151
        return self._format.get_branch_format().initialize(self, name=name,
807
 
                repository=repository,
808
 
                append_revisions_only=append_revisions_only)
 
1152
                repository=repository)
809
1153
 
810
1154
    def destroy_branch(self, name=None):
811
1155
        """See BzrDir.create_branch."""
819
1163
 
820
1164
    def destroy_repository(self):
821
1165
        """See BzrDir.destroy_repository."""
822
 
        try:
823
 
            self.transport.delete_tree('repository')
824
 
        except errors.NoSuchFile:
825
 
            raise errors.NoRepositoryPresent(self)
 
1166
        self.transport.delete_tree('repository')
826
1167
 
827
1168
    def create_workingtree(self, revision_id=None, from_branch=None,
828
1169
                           accelerator_tree=None, hardlink=False):
926
1267
 
927
1268
    def needs_format_conversion(self, format):
928
1269
        """See BzrDir.needs_format_conversion()."""
929
 
        if (not isinstance(self._format, format.__class__) or
930
 
            self._format.get_format_string() != format.get_format_string()):
 
1270
        if not isinstance(self._format, format.__class__):
931
1271
            # it is not a meta dir format, conversion is needed.
932
1272
            return True
933
1273
        # we might want to push this down to the repository?
954
1294
        return False
955
1295
 
956
1296
    def open_branch(self, name=None, unsupported=False,
957
 
                    ignore_fallbacks=False, possible_transports=None):
958
 
        """See ControlDir.open_branch."""
959
 
        if name is None:
960
 
            name = self._get_selected_branch()
 
1297
                    ignore_fallbacks=False):
 
1298
        """See BzrDir.open_branch."""
961
1299
        format = self.find_branch_format(name=name)
962
1300
        format.check_support_status(unsupported)
963
1301
        return format.open(self, name=name,
964
 
            _found=True, ignore_fallbacks=ignore_fallbacks,
965
 
            possible_transports=possible_transports)
 
1302
            _found=True, ignore_fallbacks=ignore_fallbacks)
966
1303
 
967
1304
    def open_repository(self, unsupported=False):
968
1305
        """See BzrDir.open_repository."""
984
1321
        return config.TransportConfig(self.transport, 'control.conf')
985
1322
 
986
1323
 
987
 
class BzrDirMeta1Colo(BzrDirMeta1):
988
 
    """BzrDirMeta1 with support for colocated branches.
989
 
 
990
 
    This format is experimental, and will eventually be merged back into
991
 
    BzrDirMeta1.
992
 
    """
993
 
 
994
 
    def __init__(self, _transport, _format):
995
 
        super(BzrDirMeta1Colo, self).__init__(_transport, _format)
996
 
        self.control_files = lockable_files.LockableFiles(self.control_transport,
997
 
            self._format._lock_file_name, self._format._lock_class)
998
 
 
999
 
    def _get_branch_path(self, name):
1000
 
        """Obtain the branch path to use.
1001
 
 
1002
 
        This uses the API specified branch name first, and then falls back to
1003
 
        the branch name specified in the URL. If neither of those is specified,
1004
 
        it uses the default branch.
1005
 
 
1006
 
        :param name: Optional branch name to use
1007
 
        :return: Relative path to branch
1008
 
        """
1009
 
        if name is None:
1010
 
            return 'branch'
1011
 
        return urlutils.join('branches', name.encode("utf-8"))
1012
 
 
1013
 
    def _read_branch_list(self):
1014
 
        """Read the branch list.
1015
 
 
1016
 
        :return: List of utf-8 encoded branch names.
1017
 
        """
1018
 
        try:
1019
 
            f = self.control_transport.get('branch-list')
1020
 
        except errors.NoSuchFile:
1021
 
            return []
1022
 
 
1023
 
        ret = []
1024
 
        try:
1025
 
            for name in f:
1026
 
                ret.append(name.rstrip("\n"))
1027
 
        finally:
1028
 
            f.close()
1029
 
        return ret
1030
 
 
1031
 
    def _write_branch_list(self, branches):
1032
 
        """Write out the branch list.
1033
 
 
1034
 
        :param branches: List of utf-8 branch names to write
1035
 
        """
1036
 
        self.transport.put_bytes('branch-list',
1037
 
            "".join([name+"\n" for name in branches]))
1038
 
 
1039
 
    def destroy_branch(self, name=None):
1040
 
        """See BzrDir.create_branch."""
1041
 
        if name is None:
1042
 
            name = self._get_selected_branch()
1043
 
        path = self._get_branch_path(name)
1044
 
        if name is not None:
1045
 
            self.control_files.lock_write()
1046
 
            try:
1047
 
                branches = self._read_branch_list()
1048
 
                try:
1049
 
                    branches.remove(name.encode("utf-8"))
1050
 
                except ValueError:
1051
 
                    raise errors.NotBranchError(name)
1052
 
                self._write_branch_list(branches)
1053
 
            finally:
1054
 
                self.control_files.unlock()
1055
 
        self.transport.delete_tree(path)
1056
 
 
1057
 
    def list_branches(self):
1058
 
        """See ControlDir.list_branches."""
1059
 
        ret = []
1060
 
        # Default branch
1061
 
        try:
1062
 
            ret.append(self.open_branch())
1063
 
        except (errors.NotBranchError, errors.NoRepositoryPresent):
1064
 
            pass
1065
 
 
1066
 
        # colocated branches
1067
 
        ret.extend([self.open_branch(name.decode("utf-8")) for name in
1068
 
                    self._read_branch_list()])
1069
 
 
1070
 
        return ret
1071
 
 
1072
 
    def get_branch_transport(self, branch_format, name=None):
1073
 
        """See BzrDir.get_branch_transport()."""
1074
 
        path = self._get_branch_path(name)
1075
 
        # XXX: this shouldn't implicitly create the directory if it's just
1076
 
        # promising to get a transport -- mbp 20090727
1077
 
        if branch_format is None:
1078
 
            return self.transport.clone(path)
1079
 
        try:
1080
 
            branch_format.get_format_string()
1081
 
        except NotImplementedError:
1082
 
            raise errors.IncompatibleFormat(branch_format, self._format)
1083
 
        if name is not None:
1084
 
            try:
1085
 
                self.transport.mkdir('branches', mode=self._get_mkdir_mode())
1086
 
            except errors.FileExists:
1087
 
                pass
1088
 
            branches = self._read_branch_list()
1089
 
            utf8_name = name.encode("utf-8")
1090
 
            if not utf8_name in branches:
1091
 
                self.control_files.lock_write()
1092
 
                try:
1093
 
                    branches = self._read_branch_list()
1094
 
                    branches.append(utf8_name)
1095
 
                    self._write_branch_list(branches)
1096
 
                finally:
1097
 
                    self.control_files.unlock()
1098
 
        try:
1099
 
            self.transport.mkdir(path, mode=self._get_mkdir_mode())
1100
 
        except errors.FileExists:
1101
 
            pass
1102
 
        return self.transport.clone(path)
1103
 
 
1104
 
 
1105
1324
class BzrProber(controldir.Prober):
1106
1325
    """Prober for formats that use a .bzr/ control directory."""
1107
1326
 
1390
1609
        :return: None.
1391
1610
        """
1392
1611
 
1393
 
    def supports_transport(self, transport):
1394
 
        # bzr formats can be opened over all known transports
1395
 
        return True
1396
 
 
1397
1612
 
1398
1613
class BzrDirMetaFormat1(BzrDirFormat):
1399
1614
    """Bzr meta control format 1
1412
1627
 
1413
1628
    fixed_components = False
1414
1629
 
1415
 
    colocated_branches = False
1416
 
 
1417
1630
    def __init__(self):
1418
1631
        self._workingtree_format = None
1419
1632
        self._branch_format = None
1509
1722
                    new_repo_format = None
1510
1723
            if new_repo_format is not None:
1511
1724
                self.repository_format = new_repo_format
1512
 
                note(gettext('Source repository format does not support stacking,'
1513
 
                     ' using format:\n  %s'),
 
1725
                note('Source repository format does not support stacking,'
 
1726
                     ' using format:\n  %s',
1514
1727
                     new_repo_format.get_format_description())
1515
1728
 
1516
1729
        if not self.get_branch_format().supports_stacking():
1529
1742
            if new_branch_format is not None:
1530
1743
                # Does support stacking, use its format.
1531
1744
                self.set_branch_format(new_branch_format)
1532
 
                note(gettext('Source branch format does not support stacking,'
1533
 
                     ' using format:\n  %s'),
 
1745
                note('Source branch format does not support stacking,'
 
1746
                     ' using format:\n  %s',
1534
1747
                     new_branch_format.get_format_description())
1535
1748
 
1536
1749
    def get_converter(self, format=None):
1537
1750
        """See BzrDirFormat.get_converter()."""
1538
1751
        if format is None:
1539
1752
            format = BzrDirFormat.get_default_format()
1540
 
        if (type(self) is BzrDirMetaFormat1 and
1541
 
            type(format) is BzrDirMetaFormat1Colo):
1542
 
            return ConvertMetaToColo(format)
1543
 
        if (type(self) is BzrDirMetaFormat1Colo and
1544
 
            type(format) is BzrDirMetaFormat1):
1545
 
            return ConvertMetaRemoveColo(format)
1546
1753
        if not isinstance(self, format.__class__):
1547
1754
            # converting away from metadir is not implemented
1548
1755
            raise NotImplementedError(self.get_converter)
1622
1829
controldir.ControlDirFormat._default_format = BzrDirMetaFormat1()
1623
1830
 
1624
1831
 
1625
 
class BzrDirMetaFormat1Colo(BzrDirMetaFormat1):
1626
 
    """BzrDirMeta1 format with support for colocated branches."""
1627
 
 
1628
 
    colocated_branches = True
1629
 
 
1630
 
    @classmethod
1631
 
    def get_format_string(cls):
1632
 
        """See BzrDirFormat.get_format_string()."""
1633
 
        return "Bazaar meta directory, format 1 (with colocated branches)\n"
1634
 
 
1635
 
    def get_format_description(self):
1636
 
        """See BzrDirFormat.get_format_description()."""
1637
 
        return "Meta directory format 1 with support for colocated branches"
1638
 
 
1639
 
    def _open(self, transport):
1640
 
        """See BzrDirFormat._open."""
1641
 
        # Create a new format instance because otherwise initialisation of new
1642
 
        # metadirs share the global default format object leading to alias
1643
 
        # problems.
1644
 
        format = BzrDirMetaFormat1Colo()
1645
 
        self._supply_sub_formats_to(format)
1646
 
        return BzrDirMeta1Colo(transport, format)
1647
 
 
1648
 
 
1649
 
BzrProber.formats.register(BzrDirMetaFormat1Colo.get_format_string(),
1650
 
    BzrDirMetaFormat1Colo)
1651
 
 
1652
 
 
1653
1832
class ConvertMetaToMeta(controldir.Converter):
1654
1833
    """Converts the components of metadirs."""
1655
1834
 
1674
1853
        else:
1675
1854
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
1676
1855
                from bzrlib.repository import CopyConverter
1677
 
                ui.ui_factory.note(gettext('starting repository conversion'))
 
1856
                ui.ui_factory.note('starting repository conversion')
1678
1857
                converter = CopyConverter(self.target_format.repository_format)
1679
1858
                converter.convert(repo, pb)
1680
1859
        for branch in self.bzrdir.list_branches():
1728
1907
        return to_convert
1729
1908
 
1730
1909
 
1731
 
class ConvertMetaToColo(controldir.Converter):
1732
 
    """Add colocated branch support."""
1733
 
 
1734
 
    def __init__(self, target_format):
1735
 
        """Create a converter.that upgrades a metadir to the colo format.
1736
 
 
1737
 
        :param target_format: The final metadir format that is desired.
1738
 
        """
1739
 
        self.target_format = target_format
1740
 
 
1741
 
    def convert(self, to_convert, pb):
1742
 
        """See Converter.convert()."""
1743
 
        to_convert.transport.put_bytes('branch-format',
1744
 
            self.target_format.get_format_string())
1745
 
        return BzrDir.open_from_transport(to_convert.root_transport)
1746
 
 
1747
 
 
1748
 
class ConvertMetaRemoveColo(controldir.Converter):
1749
 
    """Remove colocated branch support from a bzrdir."""
1750
 
 
1751
 
    def __init__(self, target_format):
1752
 
        """Create a converter.that downgrades a colocated branch metadir
1753
 
        to a regular metadir.
1754
 
 
1755
 
        :param target_format: The final metadir format that is desired.
1756
 
        """
1757
 
        self.target_format = target_format
1758
 
 
1759
 
    def convert(self, to_convert, pb):
1760
 
        """See Converter.convert()."""
1761
 
        to_convert.control_files.lock_write()
1762
 
        try:
1763
 
            branches = to_convert.list_branches()
1764
 
            if len(branches) > 1:
1765
 
                raise errors.BzrError("remove all but a single "
1766
 
                    "colocated branch when downgrading")
1767
 
        finally:
1768
 
            to_convert.control_files.unlock()
1769
 
        to_convert.transport.put_bytes('branch-format',
1770
 
            self.target_format.get_format_string())
1771
 
        return BzrDir.open_from_transport(to_convert.root_transport)
1772
 
 
1773
 
 
1774
1910
controldir.ControlDirFormat.register_server_prober(RemoteBzrProber)
1775
1911
 
1776
1912
 
1853
1989
        else:
1854
1990
            self._require_stacking = True
1855
1991
 
1856
 
    def acquire_repository(self, make_working_trees=None, shared=False,
1857
 
            possible_transports=None):
 
1992
    def acquire_repository(self, make_working_trees=None, shared=False):
1858
1993
        """Acquire a repository for this bzrdir.
1859
1994
 
1860
1995
        Implementations may create a new repository or use a pre-exising
1885
2020
                                             require_stacking)
1886
2021
        self._bzrdir = bzrdir
1887
2022
 
1888
 
    def acquire_repository(self, make_working_trees=None, shared=False,
1889
 
            possible_transports=None):
 
2023
    def acquire_repository(self, make_working_trees=None, shared=False):
1890
2024
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
1891
2025
 
1892
2026
        Creates the desired repository in the bzrdir we already have.
1893
2027
        """
1894
 
        if possible_transports is None:
1895
 
            possible_transports = []
1896
 
        else:
1897
 
            possible_transports = list(possible_transports)
1898
 
        possible_transports.append(self._bzrdir.root_transport)
1899
2028
        stack_on = self._get_full_stack_on()
1900
2029
        if stack_on:
1901
2030
            format = self._bzrdir._format
1902
2031
            format.require_stacking(stack_on=stack_on,
1903
 
                                    possible_transports=possible_transports)
 
2032
                                    possible_transports=[self._bzrdir.root_transport])
1904
2033
            if not self._require_stacking:
1905
2034
                # We have picked up automatic stacking somewhere.
1906
 
                note(gettext('Using default stacking branch {0} at {1}').format(
1907
 
                    self._stack_on, self._stack_on_pwd))
 
2035
                note('Using default stacking branch %s at %s', self._stack_on,
 
2036
                    self._stack_on_pwd)
1908
2037
        repository = self._bzrdir.create_repository(shared=shared)
1909
2038
        self._add_fallback(repository,
1910
 
                           possible_transports=possible_transports)
 
2039
                           possible_transports=[self._bzrdir.transport])
1911
2040
        if make_working_trees is not None:
1912
2041
            repository.set_make_working_trees(make_working_trees)
1913
2042
        return repository, True
1929
2058
                                             require_stacking)
1930
2059
        self._repository = repository
1931
2060
 
1932
 
    def acquire_repository(self, make_working_trees=None, shared=False,
1933
 
            possible_transports=None):
 
2061
    def acquire_repository(self, make_working_trees=None, shared=False):
1934
2062
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
1935
2063
 
1936
2064
        Returns an existing repository to use.
1937
2065
        """
1938
 
        if possible_transports is None:
1939
 
            possible_transports = []
1940
 
        else:
1941
 
            possible_transports = list(possible_transports)
1942
 
        possible_transports.append(self._repository.bzrdir.transport)
1943
2066
        self._add_fallback(self._repository,
1944
 
                       possible_transports=possible_transports)
 
2067
                       possible_transports=[self._repository.bzrdir.transport])
1945
2068
        return self._repository, False
1946
2069
 
1947
2070
 
1951
2074
         tree_format=None,
1952
2075
         hidden=False,
1953
2076
         experimental=False,
1954
 
         alias=False, bzrdir_format=None):
 
2077
         alias=False):
1955
2078
    """Register a metadir subformat.
1956
2079
 
1957
 
    These all use a meta bzrdir, but can be parameterized by the
1958
 
    Repository/Branch/WorkingTreeformats.
 
2080
    These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
 
2081
    by the Repository/Branch/WorkingTreeformats.
1959
2082
 
1960
2083
    :param repository_format: The fully-qualified repository format class
1961
2084
        name as a string.
1964
2087
    :param tree_format: Fully-qualified tree format class name as
1965
2088
        a string.
1966
2089
    """
1967
 
    if bzrdir_format is None:
1968
 
        bzrdir_format = BzrDirMetaFormat1
1969
2090
    # This should be expanded to support setting WorkingTree and Branch
1970
 
    # formats, once the API supports that.
 
2091
    # formats, once BzrDirMetaFormat1 supports that.
1971
2092
    def _load(full_name):
1972
2093
        mod_name, factory_name = full_name.rsplit('.', 1)
1973
2094
        try:
1980
2101
        return factory()
1981
2102
 
1982
2103
    def helper():
1983
 
        bd = bzrdir_format()
 
2104
        bd = BzrDirMetaFormat1()
1984
2105
        if branch_format is not None:
1985
2106
            bd.set_branch_format(_load(branch_format))
1986
2107
        if tree_format is not None:
2000
2121
    deprecated=True)
2001
2122
register_metadir(controldir.format_registry, 'dirstate',
2002
2123
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2003
 
    help='Format using dirstate for working trees. '
2004
 
        'Compatible with bzr 0.8 and '
2005
 
        'above when accessed over the network. Introduced in bzr 0.15.',
 
2124
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
 
2125
        'above when accessed over the network.',
2006
2126
    branch_format='bzrlib.branch.BzrBranchFormat5',
2007
2127
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2008
2128
    hidden=True,
2009
2129
    deprecated=True)
2010
2130
register_metadir(controldir.format_registry, 'dirstate-tags',
2011
2131
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2012
 
    help='Variant of dirstate with support for tags. '
2013
 
        'Introduced in bzr 0.15.',
 
2132
    help='New in 0.15: Fast local operations and improved scaling for '
 
2133
        'network operations. Additionally adds support for tags.'
 
2134
        ' Incompatible with bzr < 0.15.',
2014
2135
    branch_format='bzrlib.branch.BzrBranchFormat6',
2015
2136
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2016
2137
    hidden=True,
2017
2138
    deprecated=True)
2018
2139
register_metadir(controldir.format_registry, 'rich-root',
2019
2140
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
2020
 
    help='Variant of dirstate with better handling of tree roots. '
2021
 
        'Introduced in bzr 1.0',
 
2141
    help='New in 1.0.  Better handling of tree roots.  Incompatible with'
 
2142
        ' bzr < 1.0.',
2022
2143
    branch_format='bzrlib.branch.BzrBranchFormat6',
2023
2144
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2024
2145
    hidden=True,
2025
2146
    deprecated=True)
2026
2147
register_metadir(controldir.format_registry, 'dirstate-with-subtree',
2027
2148
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
2028
 
    help='Variant of dirstate with support for nested trees. '
2029
 
         'Introduced in 0.15.',
 
2149
    help='New in 0.15: Fast local operations and improved scaling for '
 
2150
        'network operations. Additionally adds support for versioning nested '
 
2151
        'bzr branches. Incompatible with bzr < 0.15.',
2030
2152
    branch_format='bzrlib.branch.BzrBranchFormat6',
2031
2153
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2032
2154
    experimental=True,
2034
2156
    )
2035
2157
register_metadir(controldir.format_registry, 'pack-0.92',
2036
2158
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack1',
2037
 
    help='Pack-based format used in 1.x series. Introduced in 0.92. '
2038
 
        'Interoperates with bzr repositories before 0.92 but cannot be '
2039
 
        'read by bzr < 0.92. '
 
2159
    help='New in 0.92: Pack-based format with data compatible with '
 
2160
        'dirstate-tags format repositories. Interoperates with '
 
2161
        'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
2040
2162
        ,
2041
2163
    branch_format='bzrlib.branch.BzrBranchFormat6',
2042
2164
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2043
 
    deprecated=True,
2044
2165
    )
2045
2166
register_metadir(controldir.format_registry, 'pack-0.92-subtree',
2046
2167
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack3',
2047
 
    help='Pack-based format used in 1.x series, with subtree support. '
2048
 
        'Introduced in 0.92. Interoperates with '
 
2168
    help='New in 0.92: Pack-based format with data compatible with '
 
2169
        'dirstate-with-subtree format repositories. Interoperates with '
2049
2170
        'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
2050
2171
        ,
2051
2172
    branch_format='bzrlib.branch.BzrBranchFormat6',
2052
2173
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2053
2174
    hidden=True,
2054
 
    deprecated=True,
2055
2175
    experimental=True,
2056
2176
    )
2057
2177
register_metadir(controldir.format_registry, 'rich-root-pack',
2058
2178
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack4',
2059
 
    help='A variant of pack-0.92 that supports rich-root data '
2060
 
         '(needed for bzr-svn and bzr-git). Introduced in 1.0.',
 
2179
    help='New in 1.0: A variant of pack-0.92 that supports rich-root data '
 
2180
         '(needed for bzr-svn and bzr-git).',
2061
2181
    branch_format='bzrlib.branch.BzrBranchFormat6',
2062
2182
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2063
2183
    hidden=True,
2064
 
    deprecated=True,
2065
2184
    )
2066
2185
register_metadir(controldir.format_registry, '1.6',
2067
2186
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack5',
2071
2190
    branch_format='bzrlib.branch.BzrBranchFormat7',
2072
2191
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2073
2192
    hidden=True,
2074
 
    deprecated=True,
2075
2193
    )
2076
2194
register_metadir(controldir.format_registry, '1.6.1-rich-root',
2077
2195
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack5RichRoot',
2080
2198
    branch_format='bzrlib.branch.BzrBranchFormat7',
2081
2199
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2082
2200
    hidden=True,
2083
 
    deprecated=True,
2084
2201
    )
2085
2202
register_metadir(controldir.format_registry, '1.9',
2086
2203
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6',
2090
2207
    branch_format='bzrlib.branch.BzrBranchFormat7',
2091
2208
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2092
2209
    hidden=True,
2093
 
    deprecated=True,
2094
2210
    )
2095
2211
register_metadir(controldir.format_registry, '1.9-rich-root',
2096
2212
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
2099
2215
    branch_format='bzrlib.branch.BzrBranchFormat7',
2100
2216
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2101
2217
    hidden=True,
2102
 
    deprecated=True,
2103
2218
    )
2104
2219
register_metadir(controldir.format_registry, '1.14',
2105
2220
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6',
2106
2221
    help='A working-tree format that supports content filtering.',
2107
2222
    branch_format='bzrlib.branch.BzrBranchFormat7',
2108
2223
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat5',
2109
 
    hidden=True,
2110
 
    deprecated=True,
2111
2224
    )
2112
2225
register_metadir(controldir.format_registry, '1.14-rich-root',
2113
2226
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
2115
2228
         '(needed for bzr-svn and bzr-git).',
2116
2229
    branch_format='bzrlib.branch.BzrBranchFormat7',
2117
2230
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat5',
2118
 
    hidden=True,
2119
 
    deprecated=True,
2120
2231
    )
2121
2232
# The following un-numbered 'development' formats should always just be aliases.
2122
2233
register_metadir(controldir.format_registry, 'development-subtree',
2150
2261
    alias=False,
2151
2262
    )
2152
2263
 
2153
 
register_metadir(controldir.format_registry, 'development-colo',
2154
 
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2155
 
    help='The 2a format with experimental support for colocated branches.\n',
2156
 
    branch_format='bzrlib.branch.BzrBranchFormat7',
2157
 
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
2158
 
    experimental=True,
2159
 
    bzrdir_format=BzrDirMetaFormat1Colo,
2160
 
    )
2161
 
 
2162
 
 
2163
2264
# And the development formats above will have aliased one of the following:
2164
2265
 
2165
2266
# Finally, the current format.
2166
2267
register_metadir(controldir.format_registry, '2a',
2167
2268
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2168
 
    help='Format for the bzr 2.0 series.\n'
 
2269
    help='First format for bzr 2.0 series.\n'
2169
2270
        'Uses group-compress storage.\n'
2170
2271
        'Provides rich roots which are a one-way transition.\n',
2171
2272
        # 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
2186
2287
    help='Same as 2a.')
2187
2288
 
2188
2289
# The current format that is made on 'bzr init'.
2189
 
format_name = config.GlobalStack().get('default_format')
2190
 
controldir.format_registry.set_default(format_name)
 
2290
format_name = config.GlobalConfig().get_user_option('default_format')
 
2291
if format_name is None:
 
2292
    controldir.format_registry.set_default('2a')
 
2293
else:
 
2294
    controldir.format_registry.set_default(format_name)
2191
2295
 
2192
2296
# XXX 2010-08-20 JRV: There is still a lot of code relying on
2193
2297
# bzrlib.bzrdir.format_registry existing. When BzrDir.create/BzrDir.open/etc