~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

(jelmer) Fix bug #1010339,
 use encoding_type='exact' for bzr testament (John A Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""builtin bzr commands"""
18
18
 
19
 
from __future__ import absolute_import
20
 
 
21
19
import os
22
20
 
23
 
import bzrlib.bzrdir
24
 
 
25
 
from bzrlib import lazy_import
26
 
lazy_import.lazy_import(globals(), """
 
21
from bzrlib.lazy_import import lazy_import
 
22
lazy_import(globals(), """
27
23
import cStringIO
28
 
import errno
29
24
import sys
30
25
import time
31
26
 
34
29
    bugtracker,
35
30
    bundle,
36
31
    btree_index,
37
 
    controldir,
 
32
    bzrdir,
38
33
    directory_service,
39
34
    delta,
40
35
    config as _mod_config,
62
57
from bzrlib.revisionspec import RevisionSpec, RevisionInfo
63
58
from bzrlib.smtp_connection import SMTPConnection
64
59
from bzrlib.workingtree import WorkingTree
65
 
from bzrlib.i18n import gettext, ngettext
66
60
""")
67
61
 
68
62
from bzrlib.commands import (
83
77
    )
84
78
 
85
79
 
86
 
def _get_branch_location(control_dir, possible_transports=None):
87
 
    """Return location of branch for this control dir."""
88
 
    try:
89
 
        this_branch = control_dir.open_branch(
90
 
            possible_transports=possible_transports)
91
 
        # This may be a heavy checkout, where we want the master branch
92
 
        master_location = this_branch.get_bound_location()
93
 
        if master_location is not None:
94
 
            return master_location
95
 
        # If not, use a local sibling
96
 
        return this_branch.base
97
 
    except errors.NotBranchError:
98
 
        format = control_dir.find_branch_format()
99
 
        if getattr(format, 'get_reference', None) is not None:
100
 
            return format.get_reference(control_dir)
101
 
        else:
102
 
            return control_dir.root_transport.base
103
 
 
104
 
 
105
 
def _is_colocated(control_dir, possible_transports=None):
106
 
    """Check if the branch in control_dir is colocated.
107
 
 
108
 
    :param control_dir: Control directory
109
 
    :return: Boolean indicating whether 
110
 
    """
111
 
    # This path is meant to be relative to the existing branch
112
 
    this_url = _get_branch_location(control_dir,
113
 
        possible_transports=possible_transports)
114
 
    # Perhaps the target control dir supports colocated branches?
115
 
    try:
116
 
        root = controldir.ControlDir.open(this_url,
117
 
            possible_transports=possible_transports)
118
 
    except errors.NotBranchError:
119
 
        return (False, this_url)
120
 
    else:
121
 
        try:
122
 
            wt = control_dir.open_workingtree()
123
 
        except (errors.NoWorkingTree, errors.NotLocalUrl):
124
 
            return (False, this_url)
125
 
        else:
126
 
            return (
127
 
                root._format.colocated_branches and
128
 
                control_dir.control_url == root.control_url,
129
 
                this_url)
130
 
 
131
 
 
132
 
def lookup_new_sibling_branch(control_dir, location, possible_transports=None):
133
 
    """Lookup the location for a new sibling branch.
134
 
 
135
 
    :param control_dir: Control directory relative to which to look up
136
 
        the name.
137
 
    :param location: Name of the new branch
138
 
    :return: Full location to the new branch
139
 
    """
140
 
    location = directory_service.directories.dereference(location)
141
 
    if '/' not in location and '\\' not in location:
142
 
        (colocated, this_url) = _is_colocated(control_dir, possible_transports)
143
 
 
144
 
        if colocated:
145
 
            return urlutils.join_segment_parameters(this_url,
146
 
                {"branch": urlutils.escape(location)})
147
 
        else:
148
 
            return urlutils.join(this_url, '..', urlutils.escape(location))
149
 
    return location
150
 
 
151
 
 
152
 
def lookup_sibling_branch(control_dir, location, possible_transports=None):
153
 
    """Lookup sibling branch.
154
 
    
155
 
    :param control_dir: Control directory relative to which to lookup the
156
 
        location.
157
 
    :param location: Location to look up
158
 
    :return: branch to open
159
 
    """
160
 
    try:
161
 
        # Perhaps it's a colocated branch?
162
 
        return control_dir.open_branch(location, 
163
 
            possible_transports=possible_transports)
164
 
    except (errors.NotBranchError, errors.NoColocatedBranchSupport):
165
 
        try:
166
 
            return Branch.open(location)
167
 
        except errors.NotBranchError:
168
 
            this_url = _get_branch_location(control_dir)
169
 
            return Branch.open(
170
 
                urlutils.join(
171
 
                    this_url, '..', urlutils.escape(location)))
172
 
 
173
 
 
174
80
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
175
81
def tree_files(file_list, default_branch=u'.', canonicalize=True,
176
82
    apply_view=True):
206
112
            if view_files:
207
113
                file_list = view_files
208
114
                view_str = views.view_display_str(view_files)
209
 
                note(gettext("Ignoring files outside view. View is %s") % view_str)
 
115
                note("Ignoring files outside view. View is %s" % view_str)
210
116
    return tree, file_list
211
117
 
212
118
 
214
120
    if revisions is None:
215
121
        return None
216
122
    if len(revisions) != 1:
217
 
        raise errors.BzrCommandError(gettext(
218
 
            'bzr %s --revision takes exactly one revision identifier') % (
 
123
        raise errors.BzrCommandError(
 
124
            'bzr %s --revision takes exactly one revision identifier' % (
219
125
                command_name,))
220
126
    return revisions[0]
221
127
 
290
196
    the --directory option is used to specify a different branch."""
291
197
    if directory is not None:
292
198
        return (None, Branch.open(directory), filename)
293
 
    return controldir.ControlDir.open_containing_tree_or_branch(filename)
 
199
    return bzrdir.BzrDir.open_containing_tree_or_branch(filename)
294
200
 
295
201
 
296
202
# TODO: Make sure no commands unconditionally use the working directory as a
382
288
        from bzrlib.status import show_tree_status
383
289
 
384
290
        if revision and len(revision) > 2:
385
 
            raise errors.BzrCommandError(gettext('bzr status --revision takes exactly'
386
 
                                         ' one or two revision specifiers'))
 
291
            raise errors.BzrCommandError('bzr status --revision takes exactly'
 
292
                                         ' one or two revision specifiers')
387
293
 
388
294
        tree, relfile_list = WorkingTree.open_containing_paths(file_list)
389
295
        # Avoid asking for specific files when that is not needed.
426
332
    @display_command
427
333
    def run(self, revision_id=None, revision=None, directory=u'.'):
428
334
        if revision_id is not None and revision is not None:
429
 
            raise errors.BzrCommandError(gettext('You can only supply one of'
430
 
                                         ' revision_id or --revision'))
 
335
            raise errors.BzrCommandError('You can only supply one of'
 
336
                                         ' revision_id or --revision')
431
337
        if revision_id is None and revision is None:
432
 
            raise errors.BzrCommandError(gettext('You must supply either'
433
 
                                         ' --revision or a revision_id'))
 
338
            raise errors.BzrCommandError('You must supply either'
 
339
                                         ' --revision or a revision_id')
434
340
 
435
 
        b = controldir.ControlDir.open_containing_tree_or_branch(directory)[1]
 
341
        b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
436
342
 
437
343
        revisions = b.repository.revisions
438
344
        if revisions is None:
439
 
            raise errors.BzrCommandError(gettext('Repository %r does not support '
440
 
                'access to raw revision texts'))
 
345
            raise errors.BzrCommandError('Repository %r does not support '
 
346
                'access to raw revision texts')
441
347
 
442
348
        b.repository.lock_read()
443
349
        try:
447
353
                try:
448
354
                    self.print_revision(revisions, revision_id)
449
355
                except errors.NoSuchRevision:
450
 
                    msg = gettext("The repository {0} contains no revision {1}.").format(
 
356
                    msg = "The repository %s contains no revision %s." % (
451
357
                        b.repository.base, revision_id)
452
358
                    raise errors.BzrCommandError(msg)
453
359
            elif revision is not None:
454
360
                for rev in revision:
455
361
                    if rev is None:
456
362
                        raise errors.BzrCommandError(
457
 
                            gettext('You cannot specify a NULL revision.'))
 
363
                            'You cannot specify a NULL revision.')
458
364
                    rev_id = rev.as_revision_id(b)
459
365
                    self.print_revision(revisions, rev_id)
460
366
        finally:
566
472
            location_list=['.']
567
473
 
568
474
        for location in location_list:
569
 
            d = controldir.ControlDir.open(location)
570
 
 
 
475
            d = bzrdir.BzrDir.open(location)
 
476
            
571
477
            try:
572
478
                working = d.open_workingtree()
573
479
            except errors.NoWorkingTree:
574
 
                raise errors.BzrCommandError(gettext("No working tree to remove"))
 
480
                raise errors.BzrCommandError("No working tree to remove")
575
481
            except errors.NotLocalUrl:
576
 
                raise errors.BzrCommandError(gettext("You cannot remove the working tree"
577
 
                                             " of a remote path"))
 
482
                raise errors.BzrCommandError("You cannot remove the working tree"
 
483
                                             " of a remote path")
578
484
            if not force:
579
485
                if (working.has_changes()):
580
486
                    raise errors.UncommittedChanges(working)
582
488
                    raise errors.ShelvedChanges(working)
583
489
 
584
490
            if working.user_url != working.branch.user_url:
585
 
                raise errors.BzrCommandError(gettext("You cannot remove the working tree"
586
 
                                             " from a lightweight checkout"))
 
491
                raise errors.BzrCommandError("You cannot remove the working tree"
 
492
                                             " from a lightweight checkout")
587
493
 
588
494
            d.destroy_workingtree()
589
495
 
621
527
                pass # There seems to be a real error here, so we'll reset
622
528
            else:
623
529
                # Refuse
624
 
                raise errors.BzrCommandError(gettext(
 
530
                raise errors.BzrCommandError(
625
531
                    'The tree does not appear to be corrupt. You probably'
626
532
                    ' want "bzr revert" instead. Use "--force" if you are'
627
 
                    ' sure you want to reset the working tree.'))
 
533
                    ' sure you want to reset the working tree.')
628
534
        if revision is None:
629
535
            revision_ids = None
630
536
        else:
633
539
            tree.reset_state(revision_ids)
634
540
        except errors.BzrError, e:
635
541
            if revision_ids is None:
636
 
                extra = (gettext(', the header appears corrupt, try passing -r -1'
637
 
                         ' to set the state to the last commit'))
 
542
                extra = (', the header appears corrupt, try passing -r -1'
 
543
                         ' to set the state to the last commit')
638
544
            else:
639
545
                extra = ''
640
 
            raise errors.BzrCommandError(gettext('failed to reset the tree state{0}').format(extra))
 
546
            raise errors.BzrCommandError('failed to reset the tree state'
 
547
                                         + extra)
641
548
 
642
549
 
643
550
class cmd_revno(Command):
649
556
    _see_also = ['info']
650
557
    takes_args = ['location?']
651
558
    takes_options = [
652
 
        Option('tree', help='Show revno of working tree.'),
653
 
        'revision',
 
559
        Option('tree', help='Show revno of working tree'),
654
560
        ]
655
561
 
656
562
    @display_command
657
 
    def run(self, tree=False, location=u'.', revision=None):
658
 
        if revision is not None and tree:
659
 
            raise errors.BzrCommandError(gettext("--tree and --revision can "
660
 
                "not be used together"))
661
 
 
 
563
    def run(self, tree=False, location=u'.'):
662
564
        if tree:
663
565
            try:
664
566
                wt = WorkingTree.open_containing(location)[0]
665
567
                self.add_cleanup(wt.lock_read().unlock)
666
568
            except (errors.NoWorkingTree, errors.NotLocalUrl):
667
569
                raise errors.NoWorkingTree(location)
668
 
            b = wt.branch
669
570
            revid = wt.last_revision()
 
571
            try:
 
572
                revno_t = wt.branch.revision_id_to_dotted_revno(revid)
 
573
            except errors.NoSuchRevision:
 
574
                revno_t = ('???',)
 
575
            revno = ".".join(str(n) for n in revno_t)
670
576
        else:
671
577
            b = Branch.open_containing(location)[0]
672
578
            self.add_cleanup(b.lock_read().unlock)
673
 
            if revision:
674
 
                if len(revision) != 1:
675
 
                    raise errors.BzrCommandError(gettext(
676
 
                        "Tags can only be placed on a single revision, "
677
 
                        "not on a range"))
678
 
                revid = revision[0].as_revision_id(b)
679
 
            else:
680
 
                revid = b.last_revision()
681
 
        try:
682
 
            revno_t = b.revision_id_to_dotted_revno(revid)
683
 
        except errors.NoSuchRevision:
684
 
            revno_t = ('???',)
685
 
        revno = ".".join(str(n) for n in revno_t)
 
579
            revno = b.revno()
686
580
        self.cleanup_now()
687
 
        self.outf.write(revno + '\n')
 
581
        self.outf.write(str(revno) + '\n')
688
582
 
689
583
 
690
584
class cmd_revision_info(Command):
697
591
        custom_help('directory',
698
592
            help='Branch to examine, '
699
593
                 'rather than the one containing the working directory.'),
700
 
        Option('tree', help='Show revno of working tree.'),
 
594
        Option('tree', help='Show revno of working tree'),
701
595
        ]
702
596
 
703
597
    @display_command
759
653
    are added.  This search proceeds recursively into versioned
760
654
    directories.  If no names are given '.' is assumed.
761
655
 
762
 
    A warning will be printed when nested trees are encountered,
763
 
    unless they are explicitly ignored.
764
 
 
765
656
    Therefore simply saying 'bzr add' will version all files that
766
657
    are currently unknown.
767
658
 
783
674
    
784
675
    Any files matching patterns in the ignore list will not be added
785
676
    unless they are explicitly mentioned.
786
 
    
787
 
    In recursive mode, files larger than the configuration option 
788
 
    add.maximum_file_size will be skipped. Named items are never skipped due
789
 
    to file size.
790
677
    """
791
678
    takes_args = ['file*']
792
679
    takes_options = [
819
706
            action = bzrlib.add.AddFromBaseAction(base_tree, base_path,
820
707
                          to_file=self.outf, should_print=(not is_quiet()))
821
708
        else:
822
 
            action = bzrlib.add.AddWithSkipLargeAction(to_file=self.outf,
 
709
            action = bzrlib.add.AddAction(to_file=self.outf,
823
710
                should_print=(not is_quiet()))
824
711
 
825
712
        if base_tree:
832
719
            if verbose:
833
720
                for glob in sorted(ignored.keys()):
834
721
                    for path in ignored[glob]:
835
 
                        self.outf.write(
836
 
                         gettext("ignored {0} matching \"{1}\"\n").format(
837
 
                         path, glob))
 
722
                        self.outf.write("ignored %s matching \"%s\"\n"
 
723
                                        % (path, glob))
838
724
 
839
725
 
840
726
class cmd_mkdir(Command):
844
730
    """
845
731
 
846
732
    takes_args = ['dir+']
847
 
    takes_options = [
848
 
        Option(
849
 
            'parents',
850
 
            help='No error if existing, make parent directories as needed.',
851
 
            short_name='p'
852
 
            )
853
 
        ]
854
733
    encoding_type = 'replace'
855
734
 
856
 
    @classmethod
857
 
    def add_file_with_parents(cls, wt, relpath):
858
 
        if wt.path2id(relpath) is not None:
859
 
            return
860
 
        cls.add_file_with_parents(wt, osutils.dirname(relpath))
861
 
        wt.add([relpath])
862
 
 
863
 
    @classmethod
864
 
    def add_file_single(cls, wt, relpath):
865
 
        wt.add([relpath])
866
 
 
867
 
    def run(self, dir_list, parents=False):
868
 
        if parents:
869
 
            add_file = self.add_file_with_parents
870
 
        else:
871
 
            add_file = self.add_file_single
872
 
        for dir in dir_list:
873
 
            wt, relpath = WorkingTree.open_containing(dir)
874
 
            if parents:
875
 
                try:
876
 
                    os.makedirs(dir)
877
 
                except OSError, e:
878
 
                    if e.errno != errno.EEXIST:
879
 
                        raise
 
735
    def run(self, dir_list):
 
736
        for d in dir_list:
 
737
            wt, dd = WorkingTree.open_containing(d)
 
738
            base = os.path.dirname(dd)
 
739
            id = wt.path2id(base)
 
740
            if id != None:
 
741
                os.mkdir(d)
 
742
                wt.add([dd])
 
743
                self.outf.write('added %s\n' % d)
880
744
            else:
881
 
                os.mkdir(dir)
882
 
            add_file(wt, relpath)
883
 
            if not is_quiet():
884
 
                self.outf.write(gettext('added %s\n') % dir)
 
745
                raise errors.NotVersionedError(path=base)
885
746
 
886
747
 
887
748
class cmd_relpath(Command):
923
784
    @display_command
924
785
    def run(self, revision=None, show_ids=False, kind=None, file_list=None):
925
786
        if kind and kind not in ['file', 'directory', 'symlink']:
926
 
            raise errors.BzrCommandError(gettext('invalid kind %r specified') % (kind,))
 
787
            raise errors.BzrCommandError('invalid kind %r specified' % (kind,))
927
788
 
928
789
        revision = _get_one_revision('inventory', revision)
929
790
        work_tree, file_list = WorkingTree.open_containing_paths(file_list)
937
798
            tree = work_tree
938
799
            extra_trees = []
939
800
 
940
 
        self.add_cleanup(tree.lock_read().unlock)
941
801
        if file_list is not None:
942
802
            file_ids = tree.paths2ids(file_list, trees=extra_trees,
943
803
                                      require_versioned=True)
944
804
            # find_ids_across_trees may include some paths that don't
945
805
            # exist in 'tree'.
946
 
            entries = tree.iter_entries_by_dir(specific_file_ids=file_ids)
 
806
            entries = sorted(
 
807
                (tree.id2path(file_id), tree.inventory[file_id])
 
808
                for file_id in file_ids if tree.has_id(file_id))
947
809
        else:
948
 
            entries = tree.iter_entries_by_dir()
 
810
            entries = tree.inventory.entries()
949
811
 
950
 
        for path, entry in sorted(entries):
 
812
        self.cleanup_now()
 
813
        for path, entry in entries:
951
814
            if kind and kind != entry.kind:
952
815
                continue
953
 
            if path == "":
954
 
                continue
955
816
            if show_ids:
956
817
                self.outf.write('%-50s %s\n' % (path, entry.file_id))
957
818
            else:
993
854
        if auto:
994
855
            return self.run_auto(names_list, after, dry_run)
995
856
        elif dry_run:
996
 
            raise errors.BzrCommandError(gettext('--dry-run requires --auto.'))
 
857
            raise errors.BzrCommandError('--dry-run requires --auto.')
997
858
        if names_list is None:
998
859
            names_list = []
999
860
        if len(names_list) < 2:
1000
 
            raise errors.BzrCommandError(gettext("missing file argument"))
 
861
            raise errors.BzrCommandError("missing file argument")
1001
862
        tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
1002
 
        for file_name in rel_names[0:-1]:
1003
 
            if file_name == '':
1004
 
                raise errors.BzrCommandError(gettext("can not move root of branch"))
1005
863
        self.add_cleanup(tree.lock_tree_write().unlock)
1006
864
        self._run(tree, names_list, rel_names, after)
1007
865
 
1008
866
    def run_auto(self, names_list, after, dry_run):
1009
867
        if names_list is not None and len(names_list) > 1:
1010
 
            raise errors.BzrCommandError(gettext('Only one path may be specified to'
1011
 
                                         ' --auto.'))
 
868
            raise errors.BzrCommandError('Only one path may be specified to'
 
869
                                         ' --auto.')
1012
870
        if after:
1013
 
            raise errors.BzrCommandError(gettext('--after cannot be specified with'
1014
 
                                         ' --auto.'))
 
871
            raise errors.BzrCommandError('--after cannot be specified with'
 
872
                                         ' --auto.')
1015
873
        work_tree, file_list = WorkingTree.open_containing_paths(
1016
874
            names_list, default_directory='.')
1017
875
        self.add_cleanup(work_tree.lock_tree_write().unlock)
1029
887
                and rel_names[0].lower() == rel_names[1].lower()):
1030
888
                into_existing = False
1031
889
            else:
 
890
                inv = tree.inventory
1032
891
                # 'fix' the case of a potential 'from'
1033
892
                from_id = tree.path2id(
1034
893
                            tree.get_canonical_inventory_path(rel_names[0]))
1035
894
                if (not osutils.lexists(names_list[0]) and
1036
 
                    from_id and tree.stored_kind(from_id) == "directory"):
 
895
                    from_id and inv.get_file_kind(from_id) == "directory"):
1037
896
                    into_existing = False
1038
897
        # move/rename
1039
898
        if into_existing:
1046
905
                    self.outf.write("%s => %s\n" % (src, dest))
1047
906
        else:
1048
907
            if len(names_list) != 2:
1049
 
                raise errors.BzrCommandError(gettext('to mv multiple files the'
 
908
                raise errors.BzrCommandError('to mv multiple files the'
1050
909
                                             ' destination must be a versioned'
1051
 
                                             ' directory'))
 
910
                                             ' directory')
1052
911
 
1053
912
            # for cicp file-systems: the src references an existing inventory
1054
913
            # item:
1114
973
    branches have diverged.
1115
974
 
1116
975
    If there is no default location set, the first pull will set it (use
1117
 
    --no-remember to avoid setting it). After that, you can omit the
 
976
    --no-remember to avoid settting it). After that, you can omit the
1118
977
    location to use the default.  To change the default, use --remember. The
1119
978
    value will only be saved if the remote location can be accessed.
1120
979
 
1121
 
    The --verbose option will display the revisions pulled using the log_format
1122
 
    configuration option. You can use a different format by overriding it with
1123
 
    -Olog_format=<other_format>.
1124
 
 
1125
980
    Note: The location can be specified either in the form of a branch,
1126
981
    or in the form of a path to a file containing a merge directive generated
1127
982
    with bzr send.
1164
1019
            self.add_cleanup(branch_to.lock_write().unlock)
1165
1020
 
1166
1021
        if tree_to is None and show_base:
1167
 
            raise errors.BzrCommandError(gettext("Need working tree for --show-base."))
 
1022
            raise errors.BzrCommandError("Need working tree for --show-base.")
1168
1023
 
1169
1024
        if local and not branch_to.get_bound_location():
1170
1025
            raise errors.LocalRequiresBoundBranch()
1180
1035
        stored_loc = branch_to.get_parent()
1181
1036
        if location is None:
1182
1037
            if stored_loc is None:
1183
 
                raise errors.BzrCommandError(gettext("No pull location known or"
1184
 
                                             " specified."))
 
1038
                raise errors.BzrCommandError("No pull location known or"
 
1039
                                             " specified.")
1185
1040
            else:
1186
1041
                display_url = urlutils.unescape_for_display(stored_loc,
1187
1042
                        self.outf.encoding)
1188
1043
                if not is_quiet():
1189
 
                    self.outf.write(gettext("Using saved parent location: %s\n") % display_url)
 
1044
                    self.outf.write("Using saved parent location: %s\n" % display_url)
1190
1045
                location = stored_loc
1191
1046
 
1192
1047
        revision = _get_one_revision('pull', revision)
1193
1048
        if mergeable is not None:
1194
1049
            if revision is not None:
1195
 
                raise errors.BzrCommandError(gettext(
1196
 
                    'Cannot use -r with merge directives or bundles'))
 
1050
                raise errors.BzrCommandError(
 
1051
                    'Cannot use -r with merge directives or bundles')
1197
1052
            mergeable.install_revisions(branch_to.repository)
1198
1053
            base_revision_id, revision_id, verified = \
1199
1054
                mergeable.get_merge_request(branch_to.repository)
1217
1072
                view_info=view_info)
1218
1073
            result = tree_to.pull(
1219
1074
                branch_from, overwrite, revision_id, change_reporter,
1220
 
                local=local, show_base=show_base)
 
1075
                possible_transports=possible_transports, local=local,
 
1076
                show_base=show_base)
1221
1077
        else:
1222
1078
            result = branch_to.pull(
1223
1079
                branch_from, overwrite, revision_id, local=local)
1254
1110
    After that you will be able to do a push without '--overwrite'.
1255
1111
 
1256
1112
    If there is no default push location set, the first push will set it (use
1257
 
    --no-remember to avoid setting it).  After that, you can omit the
 
1113
    --no-remember to avoid settting it).  After that, you can omit the
1258
1114
    location to use the default.  To change the default, use --remember. The
1259
1115
    value will only be saved if the remote location can be accessed.
1260
 
 
1261
 
    The --verbose option will display the revisions pushed using the log_format
1262
 
    configuration option. You can use a different format by overriding it with
1263
 
    -Olog_format=<other_format>.
1264
1116
    """
1265
1117
 
1266
1118
    _see_also = ['pull', 'update', 'working-trees']
1304
1156
            directory = '.'
1305
1157
        # Get the source branch
1306
1158
        (tree, br_from,
1307
 
         _unused) = controldir.ControlDir.open_containing_tree_or_branch(directory)
 
1159
         _unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1308
1160
        # Get the tip's revision_id
1309
1161
        revision = _get_one_revision('push', revision)
1310
1162
        if revision is not None:
1331
1183
                    # error by the feedback given to them. RBC 20080227.
1332
1184
                    stacked_on = parent_url
1333
1185
            if not stacked_on:
1334
 
                raise errors.BzrCommandError(gettext(
1335
 
                    "Could not determine branch to refer to."))
 
1186
                raise errors.BzrCommandError(
 
1187
                    "Could not determine branch to refer to.")
1336
1188
 
1337
1189
        # Get the destination location
1338
1190
        if location is None:
1339
1191
            stored_loc = br_from.get_push_location()
1340
1192
            if stored_loc is None:
1341
 
                parent_loc = br_from.get_parent()
1342
 
                if parent_loc:
1343
 
                    raise errors.BzrCommandError(gettext(
1344
 
                        "No push location known or specified. To push to the "
1345
 
                        "parent branch (at %s), use 'bzr push :parent'." %
1346
 
                        urlutils.unescape_for_display(parent_loc,
1347
 
                            self.outf.encoding)))
1348
 
                else:
1349
 
                    raise errors.BzrCommandError(gettext(
1350
 
                        "No push location known or specified."))
 
1193
                raise errors.BzrCommandError(
 
1194
                    "No push location known or specified.")
1351
1195
            else:
1352
1196
                display_url = urlutils.unescape_for_display(stored_loc,
1353
1197
                        self.outf.encoding)
1354
 
                note(gettext("Using saved push location: %s") % display_url)
 
1198
                self.outf.write("Using saved push location: %s\n" % display_url)
1355
1199
                location = stored_loc
1356
1200
 
1357
1201
        _show_push_branch(br_from, revision_id, location, self.outf,
1415
1259
                deprecated_name=self.invoked_as,
1416
1260
                recommended_name='branch',
1417
1261
                deprecated_in_version='2.4')
1418
 
        accelerator_tree, br_from = controldir.ControlDir.open_tree_or_branch(
 
1262
        accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1419
1263
            from_location)
1420
1264
        if not (hardlink or files_from):
1421
1265
            # accelerator_tree is usually slower because you have to read N
1434
1278
            # RBC 20060209
1435
1279
            revision_id = br_from.last_revision()
1436
1280
        if to_location is None:
1437
 
            to_location = getattr(br_from, "name", None)
1438
 
            if not to_location:
1439
 
                to_location = urlutils.derive_to_location(from_location)
 
1281
            to_location = urlutils.derive_to_location(from_location)
1440
1282
        to_transport = transport.get_transport(to_location)
1441
1283
        try:
1442
1284
            to_transport.mkdir('.')
1443
1285
        except errors.FileExists:
1444
 
            try:
1445
 
                to_dir = controldir.ControlDir.open_from_transport(
1446
 
                    to_transport)
1447
 
            except errors.NotBranchError:
1448
 
                if not use_existing_dir:
1449
 
                    raise errors.BzrCommandError(gettext('Target directory "%s" '
1450
 
                        'already exists.') % to_location)
1451
 
                else:
1452
 
                    to_dir = None
 
1286
            if not use_existing_dir:
 
1287
                raise errors.BzrCommandError('Target directory "%s" '
 
1288
                    'already exists.' % to_location)
1453
1289
            else:
1454
1290
                try:
1455
 
                    to_dir.open_branch()
 
1291
                    bzrdir.BzrDir.open_from_transport(to_transport)
1456
1292
                except errors.NotBranchError:
1457
1293
                    pass
1458
1294
                else:
1459
1295
                    raise errors.AlreadyBranchError(to_location)
1460
1296
        except errors.NoSuchFile:
1461
 
            raise errors.BzrCommandError(gettext('Parent of "%s" does not exist.')
 
1297
            raise errors.BzrCommandError('Parent of "%s" does not exist.'
1462
1298
                                         % to_location)
1463
 
        else:
1464
 
            to_dir = None
1465
 
        if to_dir is None:
1466
 
            try:
1467
 
                # preserve whatever source format we have.
1468
 
                to_dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1469
 
                                            possible_transports=[to_transport],
1470
 
                                            accelerator_tree=accelerator_tree,
1471
 
                                            hardlink=hardlink, stacked=stacked,
1472
 
                                            force_new_repo=standalone,
1473
 
                                            create_tree_if_local=not no_tree,
1474
 
                                            source_branch=br_from)
1475
 
                branch = to_dir.open_branch(
1476
 
                    possible_transports=[
1477
 
                        br_from.bzrdir.root_transport, to_transport])
1478
 
            except errors.NoSuchRevision:
1479
 
                to_transport.delete_tree('.')
1480
 
                msg = gettext("The branch {0} has no revision {1}.").format(
1481
 
                    from_location, revision)
1482
 
                raise errors.BzrCommandError(msg)
1483
 
        else:
1484
 
            try:
1485
 
                to_repo = to_dir.open_repository()
1486
 
            except errors.NoRepositoryPresent:
1487
 
                to_repo = to_dir.create_repository()
1488
 
            to_repo.fetch(br_from.repository, revision_id=revision_id)
1489
 
            branch = br_from.sprout(to_dir, revision_id=revision_id)
 
1299
        try:
 
1300
            # preserve whatever source format we have.
 
1301
            dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
 
1302
                                        possible_transports=[to_transport],
 
1303
                                        accelerator_tree=accelerator_tree,
 
1304
                                        hardlink=hardlink, stacked=stacked,
 
1305
                                        force_new_repo=standalone,
 
1306
                                        create_tree_if_local=not no_tree,
 
1307
                                        source_branch=br_from)
 
1308
            branch = dir.open_branch()
 
1309
        except errors.NoSuchRevision:
 
1310
            to_transport.delete_tree('.')
 
1311
            msg = "The branch %s has no revision %s." % (from_location,
 
1312
                revision)
 
1313
            raise errors.BzrCommandError(msg)
1490
1314
        _merge_tags_if_possible(br_from, branch)
1491
1315
        # If the source branch is stacked, the new branch may
1492
1316
        # be stacked whether we asked for that explicitly or not.
1493
1317
        # We therefore need a try/except here and not just 'if stacked:'
1494
1318
        try:
1495
 
            note(gettext('Created new stacked branch referring to %s.') %
 
1319
            note('Created new stacked branch referring to %s.' %
1496
1320
                branch.get_stacked_on_url())
1497
1321
        except (errors.NotStacked, errors.UnstackableBranchFormat,
1498
1322
            errors.UnstackableRepositoryFormat), e:
1499
 
            note(ngettext('Branched %d revision.', 'Branched %d revisions.', branch.revno()) % branch.revno())
 
1323
            note('Branched %d revision(s).' % branch.revno())
1500
1324
        if bind:
1501
1325
            # Bind to the parent
1502
1326
            parent_branch = Branch.open(from_location)
1503
1327
            branch.bind(parent_branch)
1504
 
            note(gettext('New branch bound to %s') % from_location)
 
1328
            note('New branch bound to %s' % from_location)
1505
1329
        if switch:
1506
1330
            # Switch to the new branch
1507
1331
            wt, _ = WorkingTree.open_containing('.')
1508
1332
            _mod_switch.switch(wt.bzrdir, branch)
1509
 
            note(gettext('Switched to branch: %s'),
 
1333
            note('Switched to branch: %s',
1510
1334
                urlutils.unescape_for_display(branch.base, 'utf-8'))
1511
1335
 
1512
1336
 
1513
 
class cmd_branches(Command):
1514
 
    __doc__ = """List the branches available at the current location.
1515
 
 
1516
 
    This command will print the names of all the branches at the current
1517
 
    location.
1518
 
    """
1519
 
 
1520
 
    takes_args = ['location?']
1521
 
    takes_options = [
1522
 
                  Option('recursive', short_name='R',
1523
 
                         help='Recursively scan for branches rather than '
1524
 
                              'just looking in the specified location.')]
1525
 
 
1526
 
    def run(self, location=".", recursive=False):
1527
 
        if recursive:
1528
 
            t = transport.get_transport(location)
1529
 
            if not t.listable():
1530
 
                raise errors.BzrCommandError(
1531
 
                    "Can't scan this type of location.")
1532
 
            for b in controldir.ControlDir.find_branches(t):
1533
 
                self.outf.write("%s\n" % urlutils.unescape_for_display(
1534
 
                    urlutils.relative_url(t.base, b.base),
1535
 
                    self.outf.encoding).rstrip("/"))
1536
 
        else:
1537
 
            dir = controldir.ControlDir.open_containing(location)[0]
1538
 
            try:
1539
 
                active_branch = dir.open_branch(name="")
1540
 
            except errors.NotBranchError:
1541
 
                active_branch = None
1542
 
            branches = dir.get_branches()
1543
 
            names = {}
1544
 
            for name, branch in branches.iteritems():
1545
 
                if name == "":
1546
 
                    continue
1547
 
                active = (active_branch is not None and
1548
 
                          active_branch.base == branch.base)
1549
 
                names[name] = active
1550
 
            # Only mention the current branch explicitly if it's not
1551
 
            # one of the colocated branches
1552
 
            if not any(names.values()) and active_branch is not None:
1553
 
                self.outf.write("* %s\n" % gettext("(default)"))
1554
 
            for name in sorted(names.keys()):
1555
 
                active = names[name]
1556
 
                if active:
1557
 
                    prefix = "*"
1558
 
                else:
1559
 
                    prefix = " "
1560
 
                self.outf.write("%s %s\n" % (
1561
 
                    prefix, name.encode(self.outf.encoding)))
1562
 
 
1563
 
 
1564
1337
class cmd_checkout(Command):
1565
1338
    __doc__ = """Create a new checkout of an existing branch.
1566
1339
 
1605
1378
        if branch_location is None:
1606
1379
            branch_location = osutils.getcwd()
1607
1380
            to_location = branch_location
1608
 
        accelerator_tree, source = controldir.ControlDir.open_tree_or_branch(
 
1381
        accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch(
1609
1382
            branch_location)
1610
1383
        if not (hardlink or files_from):
1611
1384
            # accelerator_tree is usually slower because you have to read N
1666
1439
 
1667
1440
 
1668
1441
class cmd_update(Command):
1669
 
    __doc__ = """Update a working tree to a new revision.
1670
 
 
1671
 
    This will perform a merge of the destination revision (the tip of the
1672
 
    branch, or the specified revision) into the working tree, and then make
1673
 
    that revision the basis revision for the working tree.  
1674
 
 
1675
 
    You can use this to visit an older revision, or to update a working tree
1676
 
    that is out of date from its branch.
1677
 
    
1678
 
    If there are any uncommitted changes in the tree, they will be carried
1679
 
    across and remain as uncommitted changes after the update.  To discard
1680
 
    these changes, use 'bzr revert'.  The uncommitted changes may conflict
1681
 
    with the changes brought in by the change in basis revision.
1682
 
 
1683
 
    If the tree's branch is bound to a master branch, bzr will also update
 
1442
    __doc__ = """Update a tree to have the latest code committed to its branch.
 
1443
 
 
1444
    This will perform a merge into the working tree, and may generate
 
1445
    conflicts. If you have any local changes, you will still
 
1446
    need to commit them after the update for the update to be complete.
 
1447
 
 
1448
    If you want to discard your local changes, you can just do a
 
1449
    'bzr revert' instead of 'bzr commit' after the update.
 
1450
 
 
1451
    If you want to restore a file that has been removed locally, use
 
1452
    'bzr revert' instead of 'bzr update'.
 
1453
 
 
1454
    If the tree's branch is bound to a master branch, it will also update
1684
1455
    the branch from the master.
1685
 
 
1686
 
    You cannot update just a single file or directory, because each Bazaar
1687
 
    working tree has just a single basis revision.  If you want to restore a
1688
 
    file that has been removed locally, use 'bzr revert' instead of 'bzr
1689
 
    update'.  If you want to restore a file to its state in a previous
1690
 
    revision, use 'bzr revert' with a '-r' option, or use 'bzr cat' to write
1691
 
    out the old content of that file to a new location.
1692
 
 
1693
 
    The 'dir' argument, if given, must be the location of the root of a
1694
 
    working tree to update.  By default, the working tree that contains the 
1695
 
    current working directory is used.
1696
1456
    """
1697
1457
 
1698
1458
    _see_also = ['pull', 'working-trees', 'status-flags']
1703
1463
                     ]
1704
1464
    aliases = ['up']
1705
1465
 
1706
 
    def run(self, dir=None, revision=None, show_base=None):
 
1466
    def run(self, dir='.', revision=None, show_base=None):
1707
1467
        if revision is not None and len(revision) != 1:
1708
 
            raise errors.BzrCommandError(gettext(
1709
 
                "bzr update --revision takes exactly one revision"))
1710
 
        if dir is None:
1711
 
            tree = WorkingTree.open_containing('.')[0]
1712
 
        else:
1713
 
            tree, relpath = WorkingTree.open_containing(dir)
1714
 
            if relpath:
1715
 
                # See bug 557886.
1716
 
                raise errors.BzrCommandError(gettext(
1717
 
                    "bzr update can only update a whole tree, "
1718
 
                    "not a file or subdirectory"))
 
1468
            raise errors.BzrCommandError(
 
1469
                        "bzr update --revision takes exactly one revision")
 
1470
        tree = WorkingTree.open_containing(dir)[0]
1719
1471
        branch = tree.branch
1720
1472
        possible_transports = []
1721
1473
        master = branch.get_master_branch(
1745
1497
            revision_id = branch.last_revision()
1746
1498
        if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1747
1499
            revno = branch.revision_id_to_dotted_revno(revision_id)
1748
 
            note(gettext("Tree is up to date at revision {0} of branch {1}"
1749
 
                        ).format('.'.join(map(str, revno)), branch_location))
 
1500
            note("Tree is up to date at revision %s of branch %s" %
 
1501
                ('.'.join(map(str, revno)), branch_location))
1750
1502
            return 0
1751
1503
        view_info = _get_view_info_for_change_reporter(tree)
1752
1504
        change_reporter = delta._ChangeReporter(
1760
1512
                old_tip=old_tip,
1761
1513
                show_base=show_base)
1762
1514
        except errors.NoSuchRevision, e:
1763
 
            raise errors.BzrCommandError(gettext(
 
1515
            raise errors.BzrCommandError(
1764
1516
                                  "branch has no revision %s\n"
1765
1517
                                  "bzr update --revision only works"
1766
 
                                  " for a revision in the branch history")
 
1518
                                  " for a revision in the branch history"
1767
1519
                                  % (e.revision))
1768
1520
        revno = tree.branch.revision_id_to_dotted_revno(
1769
1521
            _mod_revision.ensure_null(tree.last_revision()))
1770
 
        note(gettext('Updated to revision {0} of branch {1}').format(
1771
 
             '.'.join(map(str, revno)), branch_location))
 
1522
        note('Updated to revision %s of branch %s' %
 
1523
             ('.'.join(map(str, revno)), branch_location))
1772
1524
        parent_ids = tree.get_parent_ids()
1773
1525
        if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1774
 
            note(gettext('Your local commits will now show as pending merges with '
1775
 
                 "'bzr status', and can be committed with 'bzr commit'."))
 
1526
            note('Your local commits will now show as pending merges with '
 
1527
                 "'bzr status', and can be committed with 'bzr commit'.")
1776
1528
        if conflicts != 0:
1777
1529
            return 1
1778
1530
        else:
1819
1571
        else:
1820
1572
            noise_level = 0
1821
1573
        from bzrlib.info import show_bzrdir_info
1822
 
        show_bzrdir_info(controldir.ControlDir.open_containing(location)[0],
 
1574
        show_bzrdir_info(bzrdir.BzrDir.open_containing(location)[0],
1823
1575
                         verbose=noise_level, outfile=self.outf)
1824
1576
 
1825
1577
 
1850
1602
    def run(self, file_list, verbose=False, new=False,
1851
1603
        file_deletion_strategy='safe'):
1852
1604
        if file_deletion_strategy == 'force':
1853
 
            note(gettext("(The --force option is deprecated, rather use --no-backup "
1854
 
                "in future.)"))
 
1605
            note("(The --force option is deprecated, rather use --no-backup "
 
1606
                "in future.)")
1855
1607
            file_deletion_strategy = 'no-backup'
1856
1608
 
1857
1609
        tree, file_list = WorkingTree.open_containing_paths(file_list)
1867
1619
                specific_files=file_list).added
1868
1620
            file_list = sorted([f[0] for f in added], reverse=True)
1869
1621
            if len(file_list) == 0:
1870
 
                raise errors.BzrCommandError(gettext('No matching files.'))
 
1622
                raise errors.BzrCommandError('No matching files.')
1871
1623
        elif file_list is None:
1872
1624
            # missing files show up in iter_changes(basis) as
1873
1625
            # versioned-with-no-kind.
1957
1709
 
1958
1710
    def run(self, branch=".", canonicalize_chks=False):
1959
1711
        from bzrlib.reconcile import reconcile
1960
 
        dir = controldir.ControlDir.open(branch)
 
1712
        dir = bzrdir.BzrDir.open(branch)
1961
1713
        reconcile(dir, canonicalize_chks=canonicalize_chks)
1962
1714
 
1963
1715
 
1972
1724
    @display_command
1973
1725
    def run(self, location="."):
1974
1726
        branch = Branch.open_containing(location)[0]
1975
 
        self.add_cleanup(branch.lock_read().unlock)
1976
 
        graph = branch.repository.get_graph()
1977
 
        history = list(graph.iter_lefthand_ancestry(branch.last_revision(),
1978
 
            [_mod_revision.NULL_REVISION]))
1979
 
        for revid in reversed(history):
 
1727
        for revid in branch.revision_history():
1980
1728
            self.outf.write(revid)
1981
1729
            self.outf.write('\n')
1982
1730
 
2043
1791
                help='Specify a format for this branch. '
2044
1792
                'See "help formats".',
2045
1793
                lazy_registry=('bzrlib.bzrdir', 'format_registry'),
2046
 
                converter=lambda name: controldir.format_registry.make_bzrdir(name),
 
1794
                converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
2047
1795
                value_switches=True,
2048
1796
                title="Branch format",
2049
1797
                ),
2056
1804
    def run(self, location=None, format=None, append_revisions_only=False,
2057
1805
            create_prefix=False, no_tree=False):
2058
1806
        if format is None:
2059
 
            format = controldir.format_registry.make_bzrdir('default')
 
1807
            format = bzrdir.format_registry.make_bzrdir('default')
2060
1808
        if location is None:
2061
1809
            location = u'.'
2062
1810
 
2071
1819
            to_transport.ensure_base()
2072
1820
        except errors.NoSuchFile:
2073
1821
            if not create_prefix:
2074
 
                raise errors.BzrCommandError(gettext("Parent directory of %s"
 
1822
                raise errors.BzrCommandError("Parent directory of %s"
2075
1823
                    " does not exist."
2076
1824
                    "\nYou may supply --create-prefix to create all"
2077
 
                    " leading parent directories.")
 
1825
                    " leading parent directories."
2078
1826
                    % location)
2079
1827
            to_transport.create_prefix()
2080
1828
 
2081
1829
        try:
2082
 
            a_bzrdir = controldir.ControlDir.open_from_transport(to_transport)
 
1830
            a_bzrdir = bzrdir.BzrDir.open_from_transport(to_transport)
2083
1831
        except errors.NotBranchError:
2084
1832
            # really a NotBzrDir error...
2085
 
            create_branch = controldir.ControlDir.create_branch_convenience
 
1833
            create_branch = bzrdir.BzrDir.create_branch_convenience
2086
1834
            if no_tree:
2087
1835
                force_new_tree = False
2088
1836
            else:
2099
1847
                        raise errors.BranchExistsWithoutWorkingTree(location)
2100
1848
                raise errors.AlreadyBranchError(location)
2101
1849
            branch = a_bzrdir.create_branch()
2102
 
            if not no_tree and not a_bzrdir.has_workingtree():
 
1850
            if not no_tree:
2103
1851
                a_bzrdir.create_workingtree()
2104
1852
        if append_revisions_only:
2105
1853
            try:
2106
1854
                branch.set_append_revisions_only(True)
2107
1855
            except errors.UpgradeRequired:
2108
 
                raise errors.BzrCommandError(gettext('This branch format cannot be set'
2109
 
                    ' to append-revisions-only.  Try --default.'))
 
1856
                raise errors.BzrCommandError('This branch format cannot be set'
 
1857
                    ' to append-revisions-only.  Try --default.')
2110
1858
        if not is_quiet():
2111
1859
            from bzrlib.info import describe_layout, describe_format
2112
1860
            try:
2116
1864
            repository = branch.repository
2117
1865
            layout = describe_layout(repository, branch, tree).lower()
2118
1866
            format = describe_format(a_bzrdir, repository, branch, tree)
2119
 
            self.outf.write(gettext("Created a {0} (format: {1})\n").format(
2120
 
                  layout, format))
 
1867
            self.outf.write("Created a %s (format: %s)\n" % (layout, format))
2121
1868
            if repository.is_shared():
2122
1869
                #XXX: maybe this can be refactored into transport.path_or_url()
2123
1870
                url = repository.bzrdir.root_transport.external_url()
2125
1872
                    url = urlutils.local_path_from_url(url)
2126
1873
                except errors.InvalidURL:
2127
1874
                    pass
2128
 
                self.outf.write(gettext("Using shared repository: %s\n") % url)
 
1875
                self.outf.write("Using shared repository: %s\n" % url)
2129
1876
 
2130
1877
 
2131
1878
class cmd_init_repository(Command):
2161
1908
    takes_options = [RegistryOption('format',
2162
1909
                            help='Specify a format for this repository. See'
2163
1910
                                 ' "bzr help formats" for details.',
2164
 
                            lazy_registry=('bzrlib.controldir', 'format_registry'),
2165
 
                            converter=lambda name: controldir.format_registry.make_bzrdir(name),
 
1911
                            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
1912
                            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
2166
1913
                            value_switches=True, title='Repository format'),
2167
1914
                     Option('no-trees',
2168
1915
                             help='Branches in the repository will default to'
2172
1919
 
2173
1920
    def run(self, location, format=None, no_trees=False):
2174
1921
        if format is None:
2175
 
            format = controldir.format_registry.make_bzrdir('default')
 
1922
            format = bzrdir.format_registry.make_bzrdir('default')
2176
1923
 
2177
1924
        if location is None:
2178
1925
            location = '.'
2179
1926
 
2180
1927
        to_transport = transport.get_transport(location)
 
1928
        to_transport.ensure_base()
2181
1929
 
2182
 
        (repo, newdir, require_stacking, repository_policy) = (
2183
 
            format.initialize_on_transport_ex(to_transport,
2184
 
            create_prefix=True, make_working_trees=not no_trees,
2185
 
            shared_repo=True, force_new_repo=True,
2186
 
            use_existing_dir=True,
2187
 
            repo_format_name=format.repository_format.get_format_string()))
 
1930
        newdir = format.initialize_on_transport(to_transport)
 
1931
        repo = newdir.create_repository(shared=True)
 
1932
        repo.set_make_working_trees(not no_trees)
2188
1933
        if not is_quiet():
2189
1934
            from bzrlib.info import show_bzrdir_info
2190
 
            show_bzrdir_info(newdir, verbose=0, outfile=self.outf)
 
1935
            show_bzrdir_info(repo.bzrdir, verbose=0, outfile=self.outf)
2191
1936
 
2192
1937
 
2193
1938
class cmd_diff(Command):
2324
2069
        elif ':' in prefix:
2325
2070
            old_label, new_label = prefix.split(":")
2326
2071
        else:
2327
 
            raise errors.BzrCommandError(gettext(
 
2072
            raise errors.BzrCommandError(
2328
2073
                '--prefix expects two values separated by a colon'
2329
 
                ' (eg "old/:new/")'))
 
2074
                ' (eg "old/:new/")')
2330
2075
 
2331
2076
        if revision and len(revision) > 2:
2332
 
            raise errors.BzrCommandError(gettext('bzr diff --revision takes exactly'
2333
 
                                         ' one or two revision specifiers'))
 
2077
            raise errors.BzrCommandError('bzr diff --revision takes exactly'
 
2078
                                         ' one or two revision specifiers')
2334
2079
 
2335
2080
        if using is not None and format is not None:
2336
 
            raise errors.BzrCommandError(gettext(
2337
 
                '{0} and {1} are mutually exclusive').format(
2338
 
                '--using', '--format'))
 
2081
            raise errors.BzrCommandError('--using and --format are mutually '
 
2082
                'exclusive.')
2339
2083
 
2340
2084
        (old_tree, new_tree,
2341
2085
         old_branch, new_branch,
2371
2115
        self.add_cleanup(tree.lock_read().unlock)
2372
2116
        old = tree.basis_tree()
2373
2117
        self.add_cleanup(old.lock_read().unlock)
2374
 
        for path, ie in old.iter_entries_by_dir():
 
2118
        for path, ie in old.inventory.iter_entries():
2375
2119
            if not tree.has_id(ie.file_id):
2376
2120
                self.outf.write(path)
2377
2121
                if show_ids:
2415
2159
        self.add_cleanup(wt.lock_read().unlock)
2416
2160
        basis = wt.basis_tree()
2417
2161
        self.add_cleanup(basis.lock_read().unlock)
2418
 
        root_id = wt.get_root_id()
2419
 
        for file_id in wt.all_file_ids():
2420
 
            if basis.has_id(file_id):
2421
 
                continue
2422
 
            if root_id == file_id:
2423
 
                continue
2424
 
            path = wt.id2path(file_id)
 
2162
        basis_inv = basis.inventory
 
2163
        inv = wt.inventory
 
2164
        for file_id in inv:
 
2165
            if basis_inv.has_id(file_id):
 
2166
                continue
 
2167
            if inv.is_root(file_id) and len(basis_inv) == 0:
 
2168
                continue
 
2169
            path = inv.id2path(file_id)
2425
2170
            if not os.access(osutils.pathjoin(wt.basedir, path), os.F_OK):
2426
2171
                continue
2427
2172
            if null:
2448
2193
    try:
2449
2194
        return int(limitstring)
2450
2195
    except ValueError:
2451
 
        msg = gettext("The limit argument must be an integer.")
 
2196
        msg = "The limit argument must be an integer."
2452
2197
        raise errors.BzrCommandError(msg)
2453
2198
 
2454
2199
 
2456
2201
    try:
2457
2202
        return int(s)
2458
2203
    except ValueError:
2459
 
        msg = gettext("The levels argument must be an integer.")
 
2204
        msg = "The levels argument must be an integer."
2460
2205
        raise errors.BzrCommandError(msg)
2461
2206
 
2462
2207
 
2572
2317
 
2573
2318
    :Other filtering:
2574
2319
 
2575
 
      The --match option can be used for finding revisions that match a
2576
 
      regular expression in a commit message, committer, author or bug.
2577
 
      Specifying the option several times will match any of the supplied
2578
 
      expressions. --match-author, --match-bugs, --match-committer and
2579
 
      --match-message can be used to only match a specific field.
 
2320
      The --message option can be used for finding revisions that match a
 
2321
      regular expression in a commit message.
2580
2322
 
2581
2323
    :Tips & tricks:
2582
2324
 
2642
2384
                   argname='N',
2643
2385
                   type=_parse_levels),
2644
2386
            Option('message',
 
2387
                   short_name='m',
2645
2388
                   help='Show revisions whose message matches this '
2646
2389
                        'regular expression.',
2647
 
                   type=str,
2648
 
                   hidden=True),
 
2390
                   type=str),
2649
2391
            Option('limit',
2650
2392
                   short_name='l',
2651
2393
                   help='Limit the output to the first N revisions.',
2654
2396
            Option('show-diff',
2655
2397
                   short_name='p',
2656
2398
                   help='Show changes made in each revision as a patch.'),
2657
 
            Option('include-merged',
 
2399
            Option('include-merges',
2658
2400
                   help='Show merged revisions like --levels 0 does.'),
2659
 
            Option('include-merges', hidden=True,
2660
 
                   help='Historical alias for --include-merged.'),
2661
 
            Option('omit-merges',
2662
 
                   help='Do not report commits with more than one parent.'),
2663
2401
            Option('exclude-common-ancestry',
2664
2402
                   help='Display only the revisions that are not part'
2665
 
                   ' of both ancestries (require -rX..Y).'
 
2403
                   ' of both ancestries (require -rX..Y)'
2666
2404
                   ),
2667
2405
            Option('signatures',
2668
 
                   help='Show digital signature validity.'),
2669
 
            ListOption('match',
2670
 
                short_name='m',
2671
 
                help='Show revisions whose properties match this '
2672
 
                'expression.',
2673
 
                type=str),
2674
 
            ListOption('match-message',
2675
 
                   help='Show revisions whose message matches this '
2676
 
                   'expression.',
2677
 
                type=str),
2678
 
            ListOption('match-committer',
2679
 
                   help='Show revisions whose committer matches this '
2680
 
                   'expression.',
2681
 
                type=str),
2682
 
            ListOption('match-author',
2683
 
                   help='Show revisions whose authors match this '
2684
 
                   'expression.',
2685
 
                type=str),
2686
 
            ListOption('match-bugs',
2687
 
                   help='Show revisions whose bugs match this '
2688
 
                   'expression.',
2689
 
                type=str)
 
2406
                   help='Show digital signature validity'),
2690
2407
            ]
2691
2408
    encoding_type = 'replace'
2692
2409
 
2702
2419
            message=None,
2703
2420
            limit=None,
2704
2421
            show_diff=False,
2705
 
            include_merged=None,
 
2422
            include_merges=False,
2706
2423
            authors=None,
2707
2424
            exclude_common_ancestry=False,
2708
2425
            signatures=False,
2709
 
            match=None,
2710
 
            match_message=None,
2711
 
            match_committer=None,
2712
 
            match_author=None,
2713
 
            match_bugs=None,
2714
 
            omit_merges=False,
2715
 
            include_merges=symbol_versioning.DEPRECATED_PARAMETER,
2716
2426
            ):
2717
2427
        from bzrlib.log import (
2718
2428
            Logger,
2720
2430
            _get_info_for_log_files,
2721
2431
            )
2722
2432
        direction = (forward and 'forward') or 'reverse'
2723
 
        if symbol_versioning.deprecated_passed(include_merges):
2724
 
            ui.ui_factory.show_user_warning(
2725
 
                'deprecated_command_option',
2726
 
                deprecated_name='--include-merges',
2727
 
                recommended_name='--include-merged',
2728
 
                deprecated_in_version='2.5',
2729
 
                command=self.invoked_as)
2730
 
            if include_merged is None:
2731
 
                include_merged = include_merges
2732
 
            else:
2733
 
                raise errors.BzrCommandError(gettext(
2734
 
                    '{0} and {1} are mutually exclusive').format(
2735
 
                    '--include-merges', '--include-merged'))
2736
 
        if include_merged is None:
2737
 
            include_merged = False
2738
2433
        if (exclude_common_ancestry
2739
2434
            and (revision is None or len(revision) != 2)):
2740
 
            raise errors.BzrCommandError(gettext(
2741
 
                '--exclude-common-ancestry requires -r with two revisions'))
2742
 
        if include_merged:
 
2435
            raise errors.BzrCommandError(
 
2436
                '--exclude-common-ancestry requires -r with two revisions')
 
2437
        if include_merges:
2743
2438
            if levels is None:
2744
2439
                levels = 0
2745
2440
            else:
2746
 
                raise errors.BzrCommandError(gettext(
2747
 
                    '{0} and {1} are mutually exclusive').format(
2748
 
                    '--levels', '--include-merged'))
 
2441
                raise errors.BzrCommandError(
 
2442
                    '--levels and --include-merges are mutually exclusive')
2749
2443
 
2750
2444
        if change is not None:
2751
2445
            if len(change) > 1:
2752
2446
                raise errors.RangeInChangeOption()
2753
2447
            if revision is not None:
2754
 
                raise errors.BzrCommandError(gettext(
2755
 
                    '{0} and {1} are mutually exclusive').format(
2756
 
                    '--revision', '--change'))
 
2448
                raise errors.BzrCommandError(
 
2449
                    '--revision and --change are mutually exclusive')
2757
2450
            else:
2758
2451
                revision = change
2759
2452
 
2765
2458
                revision, file_list, self.add_cleanup)
2766
2459
            for relpath, file_id, kind in file_info_list:
2767
2460
                if file_id is None:
2768
 
                    raise errors.BzrCommandError(gettext(
2769
 
                        "Path unknown at end or start of revision range: %s") %
 
2461
                    raise errors.BzrCommandError(
 
2462
                        "Path unknown at end or start of revision range: %s" %
2770
2463
                        relpath)
2771
2464
                # If the relpath is the top of the tree, we log everything
2772
2465
                if relpath == '':
2784
2477
                location = revision[0].get_branch()
2785
2478
            else:
2786
2479
                location = '.'
2787
 
            dir, relpath = controldir.ControlDir.open_containing(location)
 
2480
            dir, relpath = bzrdir.BzrDir.open_containing(location)
2788
2481
            b = dir.open_branch()
2789
2482
            self.add_cleanup(b.lock_read().unlock)
2790
2483
            rev1, rev2 = _get_revision_range(revision, b, self.name())
2791
2484
 
2792
 
        if b.get_config_stack().get('validate_signatures_in_log'):
 
2485
        if b.get_config().validate_signatures_in_log():
2793
2486
            signatures = True
2794
2487
 
2795
2488
        if signatures:
2838
2531
        match_using_deltas = (len(file_ids) != 1 or filter_by_dir
2839
2532
            or delta_type or partial_history)
2840
2533
 
2841
 
        match_dict = {}
2842
 
        if match:
2843
 
            match_dict[''] = match
2844
 
        if match_message:
2845
 
            match_dict['message'] = match_message
2846
 
        if match_committer:
2847
 
            match_dict['committer'] = match_committer
2848
 
        if match_author:
2849
 
            match_dict['author'] = match_author
2850
 
        if match_bugs:
2851
 
            match_dict['bugs'] = match_bugs
2852
 
 
2853
2534
        # Build the LogRequest and execute it
2854
2535
        if len(file_ids) == 0:
2855
2536
            file_ids = None
2858
2539
            start_revision=rev1, end_revision=rev2, limit=limit,
2859
2540
            message_search=message, delta_type=delta_type,
2860
2541
            diff_type=diff_type, _match_using_deltas=match_using_deltas,
2861
 
            exclude_common_ancestry=exclude_common_ancestry, match=match_dict,
2862
 
            signature=signatures, omit_merges=omit_merges,
 
2542
            exclude_common_ancestry=exclude_common_ancestry,
 
2543
            signature=signatures
2863
2544
            )
2864
2545
        Logger(b, rqst).show(lf)
2865
2546
 
2882
2563
            # b is taken from revision[0].get_branch(), and
2883
2564
            # show_log will use its revision_history. Having
2884
2565
            # different branches will lead to weird behaviors.
2885
 
            raise errors.BzrCommandError(gettext(
 
2566
            raise errors.BzrCommandError(
2886
2567
                "bzr %s doesn't accept two revisions in different"
2887
 
                " branches.") % command_name)
 
2568
                " branches." % command_name)
2888
2569
        if start_spec.spec is None:
2889
2570
            # Avoid loading all the history.
2890
2571
            rev1 = RevisionInfo(branch, None, None)
2898
2579
        else:
2899
2580
            rev2 = end_spec.in_history(branch)
2900
2581
    else:
2901
 
        raise errors.BzrCommandError(gettext(
2902
 
            'bzr %s --revision takes one or two values.') % command_name)
 
2582
        raise errors.BzrCommandError(
 
2583
            'bzr %s --revision takes one or two values.' % command_name)
2903
2584
    return rev1, rev2
2904
2585
 
2905
2586
 
2976
2657
            null=False, kind=None, show_ids=False, path=None, directory=None):
2977
2658
 
2978
2659
        if kind and kind not in ('file', 'directory', 'symlink'):
2979
 
            raise errors.BzrCommandError(gettext('invalid kind specified'))
 
2660
            raise errors.BzrCommandError('invalid kind specified')
2980
2661
 
2981
2662
        if verbose and null:
2982
 
            raise errors.BzrCommandError(gettext('Cannot set both --verbose and --null'))
 
2663
            raise errors.BzrCommandError('Cannot set both --verbose and --null')
2983
2664
        all = not (unknown or versioned or ignored)
2984
2665
 
2985
2666
        selection = {'I':ignored, '?':unknown, 'V':versioned}
2988
2669
            fs_path = '.'
2989
2670
        else:
2990
2671
            if from_root:
2991
 
                raise errors.BzrCommandError(gettext('cannot specify both --from-root'
2992
 
                                             ' and PATH'))
 
2672
                raise errors.BzrCommandError('cannot specify both --from-root'
 
2673
                                             ' and PATH')
2993
2674
            fs_path = path
2994
2675
        tree, branch, relpath = \
2995
2676
            _open_directory_or_containing_tree_or_branch(fs_path, directory)
3011
2692
            if view_files:
3012
2693
                apply_view = True
3013
2694
                view_str = views.view_display_str(view_files)
3014
 
                note(gettext("Ignoring files outside view. View is %s") % view_str)
 
2695
                note("Ignoring files outside view. View is %s" % view_str)
3015
2696
 
3016
2697
        self.add_cleanup(tree.lock_read().unlock)
3017
2698
        for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
3164
2845
                self.outf.write("%s\n" % pattern)
3165
2846
            return
3166
2847
        if not name_pattern_list:
3167
 
            raise errors.BzrCommandError(gettext("ignore requires at least one "
3168
 
                "NAME_PATTERN or --default-rules."))
 
2848
            raise errors.BzrCommandError("ignore requires at least one "
 
2849
                "NAME_PATTERN or --default-rules.")
3169
2850
        name_pattern_list = [globbing.normalize_pattern(p)
3170
2851
                             for p in name_pattern_list]
3171
2852
        bad_patterns = ''
3172
 
        bad_patterns_count = 0
3173
2853
        for p in name_pattern_list:
3174
2854
            if not globbing.Globster.is_pattern_valid(p):
3175
 
                bad_patterns_count += 1
3176
2855
                bad_patterns += ('\n  %s' % p)
3177
2856
        if bad_patterns:
3178
 
            msg = (ngettext('Invalid ignore pattern found. %s', 
3179
 
                            'Invalid ignore patterns found. %s',
3180
 
                            bad_patterns_count) % bad_patterns)
 
2857
            msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
3181
2858
            ui.ui_factory.show_error(msg)
3182
2859
            raise errors.InvalidPattern('')
3183
2860
        for name_pattern in name_pattern_list:
3184
2861
            if (name_pattern[0] == '/' or
3185
2862
                (len(name_pattern) > 1 and name_pattern[1] == ':')):
3186
 
                raise errors.BzrCommandError(gettext(
3187
 
                    "NAME_PATTERN should not be an absolute path"))
 
2863
                raise errors.BzrCommandError(
 
2864
                    "NAME_PATTERN should not be an absolute path")
3188
2865
        tree, relpath = WorkingTree.open_containing(directory)
3189
2866
        ignores.tree_ignores_add_patterns(tree, name_pattern_list)
3190
2867
        ignored = globbing.Globster(name_pattern_list)
3197
2874
                if ignored.match(filename):
3198
2875
                    matches.append(filename)
3199
2876
        if len(matches) > 0:
3200
 
            self.outf.write(gettext("Warning: the following files are version "
3201
 
                  "controlled and match your ignore pattern:\n%s"
 
2877
            self.outf.write("Warning: the following files are version controlled and"
 
2878
                  " match your ignore pattern:\n%s"
3202
2879
                  "\nThese files will continue to be version controlled"
3203
 
                  " unless you 'bzr remove' them.\n") % ("\n".join(matches),))
 
2880
                  " unless you 'bzr remove' them.\n" % ("\n".join(matches),))
3204
2881
 
3205
2882
 
3206
2883
class cmd_ignored(Command):
3245
2922
        try:
3246
2923
            revno = int(revno)
3247
2924
        except ValueError:
3248
 
            raise errors.BzrCommandError(gettext("not a valid revision-number: %r")
 
2925
            raise errors.BzrCommandError("not a valid revision-number: %r"
3249
2926
                                         % revno)
3250
2927
        revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
3251
2928
        self.outf.write("%s\n" % revid)
3294
2971
        Option('per-file-timestamps',
3295
2972
               help='Set modification time of files to that of the last '
3296
2973
                    'revision in which it was changed.'),
3297
 
        Option('uncommitted',
3298
 
               help='Export the working tree contents rather than that of the '
3299
 
                    'last revision.'),
3300
2974
        ]
3301
2975
    def run(self, dest, branch_or_subdir=None, revision=None, format=None,
3302
 
        root=None, filters=False, per_file_timestamps=False, uncommitted=False,
3303
 
        directory=u'.'):
 
2976
        root=None, filters=False, per_file_timestamps=False, directory=u'.'):
3304
2977
        from bzrlib.export import export
3305
2978
 
3306
2979
        if branch_or_subdir is None:
3307
 
            branch_or_subdir = directory
3308
 
 
3309
 
        (tree, b, subdir) = controldir.ControlDir.open_containing_tree_or_branch(
3310
 
            branch_or_subdir)
3311
 
        if tree is not None:
3312
 
            self.add_cleanup(tree.lock_read().unlock)
3313
 
 
3314
 
        if uncommitted:
3315
 
            if tree is None:
3316
 
                raise errors.BzrCommandError(
3317
 
                    gettext("--uncommitted requires a working tree"))
3318
 
            export_tree = tree
 
2980
            tree = WorkingTree.open_containing(directory)[0]
 
2981
            b = tree.branch
 
2982
            subdir = None
3319
2983
        else:
3320
 
            export_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
 
2984
            b, subdir = Branch.open_containing(branch_or_subdir)
 
2985
            tree = None
 
2986
 
 
2987
        rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
3321
2988
        try:
3322
 
            export(export_tree, dest, format, root, subdir, filtered=filters,
 
2989
            export(rev_tree, dest, format, root, subdir, filtered=filters,
3323
2990
                   per_file_timestamps=per_file_timestamps)
3324
2991
        except errors.NoSuchExportFormat, e:
3325
 
            raise errors.BzrCommandError(
3326
 
                gettext('Unsupported export format: %s') % e.format)
 
2992
            raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3327
2993
 
3328
2994
 
3329
2995
class cmd_cat(Command):
3349
3015
    def run(self, filename, revision=None, name_from_revision=False,
3350
3016
            filters=False, directory=None):
3351
3017
        if revision is not None and len(revision) != 1:
3352
 
            raise errors.BzrCommandError(gettext("bzr cat --revision takes exactly"
3353
 
                                         " one revision specifier"))
 
3018
            raise errors.BzrCommandError("bzr cat --revision takes exactly"
 
3019
                                         " one revision specifier")
3354
3020
        tree, branch, relpath = \
3355
3021
            _open_directory_or_containing_tree_or_branch(filename, directory)
3356
3022
        self.add_cleanup(branch.lock_read().unlock)
3366
3032
 
3367
3033
        old_file_id = rev_tree.path2id(relpath)
3368
3034
 
3369
 
        # TODO: Split out this code to something that generically finds the
3370
 
        # best id for a path across one or more trees; it's like
3371
 
        # find_ids_across_trees but restricted to find just one. -- mbp
3372
 
        # 20110705.
3373
3035
        if name_from_revision:
3374
3036
            # Try in revision if requested
3375
3037
            if old_file_id is None:
3376
 
                raise errors.BzrCommandError(gettext(
3377
 
                    "{0!r} is not present in revision {1}").format(
 
3038
                raise errors.BzrCommandError(
 
3039
                    "%r is not present in revision %s" % (
3378
3040
                        filename, rev_tree.get_revision_id()))
3379
3041
            else:
3380
 
                actual_file_id = old_file_id
 
3042
                content = rev_tree.get_file_text(old_file_id)
3381
3043
        else:
3382
3044
            cur_file_id = tree.path2id(relpath)
3383
 
            if cur_file_id is not None and rev_tree.has_id(cur_file_id):
3384
 
                actual_file_id = cur_file_id
3385
 
            elif old_file_id is not None:
3386
 
                actual_file_id = old_file_id
3387
 
            else:
3388
 
                raise errors.BzrCommandError(gettext(
3389
 
                    "{0!r} is not present in revision {1}").format(
 
3045
            found = False
 
3046
            if cur_file_id is not None:
 
3047
                # Then try with the actual file id
 
3048
                try:
 
3049
                    content = rev_tree.get_file_text(cur_file_id)
 
3050
                    found = True
 
3051
                except errors.NoSuchId:
 
3052
                    # The actual file id didn't exist at that time
 
3053
                    pass
 
3054
            if not found and old_file_id is not None:
 
3055
                # Finally try with the old file id
 
3056
                content = rev_tree.get_file_text(old_file_id)
 
3057
                found = True
 
3058
            if not found:
 
3059
                # Can't be found anywhere
 
3060
                raise errors.BzrCommandError(
 
3061
                    "%r is not present in revision %s" % (
3390
3062
                        filename, rev_tree.get_revision_id()))
3391
3063
        if filtered:
3392
 
            from bzrlib.filter_tree import ContentFilterTree
3393
 
            filter_tree = ContentFilterTree(rev_tree,
3394
 
                rev_tree._content_filter_stack)
3395
 
            content = filter_tree.get_file_text(actual_file_id)
 
3064
            from bzrlib.filters import (
 
3065
                ContentFilterContext,
 
3066
                filtered_output_bytes,
 
3067
                )
 
3068
            filters = rev_tree._content_filter_stack(relpath)
 
3069
            chunks = content.splitlines(True)
 
3070
            content = filtered_output_bytes(chunks, filters,
 
3071
                ContentFilterContext(relpath, rev_tree))
 
3072
            self.cleanup_now()
 
3073
            self.outf.writelines(content)
3396
3074
        else:
3397
 
            content = rev_tree.get_file_text(actual_file_id)
3398
 
        self.cleanup_now()
3399
 
        self.outf.write(content)
 
3075
            self.cleanup_now()
 
3076
            self.outf.write(content)
3400
3077
 
3401
3078
 
3402
3079
class cmd_local_time_offset(Command):
3509
3186
    aliases = ['ci', 'checkin']
3510
3187
 
3511
3188
    def _iter_bug_fix_urls(self, fixes, branch):
3512
 
        default_bugtracker  = None
3513
3189
        # Configure the properties for bug fixing attributes.
3514
3190
        for fixed_bug in fixes:
3515
3191
            tokens = fixed_bug.split(':')
3516
 
            if len(tokens) == 1:
3517
 
                if default_bugtracker is None:
3518
 
                    branch_config = branch.get_config()
3519
 
                    default_bugtracker = branch_config.get_user_option(
3520
 
                        "bugtracker")
3521
 
                if default_bugtracker is None:
3522
 
                    raise errors.BzrCommandError(gettext(
3523
 
                        "No tracker specified for bug %s. Use the form "
3524
 
                        "'tracker:id' or specify a default bug tracker "
3525
 
                        "using the `bugtracker` option.\nSee "
3526
 
                        "\"bzr help bugs\" for more information on this "
3527
 
                        "feature. Commit refused.") % fixed_bug)
3528
 
                tag = default_bugtracker
3529
 
                bug_id = tokens[0]
3530
 
            elif len(tokens) != 2:
3531
 
                raise errors.BzrCommandError(gettext(
 
3192
            if len(tokens) != 2:
 
3193
                raise errors.BzrCommandError(
3532
3194
                    "Invalid bug %s. Must be in the form of 'tracker:id'. "
3533
3195
                    "See \"bzr help bugs\" for more information on this "
3534
 
                    "feature.\nCommit refused.") % fixed_bug)
3535
 
            else:
3536
 
                tag, bug_id = tokens
 
3196
                    "feature.\nCommit refused." % fixed_bug)
 
3197
            tag, bug_id = tokens
3537
3198
            try:
3538
3199
                yield bugtracker.get_bug_url(tag, branch, bug_id)
3539
3200
            except errors.UnknownBugTrackerAbbreviation:
3540
 
                raise errors.BzrCommandError(gettext(
3541
 
                    'Unrecognized bug %s. Commit refused.') % fixed_bug)
 
3201
                raise errors.BzrCommandError(
 
3202
                    'Unrecognized bug %s. Commit refused.' % fixed_bug)
3542
3203
            except errors.MalformedBugIdentifier, e:
3543
 
                raise errors.BzrCommandError(gettext(
3544
 
                    "%s\nCommit refused.") % (str(e),))
 
3204
                raise errors.BzrCommandError(
 
3205
                    "%s\nCommit refused." % (str(e),))
3545
3206
 
3546
3207
    def run(self, message=None, file=None, verbose=False, selected_list=None,
3547
3208
            unchanged=False, strict=False, local=False, fixes=None,
3564
3225
            try:
3565
3226
                commit_stamp, offset = timestamp.parse_patch_date(commit_time)
3566
3227
            except ValueError, e:
3567
 
                raise errors.BzrCommandError(gettext(
3568
 
                    "Could not parse --commit-time: " + str(e)))
 
3228
                raise errors.BzrCommandError(
 
3229
                    "Could not parse --commit-time: " + str(e))
3569
3230
 
3570
3231
        properties = {}
3571
3232
 
3604
3265
                message = message.replace('\r\n', '\n')
3605
3266
                message = message.replace('\r', '\n')
3606
3267
            if file:
3607
 
                raise errors.BzrCommandError(gettext(
3608
 
                    "please specify either --message or --file"))
 
3268
                raise errors.BzrCommandError(
 
3269
                    "please specify either --message or --file")
3609
3270
 
3610
3271
        def get_message(commit_obj):
3611
3272
            """Callback to get commit message"""
3634
3295
                    my_message = edit_commit_message_encoded(text,
3635
3296
                        start_message=start_message)
3636
3297
                if my_message is None:
3637
 
                    raise errors.BzrCommandError(gettext("please specify a commit"
3638
 
                        " message with either --message or --file"))
3639
 
                if my_message == "":
3640
 
                    raise errors.BzrCommandError(gettext("Empty commit message specified."
3641
 
                            " Please specify a commit message with either"
3642
 
                            " --message or --file or leave a blank message"
3643
 
                            " with --message \"\"."))
 
3298
                    raise errors.BzrCommandError("please specify a commit"
 
3299
                        " message with either --message or --file")
 
3300
            if my_message == "":
 
3301
                raise errors.BzrCommandError("empty commit message specified")
3644
3302
            return my_message
3645
3303
 
3646
3304
        # The API permits a commit with a filter of [] to mean 'select nothing'
3657
3315
                        exclude=tree.safe_relpath_files(exclude),
3658
3316
                        lossy=lossy)
3659
3317
        except PointlessCommit:
3660
 
            raise errors.BzrCommandError(gettext("No changes to commit."
 
3318
            raise errors.BzrCommandError("No changes to commit."
3661
3319
                " Please 'bzr add' the files you want to commit, or use"
3662
 
                " --unchanged to force an empty commit."))
 
3320
                " --unchanged to force an empty commit.")
3663
3321
        except ConflictsInTree:
3664
 
            raise errors.BzrCommandError(gettext('Conflicts detected in working '
 
3322
            raise errors.BzrCommandError('Conflicts detected in working '
3665
3323
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3666
 
                ' resolve.'))
 
3324
                ' resolve.')
3667
3325
        except StrictCommitFailed:
3668
 
            raise errors.BzrCommandError(gettext("Commit refused because there are"
3669
 
                              " unknown files in the working tree."))
 
3326
            raise errors.BzrCommandError("Commit refused because there are"
 
3327
                              " unknown files in the working tree.")
3670
3328
        except errors.BoundBranchOutOfDate, e:
3671
 
            e.extra_help = (gettext("\n"
 
3329
            e.extra_help = ("\n"
3672
3330
                'To commit to master branch, run update and then commit.\n'
3673
3331
                'You can also pass --local to commit to continue working '
3674
 
                'disconnected.'))
 
3332
                'disconnected.')
3675
3333
            raise
3676
3334
 
3677
3335
 
3784
3442
        RegistryOption('format',
3785
3443
            help='Upgrade to a specific format.  See "bzr help'
3786
3444
                 ' formats" for details.',
3787
 
            lazy_registry=('bzrlib.controldir', 'format_registry'),
3788
 
            converter=lambda name: controldir.format_registry.make_bzrdir(name),
 
3445
            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
3446
            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3789
3447
            value_switches=True, title='Branch format'),
3790
3448
        Option('clean',
3791
3449
            help='Remove the backup.bzr directory if successful.'),
3832
3490
            if directory is None:
3833
3491
                # use branch if we're inside one; otherwise global config
3834
3492
                try:
3835
 
                    c = Branch.open_containing(u'.')[0].get_config_stack()
 
3493
                    c = Branch.open_containing(u'.')[0].get_config()
3836
3494
                except errors.NotBranchError:
3837
 
                    c = _mod_config.GlobalStack()
 
3495
                    c = _mod_config.GlobalConfig()
3838
3496
            else:
3839
 
                c = Branch.open(directory).get_config_stack()
3840
 
            identity = c.get('email')
 
3497
                c = Branch.open(directory).get_config()
3841
3498
            if email:
3842
 
                self.outf.write(_mod_config.extract_email_address(identity)
3843
 
                                + '\n')
 
3499
                self.outf.write(c.user_email() + '\n')
3844
3500
            else:
3845
 
                self.outf.write(identity + '\n')
 
3501
                self.outf.write(c.username() + '\n')
3846
3502
            return
3847
3503
 
3848
3504
        if email:
3849
 
            raise errors.BzrCommandError(gettext("--email can only be used to display existing "
3850
 
                                         "identity"))
 
3505
            raise errors.BzrCommandError("--email can only be used to display existing "
 
3506
                                         "identity")
3851
3507
 
3852
3508
        # display a warning if an email address isn't included in the given name.
3853
3509
        try:
3859
3515
        # use global config unless --branch given
3860
3516
        if branch:
3861
3517
            if directory is None:
3862
 
                c = Branch.open_containing(u'.')[0].get_config_stack()
 
3518
                c = Branch.open_containing(u'.')[0].get_config()
3863
3519
            else:
3864
 
                c = Branch.open(directory).get_config_stack()
 
3520
                c = Branch.open(directory).get_config()
3865
3521
        else:
3866
 
            c = _mod_config.GlobalStack()
3867
 
        c.set('email', name)
 
3522
            c = _mod_config.GlobalConfig()
 
3523
        c.set_user_option('email', name)
3868
3524
 
3869
3525
 
3870
3526
class cmd_nick(Command):
3932
3588
 
3933
3589
    def remove_alias(self, alias_name):
3934
3590
        if alias_name is None:
3935
 
            raise errors.BzrCommandError(gettext(
3936
 
                'bzr alias --remove expects an alias to remove.'))
 
3591
            raise errors.BzrCommandError(
 
3592
                'bzr alias --remove expects an alias to remove.')
3937
3593
        # If alias is not found, print something like:
3938
3594
        # unalias: foo: not found
3939
3595
        c = _mod_config.GlobalConfig()
4095
3751
            load_list=None, debugflag=None, starting_with=None, subunit=False,
4096
3752
            parallel=None, lsprof_tests=False,
4097
3753
            sync=False):
4098
 
 
4099
 
        # During selftest, disallow proxying, as it can cause severe
4100
 
        # performance penalties and is only needed for thread
4101
 
        # safety. The selftest command is assumed to not use threads
4102
 
        # too heavily. The call should be as early as possible, as
4103
 
        # error reporting for past duplicate imports won't have useful
4104
 
        # backtraces.
4105
 
        lazy_import.disallow_proxying()
4106
 
 
4107
3754
        from bzrlib import tests
4108
3755
 
4109
3756
        if testspecs_list is not None:
4114
3761
            try:
4115
3762
                from bzrlib.tests import SubUnitBzrRunner
4116
3763
            except ImportError:
4117
 
                raise errors.BzrCommandError(gettext("subunit not available. subunit "
4118
 
                    "needs to be installed to use --subunit."))
 
3764
                raise errors.BzrCommandError("subunit not available. subunit "
 
3765
                    "needs to be installed to use --subunit.")
4119
3766
            self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
4120
3767
            # On Windows, disable automatic conversion of '\n' to '\r\n' in
4121
3768
            # stdout, which would corrupt the subunit stream. 
4130
3777
            self.additional_selftest_args.setdefault(
4131
3778
                'suite_decorators', []).append(parallel)
4132
3779
        if benchmark:
4133
 
            raise errors.BzrCommandError(gettext(
 
3780
            raise errors.BzrCommandError(
4134
3781
                "--benchmark is no longer supported from bzr 2.2; "
4135
 
                "use bzr-usertest instead"))
 
3782
                "use bzr-usertest instead")
4136
3783
        test_suite_factory = None
4137
3784
        if not exclude:
4138
3785
            exclude_pattern = None
4201
3848
 
4202
3849
    @display_command
4203
3850
    def run(self):
4204
 
        self.outf.write(gettext("It sure does!\n"))
 
3851
        self.outf.write("It sure does!\n")
4205
3852
 
4206
3853
 
4207
3854
class cmd_find_merge_base(Command):
4225
3872
        graph = branch1.repository.get_graph(branch2.repository)
4226
3873
        base_rev_id = graph.find_unique_lca(last1, last2)
4227
3874
 
4228
 
        self.outf.write(gettext('merge base is revision %s\n') % base_rev_id)
 
3875
        self.outf.write('merge base is revision %s\n' % base_rev_id)
4229
3876
 
4230
3877
 
4231
3878
class cmd_merge(Command):
4259
3906
    Merge will do its best to combine the changes in two branches, but there
4260
3907
    are some kinds of problems only a human can fix.  When it encounters those,
4261
3908
    it will mark a conflict.  A conflict means that you need to fix something,
4262
 
    before you can commit.
 
3909
    before you should commit.
4263
3910
 
4264
3911
    Use bzr resolve when you have fixed a problem.  See also bzr conflicts.
4265
3912
 
4266
3913
    If there is no default branch set, the first merge will set it (use
4267
 
    --no-remember to avoid setting it). After that, you can omit the branch
 
3914
    --no-remember to avoid settting it). After that, you can omit the branch
4268
3915
    to use the default.  To change the default, use --remember. The value will
4269
3916
    only be saved if the remote location can be accessed.
4270
3917
 
4356
4003
 
4357
4004
        tree = WorkingTree.open_containing(directory)[0]
4358
4005
        if tree.branch.revno() == 0:
4359
 
            raise errors.BzrCommandError(gettext('Merging into empty branches not currently supported, '
4360
 
                                         'https://bugs.launchpad.net/bzr/+bug/308562'))
 
4006
            raise errors.BzrCommandError('Merging into empty branches not currently supported, '
 
4007
                                         'https://bugs.launchpad.net/bzr/+bug/308562')
4361
4008
 
4362
4009
        try:
4363
4010
            basis_tree = tree.revision_tree(tree.last_revision())
4383
4030
                mergeable = None
4384
4031
            else:
4385
4032
                if uncommitted:
4386
 
                    raise errors.BzrCommandError(gettext('Cannot use --uncommitted'
4387
 
                        ' with bundles or merge directives.'))
 
4033
                    raise errors.BzrCommandError('Cannot use --uncommitted'
 
4034
                        ' with bundles or merge directives.')
4388
4035
 
4389
4036
                if revision is not None:
4390
 
                    raise errors.BzrCommandError(gettext(
4391
 
                        'Cannot use -r with merge directives or bundles'))
 
4037
                    raise errors.BzrCommandError(
 
4038
                        'Cannot use -r with merge directives or bundles')
4392
4039
                merger, verified = _mod_merge.Merger.from_mergeable(tree,
4393
4040
                   mergeable, None)
4394
4041
 
4395
4042
        if merger is None and uncommitted:
4396
4043
            if revision is not None and len(revision) > 0:
4397
 
                raise errors.BzrCommandError(gettext('Cannot use --uncommitted and'
4398
 
                    ' --revision at the same time.'))
 
4044
                raise errors.BzrCommandError('Cannot use --uncommitted and'
 
4045
                    ' --revision at the same time.')
4399
4046
            merger = self.get_merger_from_uncommitted(tree, location, None)
4400
4047
            allow_pending = False
4401
4048
 
4414
4061
            if merger.interesting_files:
4415
4062
                if not merger.other_tree.has_filename(
4416
4063
                    merger.interesting_files[0]):
4417
 
                    note(gettext("merger: ") + str(merger))
 
4064
                    note("merger: " + str(merger))
4418
4065
                    raise errors.PathsDoNotExist([location])
4419
 
            note(gettext('Nothing to do.'))
 
4066
            note('Nothing to do.')
4420
4067
            return 0
4421
4068
        if pull and not preview:
4422
4069
            if merger.interesting_files is not None:
4423
 
                raise errors.BzrCommandError(gettext('Cannot pull individual files'))
 
4070
                raise errors.BzrCommandError('Cannot pull individual files')
4424
4071
            if (merger.base_rev_id == tree.last_revision()):
4425
4072
                result = tree.pull(merger.other_branch, False,
4426
4073
                                   merger.other_rev_id)
4427
4074
                result.report(self.outf)
4428
4075
                return 0
4429
4076
        if merger.this_basis is None:
4430
 
            raise errors.BzrCommandError(gettext(
 
4077
            raise errors.BzrCommandError(
4431
4078
                "This branch has no commits."
4432
 
                " (perhaps you would prefer 'bzr pull')"))
 
4079
                " (perhaps you would prefer 'bzr pull')")
4433
4080
        if preview:
4434
4081
            return self._do_preview(merger)
4435
4082
        elif interactive:
4486
4133
    def sanity_check_merger(self, merger):
4487
4134
        if (merger.show_base and
4488
4135
            not merger.merge_type is _mod_merge.Merge3Merger):
4489
 
            raise errors.BzrCommandError(gettext("Show-base is not supported for this"
4490
 
                                         " merge type. %s") % merger.merge_type)
 
4136
            raise errors.BzrCommandError("Show-base is not supported for this"
 
4137
                                         " merge type. %s" % merger.merge_type)
4491
4138
        if merger.reprocess is None:
4492
4139
            if merger.show_base:
4493
4140
                merger.reprocess = False
4495
4142
                # Use reprocess if the merger supports it
4496
4143
                merger.reprocess = merger.merge_type.supports_reprocess
4497
4144
        if merger.reprocess and not merger.merge_type.supports_reprocess:
4498
 
            raise errors.BzrCommandError(gettext("Conflict reduction is not supported"
4499
 
                                         " for merge type %s.") %
 
4145
            raise errors.BzrCommandError("Conflict reduction is not supported"
 
4146
                                         " for merge type %s." %
4500
4147
                                         merger.merge_type)
4501
4148
        if merger.reprocess and merger.show_base:
4502
 
            raise errors.BzrCommandError(gettext("Cannot do conflict reduction and"
4503
 
                                         " show base."))
 
4149
            raise errors.BzrCommandError("Cannot do conflict reduction and"
 
4150
                                         " show base.")
4504
4151
 
4505
4152
    def _get_merger_from_branch(self, tree, location, revision, remember,
4506
4153
                                possible_transports, pb):
4610
4257
            stored_location_type = "parent"
4611
4258
        mutter("%s", stored_location)
4612
4259
        if stored_location is None:
4613
 
            raise errors.BzrCommandError(gettext("No location specified or remembered"))
 
4260
            raise errors.BzrCommandError("No location specified or remembered")
4614
4261
        display_url = urlutils.unescape_for_display(stored_location, 'utf-8')
4615
 
        note(gettext("{0} remembered {1} location {2}").format(verb_string,
4616
 
                stored_location_type, display_url))
 
4262
        note(u"%s remembered %s location %s", verb_string,
 
4263
                stored_location_type, display_url)
4617
4264
        return stored_location
4618
4265
 
4619
4266
 
4656
4303
        self.add_cleanup(tree.lock_write().unlock)
4657
4304
        parents = tree.get_parent_ids()
4658
4305
        if len(parents) != 2:
4659
 
            raise errors.BzrCommandError(gettext("Sorry, remerge only works after normal"
 
4306
            raise errors.BzrCommandError("Sorry, remerge only works after normal"
4660
4307
                                         " merges.  Not cherrypicking or"
4661
 
                                         " multi-merges."))
 
4308
                                         " multi-merges.")
4662
4309
        repository = tree.branch.repository
4663
4310
        interesting_ids = None
4664
4311
        new_conflicts = []
4823
4470
 
4824
4471
    @display_command
4825
4472
    def run(self, context=None):
4826
 
        from bzrlib import shellcomplete
 
4473
        import shellcomplete
4827
4474
        shellcomplete.shellcomplete(context)
4828
4475
 
4829
4476
 
4883
4530
            type=_parse_revision_str,
4884
4531
            help='Filter on local branch revisions (inclusive). '
4885
4532
                'See "help revisionspec" for details.'),
4886
 
        Option('include-merged',
 
4533
        Option('include-merges',
4887
4534
               'Show all revisions in addition to the mainline ones.'),
4888
 
        Option('include-merges', hidden=True,
4889
 
               help='Historical alias for --include-merged.'),
4890
4535
        ]
4891
4536
    encoding_type = 'replace'
4892
4537
 
4895
4540
            theirs_only=False,
4896
4541
            log_format=None, long=False, short=False, line=False,
4897
4542
            show_ids=False, verbose=False, this=False, other=False,
4898
 
            include_merged=None, revision=None, my_revision=None,
4899
 
            directory=u'.',
4900
 
            include_merges=symbol_versioning.DEPRECATED_PARAMETER):
 
4543
            include_merges=False, revision=None, my_revision=None,
 
4544
            directory=u'.'):
4901
4545
        from bzrlib.missing import find_unmerged, iter_log_revisions
4902
4546
        def message(s):
4903
4547
            if not is_quiet():
4904
4548
                self.outf.write(s)
4905
4549
 
4906
 
        if symbol_versioning.deprecated_passed(include_merges):
4907
 
            ui.ui_factory.show_user_warning(
4908
 
                'deprecated_command_option',
4909
 
                deprecated_name='--include-merges',
4910
 
                recommended_name='--include-merged',
4911
 
                deprecated_in_version='2.5',
4912
 
                command=self.invoked_as)
4913
 
            if include_merged is None:
4914
 
                include_merged = include_merges
4915
 
            else:
4916
 
                raise errors.BzrCommandError(gettext(
4917
 
                    '{0} and {1} are mutually exclusive').format(
4918
 
                    '--include-merges', '--include-merged'))
4919
 
        if include_merged is None:
4920
 
            include_merged = False
4921
4550
        if this:
4922
4551
            mine_only = this
4923
4552
        if other:
4938
4567
        if other_branch is None:
4939
4568
            other_branch = parent
4940
4569
            if other_branch is None:
4941
 
                raise errors.BzrCommandError(gettext("No peer location known"
4942
 
                                             " or specified."))
 
4570
                raise errors.BzrCommandError("No peer location known"
 
4571
                                             " or specified.")
4943
4572
            display_url = urlutils.unescape_for_display(parent,
4944
4573
                                                        self.outf.encoding)
4945
 
            message(gettext("Using saved parent location: {0}\n").format(
4946
 
                    display_url))
 
4574
            message("Using saved parent location: "
 
4575
                    + display_url + "\n")
4947
4576
 
4948
4577
        remote_branch = Branch.open(other_branch)
4949
4578
        if remote_branch.base == local_branch.base:
4962
4591
        local_extra, remote_extra = find_unmerged(
4963
4592
            local_branch, remote_branch, restrict,
4964
4593
            backward=not reverse,
4965
 
            include_merged=include_merged,
 
4594
            include_merges=include_merges,
4966
4595
            local_revid_range=local_revid_range,
4967
4596
            remote_revid_range=remote_revid_range)
4968
4597
 
4975
4604
 
4976
4605
        status_code = 0
4977
4606
        if local_extra and not theirs_only:
4978
 
            message(ngettext("You have %d extra revision:\n",
4979
 
                             "You have %d extra revisions:\n", 
4980
 
                             len(local_extra)) %
 
4607
            message("You have %d extra revision(s):\n" %
4981
4608
                len(local_extra))
4982
4609
            for revision in iter_log_revisions(local_extra,
4983
4610
                                local_branch.repository,
4991
4618
        if remote_extra and not mine_only:
4992
4619
            if printed_local is True:
4993
4620
                message("\n\n\n")
4994
 
            message(ngettext("You are missing %d revision:\n",
4995
 
                             "You are missing %d revisions:\n",
4996
 
                             len(remote_extra)) %
 
4621
            message("You are missing %d revision(s):\n" %
4997
4622
                len(remote_extra))
4998
4623
            for revision in iter_log_revisions(remote_extra,
4999
4624
                                remote_branch.repository,
5003
4628
 
5004
4629
        if mine_only and not local_extra:
5005
4630
            # We checked local, and found nothing extra
5006
 
            message(gettext('This branch has no new revisions.\n'))
 
4631
            message('This branch is up to date.\n')
5007
4632
        elif theirs_only and not remote_extra:
5008
4633
            # We checked remote, and found nothing extra
5009
 
            message(gettext('Other branch has no new revisions.\n'))
 
4634
            message('Other branch is up to date.\n')
5010
4635
        elif not (mine_only or theirs_only or local_extra or
5011
4636
                  remote_extra):
5012
4637
            # We checked both branches, and neither one had extra
5013
4638
            # revisions
5014
 
            message(gettext("Branches are up to date.\n"))
 
4639
            message("Branches are up to date.\n")
5015
4640
        self.cleanup_now()
5016
4641
        if not status_code and parent is None and other_branch is not None:
5017
4642
            self.add_cleanup(local_branch.lock_write().unlock)
5047
4672
        ]
5048
4673
 
5049
4674
    def run(self, branch_or_repo='.', clean_obsolete_packs=False):
5050
 
        dir = controldir.ControlDir.open_containing(branch_or_repo)[0]
 
4675
        dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
5051
4676
        try:
5052
4677
            branch = dir.open_branch()
5053
4678
            repository = branch.repository
5093
4718
            Option('strict',
5094
4719
                   help='Produce a strict-format testament.')]
5095
4720
    takes_args = ['branch?']
 
4721
    encoding_type = 'exact'
5096
4722
    @display_command
5097
4723
    def run(self, branch=u'.', revision=None, long=False, strict=False):
5098
4724
        from bzrlib.testament import Testament, StrictTestament
5111
4737
            rev_id = revision[0].as_revision_id(b)
5112
4738
        t = testament_class.from_revision(b.repository, rev_id)
5113
4739
        if long:
5114
 
            sys.stdout.writelines(t.as_text_lines())
 
4740
            self.outf.writelines(t.as_text_lines())
5115
4741
        else:
5116
 
            sys.stdout.write(t.as_short_text())
 
4742
            self.outf.write(t.as_short_text())
5117
4743
 
5118
4744
 
5119
4745
class cmd_annotate(Command):
5178
4804
 
5179
4805
    def run(self, revision_id_list=None, revision=None, directory=u'.'):
5180
4806
        if revision_id_list is not None and revision is not None:
5181
 
            raise errors.BzrCommandError(gettext('You can only supply one of revision_id or --revision'))
 
4807
            raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
5182
4808
        if revision_id_list is None and revision is None:
5183
 
            raise errors.BzrCommandError(gettext('You must supply either --revision or a revision_id'))
 
4809
            raise errors.BzrCommandError('You must supply either --revision or a revision_id')
5184
4810
        b = WorkingTree.open_containing(directory)[0].branch
5185
4811
        self.add_cleanup(b.lock_write().unlock)
5186
4812
        return self._run(b, revision_id_list, revision)
5187
4813
 
5188
4814
    def _run(self, b, revision_id_list, revision):
5189
4815
        import bzrlib.gpg as gpg
5190
 
        gpg_strategy = gpg.GPGStrategy(b.get_config_stack())
 
4816
        gpg_strategy = gpg.GPGStrategy(b.get_config())
5191
4817
        if revision_id_list is not None:
5192
4818
            b.repository.start_write_group()
5193
4819
            try:
5218
4844
                if to_revid is None:
5219
4845
                    to_revno = b.revno()
5220
4846
                if from_revno is None or to_revno is None:
5221
 
                    raise errors.BzrCommandError(gettext('Cannot sign a range of non-revision-history revisions'))
 
4847
                    raise errors.BzrCommandError('Cannot sign a range of non-revision-history revisions')
5222
4848
                b.repository.start_write_group()
5223
4849
                try:
5224
4850
                    for revno in range(from_revno, to_revno + 1):
5230
4856
                else:
5231
4857
                    b.repository.commit_write_group()
5232
4858
            else:
5233
 
                raise errors.BzrCommandError(gettext('Please supply either one revision, or a range.'))
 
4859
                raise errors.BzrCommandError('Please supply either one revision, or a range.')
5234
4860
 
5235
4861
 
5236
4862
class cmd_bind(Command):
5255
4881
            try:
5256
4882
                location = b.get_old_bound_location()
5257
4883
            except errors.UpgradeRequired:
5258
 
                raise errors.BzrCommandError(gettext('No location supplied.  '
5259
 
                    'This format does not remember old locations.'))
 
4884
                raise errors.BzrCommandError('No location supplied.  '
 
4885
                    'This format does not remember old locations.')
5260
4886
            else:
5261
4887
                if location is None:
5262
4888
                    if b.get_bound_location() is not None:
5263
 
                        raise errors.BzrCommandError(gettext('Branch is already bound'))
 
4889
                        raise errors.BzrCommandError('Branch is already bound')
5264
4890
                    else:
5265
 
                        raise errors.BzrCommandError(gettext('No location supplied '
5266
 
                            'and no previous location known'))
 
4891
                        raise errors.BzrCommandError('No location supplied '
 
4892
                            'and no previous location known')
5267
4893
        b_other = Branch.open(location)
5268
4894
        try:
5269
4895
            b.bind(b_other)
5270
4896
        except errors.DivergedBranches:
5271
 
            raise errors.BzrCommandError(gettext('These branches have diverged.'
5272
 
                                         ' Try merging, and then bind again.'))
 
4897
            raise errors.BzrCommandError('These branches have diverged.'
 
4898
                                         ' Try merging, and then bind again.')
5273
4899
        if b.get_config().has_explicit_nickname():
5274
4900
            b.nick = b_other.nick
5275
4901
 
5288
4914
    def run(self, directory=u'.'):
5289
4915
        b, relpath = Branch.open_containing(directory)
5290
4916
        if not b.unbind():
5291
 
            raise errors.BzrCommandError(gettext('Local branch is not bound'))
 
4917
            raise errors.BzrCommandError('Local branch is not bound')
5292
4918
 
5293
4919
 
5294
4920
class cmd_uncommit(Command):
5315
4941
    takes_options = ['verbose', 'revision',
5316
4942
                    Option('dry-run', help='Don\'t actually make changes.'),
5317
4943
                    Option('force', help='Say yes to all questions.'),
5318
 
                    Option('keep-tags',
5319
 
                           help='Keep tags that point to removed revisions.'),
5320
4944
                    Option('local',
5321
4945
                           help="Only remove the commits from the local branch"
5322
4946
                                " when in a checkout."
5326
4950
    aliases = []
5327
4951
    encoding_type = 'replace'
5328
4952
 
5329
 
    def run(self, location=None, dry_run=False, verbose=False,
5330
 
            revision=None, force=False, local=False, keep_tags=False):
 
4953
    def run(self, location=None,
 
4954
            dry_run=False, verbose=False,
 
4955
            revision=None, force=False, local=False):
5331
4956
        if location is None:
5332
4957
            location = u'.'
5333
 
        control, relpath = controldir.ControlDir.open_containing(location)
 
4958
        control, relpath = bzrdir.BzrDir.open_containing(location)
5334
4959
        try:
5335
4960
            tree = control.open_workingtree()
5336
4961
            b = tree.branch
5342
4967
            self.add_cleanup(tree.lock_write().unlock)
5343
4968
        else:
5344
4969
            self.add_cleanup(b.lock_write().unlock)
5345
 
        return self._run(b, tree, dry_run, verbose, revision, force,
5346
 
                         local, keep_tags)
 
4970
        return self._run(b, tree, dry_run, verbose, revision, force, local=local)
5347
4971
 
5348
 
    def _run(self, b, tree, dry_run, verbose, revision, force, local,
5349
 
             keep_tags):
 
4972
    def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
5350
4973
        from bzrlib.log import log_formatter, show_log
5351
4974
        from bzrlib.uncommit import uncommit
5352
4975
 
5367
4990
                rev_id = b.get_rev_id(revno)
5368
4991
 
5369
4992
        if rev_id is None or _mod_revision.is_null(rev_id):
5370
 
            self.outf.write(gettext('No revisions to uncommit.\n'))
 
4993
            self.outf.write('No revisions to uncommit.\n')
5371
4994
            return 1
5372
4995
 
5373
4996
        lf = log_formatter('short',
5382
5005
                 end_revision=last_revno)
5383
5006
 
5384
5007
        if dry_run:
5385
 
            self.outf.write(gettext('Dry-run, pretending to remove'
5386
 
                            ' the above revisions.\n'))
 
5008
            self.outf.write('Dry-run, pretending to remove'
 
5009
                            ' the above revisions.\n')
5387
5010
        else:
5388
 
            self.outf.write(gettext('The above revision(s) will be removed.\n'))
 
5011
            self.outf.write('The above revision(s) will be removed.\n')
5389
5012
 
5390
5013
        if not force:
5391
5014
            if not ui.ui_factory.confirm_action(
5392
 
                    gettext(u'Uncommit these revisions'),
 
5015
                    u'Uncommit these revisions',
5393
5016
                    'bzrlib.builtins.uncommit',
5394
5017
                    {}):
5395
 
                self.outf.write(gettext('Canceled\n'))
 
5018
                self.outf.write('Canceled\n')
5396
5019
                return 0
5397
5020
 
5398
5021
        mutter('Uncommitting from {%s} to {%s}',
5399
5022
               last_rev_id, rev_id)
5400
5023
        uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
5401
 
                 revno=revno, local=local, keep_tags=keep_tags)
5402
 
        self.outf.write(gettext('You can restore the old tip by running:\n'
5403
 
             '  bzr pull . -r revid:%s\n') % last_rev_id)
 
5024
                 revno=revno, local=local)
 
5025
        self.outf.write('You can restore the old tip by running:\n'
 
5026
             '  bzr pull . -r revid:%s\n' % last_rev_id)
5404
5027
 
5405
5028
 
5406
5029
class cmd_break_lock(Command):
5440
5063
            conf = _mod_config.LockableConfig(file_name=location)
5441
5064
            conf.break_lock()
5442
5065
        else:
5443
 
            control, relpath = controldir.ControlDir.open_containing(location)
 
5066
            control, relpath = bzrdir.BzrDir.open_containing(location)
5444
5067
            try:
5445
5068
                control.break_lock()
5446
5069
            except NotImplementedError:
5490
5113
                    'option leads to global uncontrolled write access to your '
5491
5114
                    'file system.'
5492
5115
                ),
5493
 
        Option('client-timeout', type=float,
5494
 
               help='Override the default idle client timeout (5min).'),
5495
5116
        ]
5496
5117
 
5497
5118
    def get_host_and_port(self, port):
5514
5135
        return host, port
5515
5136
 
5516
5137
    def run(self, port=None, inet=False, directory=None, allow_writes=False,
5517
 
            protocol=None, client_timeout=None):
 
5138
            protocol=None):
5518
5139
        from bzrlib import transport
5519
5140
        if directory is None:
5520
5141
            directory = os.getcwd()
5521
5142
        if protocol is None:
5522
5143
            protocol = transport.transport_server_registry.get()
5523
5144
        host, port = self.get_host_and_port(port)
5524
 
        url = transport.location_to_url(directory)
 
5145
        url = urlutils.local_path_to_url(directory)
5525
5146
        if not allow_writes:
5526
5147
            url = 'readonly+' + url
5527
 
        t = transport.get_transport_from_url(url)
5528
 
        try:
5529
 
            protocol(t, host, port, inet, client_timeout)
5530
 
        except TypeError, e:
5531
 
            # We use symbol_versioning.deprecated_in just so that people
5532
 
            # grepping can find it here.
5533
 
            # symbol_versioning.deprecated_in((2, 5, 0))
5534
 
            symbol_versioning.warn(
5535
 
                'Got TypeError(%s)\ntrying to call protocol: %s.%s\n'
5536
 
                'Most likely it needs to be updated to support a'
5537
 
                ' "timeout" parameter (added in bzr 2.5.0)'
5538
 
                % (e, protocol.__module__, protocol),
5539
 
                DeprecationWarning)
5540
 
            protocol(t, host, port, inet)
 
5148
        t = transport.get_transport(url)
 
5149
        protocol(t, host, port, inet)
5541
5150
 
5542
5151
 
5543
5152
class cmd_join(Command):
5566
5175
        containing_tree = WorkingTree.open_containing(parent_dir)[0]
5567
5176
        repo = containing_tree.branch.repository
5568
5177
        if not repo.supports_rich_root():
5569
 
            raise errors.BzrCommandError(gettext(
 
5178
            raise errors.BzrCommandError(
5570
5179
                "Can't join trees because %s doesn't support rich root data.\n"
5571
 
                "You can use bzr upgrade on the repository.")
 
5180
                "You can use bzr upgrade on the repository."
5572
5181
                % (repo,))
5573
5182
        if reference:
5574
5183
            try:
5576
5185
            except errors.BadReferenceTarget, e:
5577
5186
                # XXX: Would be better to just raise a nicely printable
5578
5187
                # exception from the real origin.  Also below.  mbp 20070306
5579
 
                raise errors.BzrCommandError(
5580
 
                       gettext("Cannot join {0}.  {1}").format(tree, e.reason))
 
5188
                raise errors.BzrCommandError("Cannot join %s.  %s" %
 
5189
                                             (tree, e.reason))
5581
5190
        else:
5582
5191
            try:
5583
5192
                containing_tree.subsume(sub_tree)
5584
5193
            except errors.BadSubsumeSource, e:
5585
 
                raise errors.BzrCommandError(
5586
 
                       gettext("Cannot join {0}.  {1}").format(tree, e.reason))
 
5194
                raise errors.BzrCommandError("Cannot join %s.  %s" %
 
5195
                                             (tree, e.reason))
5587
5196
 
5588
5197
 
5589
5198
class cmd_split(Command):
5673
5282
        if submit_branch is None:
5674
5283
            submit_branch = branch.get_parent()
5675
5284
        if submit_branch is None:
5676
 
            raise errors.BzrCommandError(gettext('No submit branch specified or known'))
 
5285
            raise errors.BzrCommandError('No submit branch specified or known')
5677
5286
 
5678
5287
        stored_public_branch = branch.get_public_branch()
5679
5288
        if public_branch is None:
5681
5290
        elif stored_public_branch is None:
5682
5291
            branch.set_public_branch(public_branch)
5683
5292
        if not include_bundle and public_branch is None:
5684
 
            raise errors.BzrCommandError(gettext('No public branch specified or'
5685
 
                                         ' known'))
 
5293
            raise errors.BzrCommandError('No public branch specified or'
 
5294
                                         ' known')
5686
5295
        base_revision_id = None
5687
5296
        if revision is not None:
5688
5297
            if len(revision) > 2:
5689
 
                raise errors.BzrCommandError(gettext('bzr merge-directive takes '
5690
 
                    'at most two one revision identifiers'))
 
5298
                raise errors.BzrCommandError('bzr merge-directive takes '
 
5299
                    'at most two one revision identifiers')
5691
5300
            revision_id = revision[-1].as_revision_id(branch)
5692
5301
            if len(revision) == 2:
5693
5302
                base_revision_id = revision[0].as_revision_id(branch)
5695
5304
            revision_id = branch.last_revision()
5696
5305
        revision_id = ensure_null(revision_id)
5697
5306
        if revision_id == NULL_REVISION:
5698
 
            raise errors.BzrCommandError(gettext('No revisions to bundle.'))
 
5307
            raise errors.BzrCommandError('No revisions to bundle.')
5699
5308
        directive = merge_directive.MergeDirective2.from_objects(
5700
5309
            branch.repository, revision_id, time.time(),
5701
5310
            osutils.local_time_offset(), submit_branch,
5709
5318
                self.outf.writelines(directive.to_lines())
5710
5319
        else:
5711
5320
            message = directive.to_email(mail_to, branch, sign)
5712
 
            s = SMTPConnection(branch.get_config_stack())
 
5321
            s = SMTPConnection(branch.get_config())
5713
5322
            s.send_email(message)
5714
5323
 
5715
5324
 
5747
5356
 
5748
5357
    Both the submit branch and the public branch follow the usual behavior with
5749
5358
    respect to --remember: If there is no default location set, the first send
5750
 
    will set it (use --no-remember to avoid setting it). After that, you can
 
5359
    will set it (use --no-remember to avoid settting it). After that, you can
5751
5360
    omit the location to use the default.  To change the default, use
5752
5361
    --remember. The value will only be saved if the location can be accessed.
5753
5362
 
5955
5564
        self.add_cleanup(branch.lock_write().unlock)
5956
5565
        if delete:
5957
5566
            if tag_name is None:
5958
 
                raise errors.BzrCommandError(gettext("No tag specified to delete."))
 
5567
                raise errors.BzrCommandError("No tag specified to delete.")
5959
5568
            branch.tags.delete_tag(tag_name)
5960
 
            note(gettext('Deleted tag %s.') % tag_name)
 
5569
            note('Deleted tag %s.' % tag_name)
5961
5570
        else:
5962
5571
            if revision:
5963
5572
                if len(revision) != 1:
5964
 
                    raise errors.BzrCommandError(gettext(
 
5573
                    raise errors.BzrCommandError(
5965
5574
                        "Tags can only be placed on a single revision, "
5966
 
                        "not on a range"))
 
5575
                        "not on a range")
5967
5576
                revision_id = revision[0].as_revision_id(branch)
5968
5577
            else:
5969
5578
                revision_id = branch.last_revision()
5970
5579
            if tag_name is None:
5971
5580
                tag_name = branch.automatic_tag_name(revision_id)
5972
5581
                if tag_name is None:
5973
 
                    raise errors.BzrCommandError(gettext(
5974
 
                        "Please specify a tag name."))
5975
 
            try:
5976
 
                existing_target = branch.tags.lookup_tag(tag_name)
5977
 
            except errors.NoSuchTag:
5978
 
                existing_target = None
5979
 
            if not force and existing_target not in (None, revision_id):
 
5582
                    raise errors.BzrCommandError(
 
5583
                        "Please specify a tag name.")
 
5584
            if (not force) and branch.tags.has_tag(tag_name):
5980
5585
                raise errors.TagAlreadyExists(tag_name)
5981
 
            if existing_target == revision_id:
5982
 
                note(gettext('Tag %s already exists for that revision.') % tag_name)
5983
 
            else:
5984
 
                branch.tags.set_tag(tag_name, revision_id)
5985
 
                if existing_target is None:
5986
 
                    note(gettext('Created tag %s.') % tag_name)
5987
 
                else:
5988
 
                    note(gettext('Updated tag %s.') % tag_name)
 
5586
            branch.tags.set_tag(tag_name, revision_id)
 
5587
            note('Created tag %s.' % tag_name)
5989
5588
 
5990
5589
 
5991
5590
class cmd_tags(Command):
6029
5628
                    revno = branch.revision_id_to_dotted_revno(revid)
6030
5629
                    if isinstance(revno, tuple):
6031
5630
                        revno = '.'.join(map(str, revno))
6032
 
                except (errors.NoSuchRevision,
6033
 
                        errors.GhostRevisionsHaveNoRevno,
6034
 
                        errors.UnsupportedOperation):
 
5631
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
6035
5632
                    # Bad tag data/merges can lead to tagged revisions
6036
5633
                    # which are not in this branch. Fail gracefully ...
6037
5634
                    revno = '?'
6085
5682
    takes_args = ['location?']
6086
5683
    takes_options = [
6087
5684
        RegistryOption.from_kwargs(
6088
 
            'tree_type',
6089
 
            title='Tree type',
6090
 
            help='The relation between branch and tree.',
 
5685
            'target_type',
 
5686
            title='Target type',
 
5687
            help='The type to reconfigure the directory to.',
6091
5688
            value_switches=True, enum_switch=False,
6092
5689
            branch='Reconfigure to be an unbound branch with no working tree.',
6093
5690
            tree='Reconfigure to be an unbound branch with a working tree.',
6094
5691
            checkout='Reconfigure to be a bound branch with a working tree.',
6095
5692
            lightweight_checkout='Reconfigure to be a lightweight'
6096
5693
                ' checkout (with no local history).',
6097
 
            ),
6098
 
        RegistryOption.from_kwargs(
6099
 
            'repository_type',
6100
 
            title='Repository type',
6101
 
            help='Location fo the repository.',
6102
 
            value_switches=True, enum_switch=False,
6103
5694
            standalone='Reconfigure to be a standalone branch '
6104
5695
                '(i.e. stop using shared repository).',
6105
5696
            use_shared='Reconfigure to use a shared repository.',
6106
 
            ),
6107
 
        RegistryOption.from_kwargs(
6108
 
            'repository_trees',
6109
 
            title='Trees in Repository',
6110
 
            help='Whether new branches in the repository have trees.',
6111
 
            value_switches=True, enum_switch=False,
6112
5697
            with_trees='Reconfigure repository to create '
6113
5698
                'working trees on branches by default.',
6114
5699
            with_no_trees='Reconfigure repository to not create '
6128
5713
            ),
6129
5714
        ]
6130
5715
 
6131
 
    def run(self, location=None, bind_to=None, force=False,
6132
 
            tree_type=None, repository_type=None, repository_trees=None,
6133
 
            stacked_on=None, unstacked=None):
6134
 
        directory = controldir.ControlDir.open(location)
 
5716
    def run(self, location=None, target_type=None, bind_to=None, force=False,
 
5717
            stacked_on=None,
 
5718
            unstacked=None):
 
5719
        directory = bzrdir.BzrDir.open(location)
6135
5720
        if stacked_on and unstacked:
6136
 
            raise errors.BzrCommandError(gettext("Can't use both --stacked-on and --unstacked"))
 
5721
            raise errors.BzrCommandError("Can't use both --stacked-on and --unstacked")
6137
5722
        elif stacked_on is not None:
6138
5723
            reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
6139
5724
        elif unstacked:
6141
5726
        # At the moment you can use --stacked-on and a different
6142
5727
        # reconfiguration shape at the same time; there seems no good reason
6143
5728
        # to ban it.
6144
 
        if (tree_type is None and
6145
 
            repository_type is None and
6146
 
            repository_trees is None):
 
5729
        if target_type is None:
6147
5730
            if stacked_on or unstacked:
6148
5731
                return
6149
5732
            else:
6150
 
                raise errors.BzrCommandError(gettext('No target configuration '
6151
 
                    'specified'))
6152
 
        reconfiguration = None
6153
 
        if tree_type == 'branch':
 
5733
                raise errors.BzrCommandError('No target configuration '
 
5734
                    'specified')
 
5735
        elif target_type == 'branch':
6154
5736
            reconfiguration = reconfigure.Reconfigure.to_branch(directory)
6155
 
        elif tree_type == 'tree':
 
5737
        elif target_type == 'tree':
6156
5738
            reconfiguration = reconfigure.Reconfigure.to_tree(directory)
6157
 
        elif tree_type == 'checkout':
 
5739
        elif target_type == 'checkout':
6158
5740
            reconfiguration = reconfigure.Reconfigure.to_checkout(
6159
5741
                directory, bind_to)
6160
 
        elif tree_type == 'lightweight-checkout':
 
5742
        elif target_type == 'lightweight-checkout':
6161
5743
            reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
6162
5744
                directory, bind_to)
6163
 
        if reconfiguration:
6164
 
            reconfiguration.apply(force)
6165
 
            reconfiguration = None
6166
 
        if repository_type == 'use-shared':
 
5745
        elif target_type == 'use-shared':
6167
5746
            reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
6168
 
        elif repository_type == 'standalone':
 
5747
        elif target_type == 'standalone':
6169
5748
            reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
6170
 
        if reconfiguration:
6171
 
            reconfiguration.apply(force)
6172
 
            reconfiguration = None
6173
 
        if repository_trees == 'with-trees':
 
5749
        elif target_type == 'with-trees':
6174
5750
            reconfiguration = reconfigure.Reconfigure.set_repository_trees(
6175
5751
                directory, True)
6176
 
        elif repository_trees == 'with-no-trees':
 
5752
        elif target_type == 'with-no-trees':
6177
5753
            reconfiguration = reconfigure.Reconfigure.set_repository_trees(
6178
5754
                directory, False)
6179
 
        if reconfiguration:
6180
 
            reconfiguration.apply(force)
6181
 
            reconfiguration = None
 
5755
        reconfiguration.apply(force)
6182
5756
 
6183
5757
 
6184
5758
class cmd_switch(Command):
6219
5793
        from bzrlib import switch
6220
5794
        tree_location = directory
6221
5795
        revision = _get_one_revision('switch', revision)
6222
 
        possible_transports = []
6223
 
        control_dir = controldir.ControlDir.open_containing(tree_location,
6224
 
            possible_transports=possible_transports)[0]
 
5796
        control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
6225
5797
        if to_location is None:
6226
5798
            if revision is None:
6227
 
                raise errors.BzrCommandError(gettext('You must supply either a'
6228
 
                                             ' revision or a location'))
 
5799
                raise errors.BzrCommandError('You must supply either a'
 
5800
                                             ' revision or a location')
6229
5801
            to_location = tree_location
6230
5802
        try:
6231
 
            branch = control_dir.open_branch(
6232
 
                possible_transports=possible_transports)
 
5803
            branch = control_dir.open_branch()
6233
5804
            had_explicit_nick = branch.get_config().has_explicit_nickname()
6234
5805
        except errors.NotBranchError:
6235
5806
            branch = None
6236
5807
            had_explicit_nick = False
6237
5808
        if create_branch:
6238
5809
            if branch is None:
6239
 
                raise errors.BzrCommandError(
6240
 
                    gettext('cannot create branch without source branch'))
6241
 
            to_location = lookup_new_sibling_branch(control_dir, to_location,
6242
 
                 possible_transports=possible_transports)
 
5810
                raise errors.BzrCommandError('cannot create branch without'
 
5811
                                             ' source branch')
 
5812
            to_location = directory_service.directories.dereference(
 
5813
                              to_location)
 
5814
            if '/' not in to_location and '\\' not in to_location:
 
5815
                # This path is meant to be relative to the existing branch
 
5816
                this_url = self._get_branch_location(control_dir)
 
5817
                to_location = urlutils.join(this_url, '..', to_location)
6243
5818
            to_branch = branch.bzrdir.sprout(to_location,
6244
 
                 possible_transports=possible_transports,
6245
 
                 source_branch=branch).open_branch()
 
5819
                                 possible_transports=[branch.bzrdir.root_transport],
 
5820
                                 source_branch=branch).open_branch()
6246
5821
        else:
6247
 
            to_branch = lookup_sibling_branch(control_dir, to_location)
 
5822
            try:
 
5823
                to_branch = Branch.open(to_location)
 
5824
            except errors.NotBranchError:
 
5825
                this_url = self._get_branch_location(control_dir)
 
5826
                to_branch = Branch.open(
 
5827
                    urlutils.join(this_url, '..', to_location))
6248
5828
        if revision is not None:
6249
5829
            revision = revision.as_revision_id(to_branch)
6250
5830
        switch.switch(control_dir, to_branch, force, revision_id=revision)
6251
5831
        if had_explicit_nick:
6252
5832
            branch = control_dir.open_branch() #get the new branch!
6253
5833
            branch.nick = to_branch.nick
6254
 
        note(gettext('Switched to branch: %s'),
 
5834
        note('Switched to branch: %s',
6255
5835
            urlutils.unescape_for_display(to_branch.base, 'utf-8'))
6256
5836
 
 
5837
    def _get_branch_location(self, control_dir):
 
5838
        """Return location of branch for this control dir."""
 
5839
        try:
 
5840
            this_branch = control_dir.open_branch()
 
5841
            # This may be a heavy checkout, where we want the master branch
 
5842
            master_location = this_branch.get_bound_location()
 
5843
            if master_location is not None:
 
5844
                return master_location
 
5845
            # If not, use a local sibling
 
5846
            return this_branch.base
 
5847
        except errors.NotBranchError:
 
5848
            format = control_dir.find_branch_format()
 
5849
            if getattr(format, 'get_reference', None) is not None:
 
5850
                return format.get_reference(control_dir)
 
5851
            else:
 
5852
                return control_dir.root_transport.base
6257
5853
 
6258
5854
 
6259
5855
class cmd_view(Command):
6350
5946
            name = current_view
6351
5947
        if delete:
6352
5948
            if file_list:
6353
 
                raise errors.BzrCommandError(gettext(
6354
 
                    "Both --delete and a file list specified"))
 
5949
                raise errors.BzrCommandError(
 
5950
                    "Both --delete and a file list specified")
6355
5951
            elif switch:
6356
 
                raise errors.BzrCommandError(gettext(
6357
 
                    "Both --delete and --switch specified"))
 
5952
                raise errors.BzrCommandError(
 
5953
                    "Both --delete and --switch specified")
6358
5954
            elif all:
6359
5955
                tree.views.set_view_info(None, {})
6360
 
                self.outf.write(gettext("Deleted all views.\n"))
 
5956
                self.outf.write("Deleted all views.\n")
6361
5957
            elif name is None:
6362
 
                raise errors.BzrCommandError(gettext("No current view to delete"))
 
5958
                raise errors.BzrCommandError("No current view to delete")
6363
5959
            else:
6364
5960
                tree.views.delete_view(name)
6365
 
                self.outf.write(gettext("Deleted '%s' view.\n") % name)
 
5961
                self.outf.write("Deleted '%s' view.\n" % name)
6366
5962
        elif switch:
6367
5963
            if file_list:
6368
 
                raise errors.BzrCommandError(gettext(
6369
 
                    "Both --switch and a file list specified"))
 
5964
                raise errors.BzrCommandError(
 
5965
                    "Both --switch and a file list specified")
6370
5966
            elif all:
6371
 
                raise errors.BzrCommandError(gettext(
6372
 
                    "Both --switch and --all specified"))
 
5967
                raise errors.BzrCommandError(
 
5968
                    "Both --switch and --all specified")
6373
5969
            elif switch == 'off':
6374
5970
                if current_view is None:
6375
 
                    raise errors.BzrCommandError(gettext("No current view to disable"))
 
5971
                    raise errors.BzrCommandError("No current view to disable")
6376
5972
                tree.views.set_view_info(None, view_dict)
6377
 
                self.outf.write(gettext("Disabled '%s' view.\n") % (current_view))
 
5973
                self.outf.write("Disabled '%s' view.\n" % (current_view))
6378
5974
            else:
6379
5975
                tree.views.set_view_info(switch, view_dict)
6380
5976
                view_str = views.view_display_str(tree.views.lookup_view())
6381
 
                self.outf.write(gettext("Using '{0}' view: {1}\n").format(switch, view_str))
 
5977
                self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
6382
5978
        elif all:
6383
5979
            if view_dict:
6384
 
                self.outf.write(gettext('Views defined:\n'))
 
5980
                self.outf.write('Views defined:\n')
6385
5981
                for view in sorted(view_dict):
6386
5982
                    if view == current_view:
6387
5983
                        active = "=>"
6390
5986
                    view_str = views.view_display_str(view_dict[view])
6391
5987
                    self.outf.write('%s %-20s %s\n' % (active, view, view_str))
6392
5988
            else:
6393
 
                self.outf.write(gettext('No views defined.\n'))
 
5989
                self.outf.write('No views defined.\n')
6394
5990
        elif file_list:
6395
5991
            if name is None:
6396
5992
                # No name given and no current view set
6397
5993
                name = 'my'
6398
5994
            elif name == 'off':
6399
 
                raise errors.BzrCommandError(gettext(
6400
 
                    "Cannot change the 'off' pseudo view"))
 
5995
                raise errors.BzrCommandError(
 
5996
                    "Cannot change the 'off' pseudo view")
6401
5997
            tree.views.set_view(name, sorted(file_list))
6402
5998
            view_str = views.view_display_str(tree.views.lookup_view())
6403
 
            self.outf.write(gettext("Using '{0}' view: {1}\n").format(name, view_str))
 
5999
            self.outf.write("Using '%s' view: %s\n" % (name, view_str))
6404
6000
        else:
6405
6001
            # list the files
6406
6002
            if name is None:
6407
6003
                # No name given and no current view set
6408
 
                self.outf.write(gettext('No current view.\n'))
 
6004
                self.outf.write('No current view.\n')
6409
6005
            else:
6410
6006
                view_str = views.view_display_str(tree.views.lookup_view(name))
6411
 
                self.outf.write(gettext("'{0}' view is: {1}\n").format(name, view_str))
 
6007
                self.outf.write("'%s' view is: %s\n" % (name, view_str))
6412
6008
 
6413
6009
 
6414
6010
class cmd_hooks(Command):
6428
6024
                        self.outf.write("    %s\n" %
6429
6025
                                        (some_hooks.get_hook_name(hook),))
6430
6026
                else:
6431
 
                    self.outf.write(gettext("    <no hooks installed>\n"))
 
6027
                    self.outf.write("    <no hooks installed>\n")
6432
6028
 
6433
6029
 
6434
6030
class cmd_remove_branch(Command):
6452
6048
    def run(self, location=None):
6453
6049
        if location is None:
6454
6050
            location = "."
6455
 
        cdir = controldir.ControlDir.open_containing(location)[0]
6456
 
        cdir.destroy_branch()
 
6051
        branch = Branch.open_containing(location)[0]
 
6052
        branch.bzrdir.destroy_branch()
6457
6053
 
6458
6054
 
6459
6055
class cmd_shelve(Command):
6535
6131
        manager = tree.get_shelf_manager()
6536
6132
        shelves = manager.active_shelves()
6537
6133
        if len(shelves) == 0:
6538
 
            note(gettext('No shelved changes.'))
 
6134
            note('No shelved changes.')
6539
6135
            return 0
6540
6136
        for shelf_id in reversed(shelves):
6541
6137
            message = manager.get_metadata(shelf_id).get('message')
6630
6226
        if path is not None:
6631
6227
            branchdir = path
6632
6228
        tree, branch, relpath =(
6633
 
            controldir.ControlDir.open_containing_tree_or_branch(branchdir))
 
6229
            bzrdir.BzrDir.open_containing_tree_or_branch(branchdir))
6634
6230
        if path is not None:
6635
6231
            path = relpath
6636
6232
        if tree is None:
6664
6260
    __doc__ = """Export command helps and error messages in po format."""
6665
6261
 
6666
6262
    hidden = True
6667
 
    takes_options = [Option('plugin', 
6668
 
                            help='Export help text from named command '\
6669
 
                                 '(defaults to all built in commands).',
6670
 
                            type=str),
6671
 
                     Option('include-duplicates',
6672
 
                            help='Output multiple copies of the same msgid '
6673
 
                                 'string if it appears more than once.'),
6674
 
                            ]
6675
6263
 
6676
 
    def run(self, plugin=None, include_duplicates=False):
 
6264
    def run(self):
6677
6265
        from bzrlib.export_pot import export_pot
6678
 
        export_pot(self.outf, plugin, include_duplicates)
 
6266
        export_pot(self.outf)
6679
6267
 
6680
6268
 
6681
6269
def _register_lazy_builtins():