~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bzrdir.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-11-04 16:06:30 UTC
  • mfrom: (4782.3.1 bzr.dev)
  • Revision ID: pqm@pqm.ubuntu.com-20091104160630-zeuyqfu2frdr4vob
(Neil Martinsen-Burrell) fix some markup

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
29
29
 
30
30
import os
31
31
import sys
32
 
import warnings
33
32
 
34
33
from bzrlib.lazy_import import lazy_import
35
34
lazy_import(globals(), """
355
354
                for subdir in sorted(subdirs, reverse=True):
356
355
                    pending.append(current_transport.clone(subdir))
357
356
 
358
 
    def list_branches(self):
359
 
        """Return a sequence of all branches local to this control directory.
360
 
 
361
 
        """
362
 
        try:
363
 
            return [self.open_branch()]
364
 
        except errors.NotBranchError:
365
 
            return []
366
 
 
367
357
    @staticmethod
368
358
    def find_branches(transport):
369
359
        """Find all branches under a transport.
381
371
            except errors.NoRepositoryPresent:
382
372
                pass
383
373
            else:
384
 
                return False, ([], repository)
385
 
            return True, (bzrdir.list_branches(), None)
386
 
        ret = []
387
 
        for branches, repo in BzrDir.find_bzrdirs(transport,
388
 
                                                  evaluate=evaluate):
 
374
                return False, (None, repository)
 
375
            try:
 
376
                branch = bzrdir.open_branch()
 
377
            except errors.NotBranchError:
 
378
                return True, (None, None)
 
379
            else:
 
380
                return True, (branch, None)
 
381
        branches = []
 
382
        for branch, repo in BzrDir.find_bzrdirs(transport, evaluate=evaluate):
389
383
            if repo is not None:
390
 
                ret.extend(repo.find_branches())
391
 
            if branches is not None:
392
 
                ret.extend(branches)
393
 
        return ret
 
384
                branches.extend(repo.find_branches())
 
385
            if branch is not None:
 
386
                branches.append(branch)
 
387
        return branches
394
388
 
395
389
    def destroy_repository(self):
396
390
        """Destroy the repository in this BzrDir"""
580
574
 
581
575
        :return: Tuple with old path name and new path name
582
576
        """
583
 
        def name_gen(base='backup.bzr'):
584
 
            counter = 1
585
 
            name = "%s.~%d~" % (base, counter)
586
 
            while self.root_transport.has(name):
587
 
                counter += 1
588
 
                name = "%s.~%d~" % (base, counter)
589
 
            return name
590
 
 
591
 
        backup_dir=name_gen()
592
577
        pb = ui.ui_factory.nested_progress_bar()
593
578
        try:
594
579
            # FIXME: bug 300001 -- the backup fails if the backup directory
598
583
            # FIXME: bug 262450 -- the backup directory should have the same
599
584
            # permissions as the .bzr directory (probably a bug in copy_tree)
600
585
            old_path = self.root_transport.abspath('.bzr')
601
 
            new_path = self.root_transport.abspath(backup_dir)
 
586
            new_path = self.root_transport.abspath('backup.bzr')
602
587
            ui.ui_factory.note('making backup of %s\n  to %s' % (old_path, new_path,))
603
 
            self.root_transport.copy_tree('.bzr', backup_dir)
 
588
            self.root_transport.copy_tree('.bzr', 'backup.bzr')
604
589
            return (old_path, new_path)
605
590
        finally:
606
591
            pb.finished()
1842
1827
    def probe_transport(klass, transport):
1843
1828
        """Return the .bzrdir style format present in a directory."""
1844
1829
        try:
1845
 
            format_string = transport.get_bytes(".bzr/branch-format")
 
1830
            format_string = transport.get(".bzr/branch-format").read()
1846
1831
        except errors.NoSuchFile:
1847
1832
            raise errors.NotBranchError(path=transport.base)
1848
1833
 
2624
2609
    def convert(self, to_convert, pb):
2625
2610
        """See Converter.convert()."""
2626
2611
        self.bzrdir = to_convert
2627
 
        if pb is not None:
2628
 
            warnings.warn("pb parameter to convert() is deprecated")
2629
 
        self.pb = ui.ui_factory.nested_progress_bar()
2630
 
        try:
2631
 
            ui.ui_factory.note('starting upgrade from format 4 to 5')
2632
 
            if isinstance(self.bzrdir.transport, local.LocalTransport):
2633
 
                self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2634
 
            self._convert_to_weaves()
2635
 
            return BzrDir.open(self.bzrdir.root_transport.base)
2636
 
        finally:
2637
 
            self.pb.finished()
 
2612
        self.pb = pb
 
2613
        ui.ui_factory.note('starting upgrade from format 4 to 5')
 
2614
        if isinstance(self.bzrdir.transport, local.LocalTransport):
 
2615
            self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
 
2616
        self._convert_to_weaves()
 
2617
        return BzrDir.open(self.bzrdir.root_transport.base)
2638
2618
 
2639
2619
    def _convert_to_weaves(self):
2640
2620
        ui.ui_factory.note('note: upgrade may be faster if all store files are ungzipped first')
2881
2861
    def convert(self, to_convert, pb):
2882
2862
        """See Converter.convert()."""
2883
2863
        self.bzrdir = to_convert
2884
 
        pb = ui.ui_factory.nested_progress_bar()
2885
 
        try:
2886
 
            ui.ui_factory.note('starting upgrade from format 5 to 6')
2887
 
            self._convert_to_prefixed()
2888
 
            return BzrDir.open(self.bzrdir.root_transport.base)
2889
 
        finally:
2890
 
            pb.finished()
 
2864
        self.pb = pb
 
2865
        ui.ui_factory.note('starting upgrade from format 5 to 6')
 
2866
        self._convert_to_prefixed()
 
2867
        return BzrDir.open(self.bzrdir.root_transport.base)
2891
2868
 
2892
2869
    def _convert_to_prefixed(self):
2893
2870
        from bzrlib.store import TransportStore
2926
2903
        from bzrlib.repofmt.weaverepo import RepositoryFormat7
2927
2904
        from bzrlib.branch import BzrBranchFormat5
2928
2905
        self.bzrdir = to_convert
2929
 
        self.pb = ui.ui_factory.nested_progress_bar()
 
2906
        self.pb = pb
2930
2907
        self.count = 0
2931
2908
        self.total = 20 # the steps we know about
2932
2909
        self.garbage_inventories = []
3012
2989
            'branch-format',
3013
2990
            BzrDirMetaFormat1().get_format_string(),
3014
2991
            mode=self.file_mode)
3015
 
        self.pb.finished()
3016
2992
        return BzrDir.open(self.bzrdir.root_transport.base)
3017
2993
 
3018
2994
    def make_lock(self, name):
3054
3030
    def convert(self, to_convert, pb):
3055
3031
        """See Converter.convert()."""
3056
3032
        self.bzrdir = to_convert
3057
 
        self.pb = ui.ui_factory.nested_progress_bar()
 
3033
        self.pb = pb
3058
3034
        self.count = 0
3059
3035
        self.total = 1
3060
3036
        self.step('checking repository format')
3068
3044
                ui.ui_factory.note('starting repository conversion')
3069
3045
                converter = CopyConverter(self.target_format.repository_format)
3070
3046
                converter.convert(repo, pb)
3071
 
        for branch in self.bzrdir.list_branches():
 
3047
        try:
 
3048
            branch = self.bzrdir.open_branch()
 
3049
        except errors.NotBranchError:
 
3050
            pass
 
3051
        else:
3072
3052
            # TODO: conversions of Branch and Tree should be done by
3073
3053
            # InterXFormat lookups/some sort of registry.
3074
3054
            # Avoid circular imports
3116
3096
                isinstance(self.target_format.workingtree_format,
3117
3097
                    workingtree_4.WorkingTreeFormat6)):
3118
3098
                workingtree_4.Converter4or5to6().convert(tree)
3119
 
        self.pb.finished()
3120
3099
        return to_convert
3121
3100
 
3122
3101
 
3129
3108
 
3130
3109
    def __init__(self):
3131
3110
        BzrDirMetaFormat1.__init__(self)
3132
 
        # XXX: It's a bit ugly that the network name is here, because we'd
3133
 
        # like to believe that format objects are stateless or at least
3134
 
        # immutable,  However, we do at least avoid mutating the name after
3135
 
        # it's returned.  See <https://bugs.edge.launchpad.net/bzr/+bug/504102>
3136
3111
        self._network_name = None
3137
3112
 
3138
 
    def __repr__(self):
3139
 
        return "%s(_network_name=%r)" % (self.__class__.__name__,
3140
 
            self._network_name)
3141
 
 
3142
3113
    def get_format_description(self):
3143
 
        if self._network_name:
3144
 
            real_format = network_format_registry.get(self._network_name)
3145
 
            return 'Remote: ' + real_format.get_format_description()
3146
3114
        return 'bzr remote bzrdir'
3147
3115
 
3148
3116
    def get_format_string(self):
3281
3249
        args.append(self._serialize_NoneString(repo_format_name))
3282
3250
        args.append(self._serialize_NoneTrueFalse(make_working_trees))
3283
3251
        args.append(self._serialize_NoneTrueFalse(shared_repo))
3284
 
        request_network_name = self._network_name or \
 
3252
        if self._network_name is None:
 
3253
            self._network_name = \
3285
3254
            BzrDirFormat.get_default_format().network_name()
3286
3255
        try:
3287
3256
            response = client.call('BzrDirFormat.initialize_ex_1.16',
3288
 
                request_network_name, path, *args)
 
3257
                self.network_name(), path, *args)
3289
3258
        except errors.UnknownSmartMethod:
3290
3259
            client._medium._remember_remote_is_before((1,16))
3291
3260
            local_dir_format = BzrDirMetaFormat1()
3541
3510
                experimental_pairs.append((key, help))
3542
3511
            else:
3543
3512
                output += wrapped(key, help, info)
3544
 
        output += "\nSee :doc:`formats-help` for more about storage formats."
 
3513
        output += "\nSee ``bzr help formats`` for more about storage formats."
3545
3514
        other_output = ""
3546
3515
        if len(experimental_pairs) > 0:
3547
3516
            other_output += "Experimental formats are shown below.\n\n"
3560
3529
            other_output += \
3561
3530
                "\nNo deprecated formats are available.\n\n"
3562
3531
        other_output += \
3563
 
                "\nSee :doc:`formats-help` for more about storage formats."
 
3532
            "\nSee ``bzr help formats`` for more about storage formats."
3564
3533
 
3565
3534
        if topic == 'other-formats':
3566
3535
            return other_output
3735
3704
format_registry.register('weave', BzrDirFormat6,
3736
3705
    'Pre-0.8 format.  Slower than knit and does not'
3737
3706
    ' support checkouts or shared repositories.',
3738
 
    hidden=True,
3739
3707
    deprecated=True)
3740
3708
format_registry.register_metadir('metaweave',
3741
3709
    'bzrlib.repofmt.weaverepo.RepositoryFormat7',
3742
3710
    'Transitional format in 0.8.  Slower than knit.',
3743
3711
    branch_format='bzrlib.branch.BzrBranchFormat5',
3744
3712
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3745
 
    hidden=True,
3746
3713
    deprecated=True)
3747
3714
format_registry.register_metadir('knit',
3748
3715
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3749
3716
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
3750
3717
    branch_format='bzrlib.branch.BzrBranchFormat5',
3751
3718
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3752
 
    hidden=True,
3753
3719
    deprecated=True)
3754
3720
format_registry.register_metadir('dirstate',
3755
3721
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3759
3725
    # this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3760
3726
    # directly from workingtree_4 triggers a circular import.
3761
3727
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3762
 
    hidden=True,
3763
3728
    deprecated=True)
3764
3729
format_registry.register_metadir('dirstate-tags',
3765
3730
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3768
3733
        ' Incompatible with bzr < 0.15.',
3769
3734
    branch_format='bzrlib.branch.BzrBranchFormat6',
3770
3735
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3771
 
    hidden=True,
3772
3736
    deprecated=True)
3773
3737
format_registry.register_metadir('rich-root',
3774
3738
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3776
3740
        ' bzr < 1.0.',
3777
3741
    branch_format='bzrlib.branch.BzrBranchFormat6',
3778
3742
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3779
 
    hidden=True,
3780
3743
    deprecated=True)
3781
3744
format_registry.register_metadir('dirstate-with-subtree',
3782
3745
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3793
3756
    help='New in 0.92: Pack-based format with data compatible with '
3794
3757
        'dirstate-tags format repositories. Interoperates with '
3795
3758
        'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3796
 
        ,
 
3759
        'Previously called knitpack-experimental.  '
 
3760
        'For more information, see '
 
3761
        'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3797
3762
    branch_format='bzrlib.branch.BzrBranchFormat6',
3798
3763
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3799
3764
    )
3802
3767
    help='New in 0.92: Pack-based format with data compatible with '
3803
3768
        'dirstate-with-subtree format repositories. Interoperates with '
3804
3769
        'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
3805
 
        ,
 
3770
        'Previously called knitpack-experimental.  '
 
3771
        'For more information, see '
 
3772
        'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
3806
3773
    branch_format='bzrlib.branch.BzrBranchFormat6',
3807
3774
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3808
3775
    hidden=True,
3814
3781
         '(needed for bzr-svn and bzr-git).',
3815
3782
    branch_format='bzrlib.branch.BzrBranchFormat6',
3816
3783
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3817
 
    hidden=True,
3818
3784
    )
3819
3785
format_registry.register_metadir('1.6',
3820
3786
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3823
3789
         'not present locally.',
3824
3790
    branch_format='bzrlib.branch.BzrBranchFormat7',
3825
3791
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3826
 
    hidden=True,
3827
3792
    )
3828
3793
format_registry.register_metadir('1.6.1-rich-root',
3829
3794
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3831
3796
         '(needed for bzr-svn and bzr-git).',
3832
3797
    branch_format='bzrlib.branch.BzrBranchFormat7',
3833
3798
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3834
 
    hidden=True,
3835
3799
    )
3836
3800
format_registry.register_metadir('1.9',
3837
3801
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3840
3804
         'performance for most operations.',
3841
3805
    branch_format='bzrlib.branch.BzrBranchFormat7',
3842
3806
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3843
 
    hidden=True,
3844
3807
    )
3845
3808
format_registry.register_metadir('1.9-rich-root',
3846
3809
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3848
3811
         '(needed for bzr-svn and bzr-git).',
3849
3812
    branch_format='bzrlib.branch.BzrBranchFormat7',
3850
3813
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3851
 
    hidden=True,
3852
3814
    )
3853
3815
format_registry.register_metadir('1.14',
3854
3816
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3870
3832
        'to and from rich-root-pack (and anything compatible with '
3871
3833
        'rich-root-pack) format repositories. Repositories and branches in '
3872
3834
        'this format can only be read by bzr.dev. Please read '
3873
 
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
 
3835
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3874
3836
        'before use.',
3875
3837
    branch_format='bzrlib.branch.BzrBranchFormat7',
3876
3838
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3877
3839
    experimental=True,
3878
3840
    alias=True,
3879
 
    hidden=True,
3880
3841
    )
3881
3842
format_registry.register_metadir('development-subtree',
3882
3843
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3884
3845
        'from pack-0.92-subtree (and anything compatible with '
3885
3846
        'pack-0.92-subtree) format repositories. Repositories and branches in '
3886
3847
        'this format can only be read by bzr.dev. Please read '
3887
 
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
 
3848
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3888
3849
        'before use.',
3889
3850
    branch_format='bzrlib.branch.BzrBranchFormat7',
3890
3851
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3891
3852
    experimental=True,
3892
 
    hidden=True,
3893
3853
    alias=False, # Restore to being an alias when an actual development subtree format is added
3894
3854
                 # This current non-alias status is simply because we did not introduce a
3895
3855
                 # chk based subtree format.
3900
3860
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
3901
3861
    help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
3902
3862
        'Please read '
3903
 
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
 
3863
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3904
3864
        'before use.',
3905
3865
    branch_format='bzrlib.branch.BzrBranchFormat7',
3906
3866
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3912
3872
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
3913
3873
    help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
3914
3874
        'rich roots. Please read '
3915
 
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
 
3875
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3916
3876
        'before use.',
3917
3877
    branch_format='bzrlib.branch.BzrBranchFormat7',
3918
3878
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3939
3899
    branch_format='bzrlib.branch.BzrBranchFormat7',
3940
3900
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3941
3901
    alias=True,
3942
 
    hidden=True,
3943
3902
    help='Same as 2a.')
3944
3903
 
3945
3904
# The current format that is made on 'bzr init'.