~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Vincent Ladeuil
  • Date: 2011-06-15 11:36:05 UTC
  • mto: This revision was merged to the branch mainline in revision 5975.
  • Revision ID: v.ladeuil+lp@free.fr-20110615113605-p7zyyfry9wy1hquc
Make ContentConflict resolution more robust

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
import os
20
20
 
21
 
import bzrlib.bzrdir
22
 
 
23
21
from bzrlib.lazy_import import lazy_import
24
22
lazy_import(globals(), """
25
23
import cStringIO
31
29
    bugtracker,
32
30
    bundle,
33
31
    btree_index,
34
 
    controldir,
 
32
    bzrdir,
35
33
    directory_service,
36
34
    delta,
37
35
    config as _mod_config,
51
49
    ui,
52
50
    urlutils,
53
51
    views,
54
 
    gpg,
55
52
    )
56
53
from bzrlib.branch import Branch
57
54
from bzrlib.conflicts import ConflictList
59
56
from bzrlib.revisionspec import RevisionSpec, RevisionInfo
60
57
from bzrlib.smtp_connection import SMTPConnection
61
58
from bzrlib.workingtree import WorkingTree
62
 
from bzrlib.i18n import gettext, ngettext
63
59
""")
64
60
 
65
61
from bzrlib.commands import (
115
111
            if view_files:
116
112
                file_list = view_files
117
113
                view_str = views.view_display_str(view_files)
118
 
                note(gettext("Ignoring files outside view. View is %s") % view_str)
 
114
                note("Ignoring files outside view. View is %s" % view_str)
119
115
    return tree, file_list
120
116
 
121
117
 
123
119
    if revisions is None:
124
120
        return None
125
121
    if len(revisions) != 1:
126
 
        raise errors.BzrCommandError(gettext(
127
 
            'bzr %s --revision takes exactly one revision identifier') % (
 
122
        raise errors.BzrCommandError(
 
123
            'bzr %s --revision takes exactly one revision identifier' % (
128
124
                command_name,))
129
125
    return revisions[0]
130
126
 
199
195
    the --directory option is used to specify a different branch."""
200
196
    if directory is not None:
201
197
        return (None, Branch.open(directory), filename)
202
 
    return controldir.ControlDir.open_containing_tree_or_branch(filename)
 
198
    return bzrdir.BzrDir.open_containing_tree_or_branch(filename)
203
199
 
204
200
 
205
201
# TODO: Make sure no commands unconditionally use the working directory as a
235
231
    unknown
236
232
        Not versioned and not matching an ignore pattern.
237
233
 
238
 
    Additionally for directories, symlinks and files with a changed
239
 
    executable bit, Bazaar indicates their type using a trailing
240
 
    character: '/', '@' or '*' respectively. These decorations can be
241
 
    disabled using the '--no-classify' option.
 
234
    Additionally for directories, symlinks and files with an executable
 
235
    bit, Bazaar indicates their type using a trailing character: '/', '@'
 
236
    or '*' respectively.
242
237
 
243
238
    To see ignored files use 'bzr ignored'.  For details on the
244
239
    changes to file texts, use 'bzr diff'.
275
270
                            short_name='V'),
276
271
                     Option('no-pending', help='Don\'t show pending merges.',
277
272
                           ),
278
 
                     Option('no-classify',
279
 
                            help='Do not mark object type using indicator.',
280
 
                           ),
281
273
                     ]
282
274
    aliases = ['st', 'stat']
283
275
 
286
278
 
287
279
    @display_command
288
280
    def run(self, show_ids=False, file_list=None, revision=None, short=False,
289
 
            versioned=False, no_pending=False, verbose=False,
290
 
            no_classify=False):
 
281
            versioned=False, no_pending=False, verbose=False):
291
282
        from bzrlib.status import show_tree_status
292
283
 
293
284
        if revision and len(revision) > 2:
294
 
            raise errors.BzrCommandError(gettext('bzr status --revision takes exactly'
295
 
                                         ' one or two revision specifiers'))
 
285
            raise errors.BzrCommandError('bzr status --revision takes exactly'
 
286
                                         ' one or two revision specifiers')
296
287
 
297
288
        tree, relfile_list = WorkingTree.open_containing_paths(file_list)
298
289
        # Avoid asking for specific files when that is not needed.
307
298
        show_tree_status(tree, show_ids=show_ids,
308
299
                         specific_files=relfile_list, revision=revision,
309
300
                         to_file=self.outf, short=short, versioned=versioned,
310
 
                         show_pending=(not no_pending), verbose=verbose,
311
 
                         classify=not no_classify)
 
301
                         show_pending=(not no_pending), verbose=verbose)
312
302
 
313
303
 
314
304
class cmd_cat_revision(Command):
335
325
    @display_command
336
326
    def run(self, revision_id=None, revision=None, directory=u'.'):
337
327
        if revision_id is not None and revision is not None:
338
 
            raise errors.BzrCommandError(gettext('You can only supply one of'
339
 
                                         ' revision_id or --revision'))
 
328
            raise errors.BzrCommandError('You can only supply one of'
 
329
                                         ' revision_id or --revision')
340
330
        if revision_id is None and revision is None:
341
 
            raise errors.BzrCommandError(gettext('You must supply either'
342
 
                                         ' --revision or a revision_id'))
 
331
            raise errors.BzrCommandError('You must supply either'
 
332
                                         ' --revision or a revision_id')
343
333
 
344
 
        b = controldir.ControlDir.open_containing_tree_or_branch(directory)[1]
 
334
        b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
345
335
 
346
336
        revisions = b.repository.revisions
347
337
        if revisions is None:
348
 
            raise errors.BzrCommandError(gettext('Repository %r does not support '
349
 
                'access to raw revision texts'))
 
338
            raise errors.BzrCommandError('Repository %r does not support '
 
339
                'access to raw revision texts')
350
340
 
351
341
        b.repository.lock_read()
352
342
        try:
356
346
                try:
357
347
                    self.print_revision(revisions, revision_id)
358
348
                except errors.NoSuchRevision:
359
 
                    msg = gettext("The repository {0} contains no revision {1}.").format(
 
349
                    msg = "The repository %s contains no revision %s." % (
360
350
                        b.repository.base, revision_id)
361
351
                    raise errors.BzrCommandError(msg)
362
352
            elif revision is not None:
363
353
                for rev in revision:
364
354
                    if rev is None:
365
355
                        raise errors.BzrCommandError(
366
 
                            gettext('You cannot specify a NULL revision.'))
 
356
                            'You cannot specify a NULL revision.')
367
357
                    rev_id = rev.as_revision_id(b)
368
358
                    self.print_revision(revisions, rev_id)
369
359
        finally:
475
465
            location_list=['.']
476
466
 
477
467
        for location in location_list:
478
 
            d = controldir.ControlDir.open(location)
479
 
 
 
468
            d = bzrdir.BzrDir.open(location)
 
469
            
480
470
            try:
481
471
                working = d.open_workingtree()
482
472
            except errors.NoWorkingTree:
483
 
                raise errors.BzrCommandError(gettext("No working tree to remove"))
 
473
                raise errors.BzrCommandError("No working tree to remove")
484
474
            except errors.NotLocalUrl:
485
 
                raise errors.BzrCommandError(gettext("You cannot remove the working tree"
486
 
                                             " of a remote path"))
 
475
                raise errors.BzrCommandError("You cannot remove the working tree"
 
476
                                             " of a remote path")
487
477
            if not force:
488
478
                if (working.has_changes()):
489
479
                    raise errors.UncommittedChanges(working)
491
481
                    raise errors.ShelvedChanges(working)
492
482
 
493
483
            if working.user_url != working.branch.user_url:
494
 
                raise errors.BzrCommandError(gettext("You cannot remove the working tree"
495
 
                                             " from a lightweight checkout"))
 
484
                raise errors.BzrCommandError("You cannot remove the working tree"
 
485
                                             " from a lightweight checkout")
496
486
 
497
487
            d.destroy_workingtree()
498
488
 
530
520
                pass # There seems to be a real error here, so we'll reset
531
521
            else:
532
522
                # Refuse
533
 
                raise errors.BzrCommandError(gettext(
 
523
                raise errors.BzrCommandError(
534
524
                    'The tree does not appear to be corrupt. You probably'
535
525
                    ' want "bzr revert" instead. Use "--force" if you are'
536
 
                    ' sure you want to reset the working tree.'))
 
526
                    ' sure you want to reset the working tree.')
537
527
        if revision is None:
538
528
            revision_ids = None
539
529
        else:
542
532
            tree.reset_state(revision_ids)
543
533
        except errors.BzrError, e:
544
534
            if revision_ids is None:
545
 
                extra = (gettext(', the header appears corrupt, try passing -r -1'
546
 
                         ' to set the state to the last commit'))
 
535
                extra = (', the header appears corrupt, try passing -r -1'
 
536
                         ' to set the state to the last commit')
547
537
            else:
548
538
                extra = ''
549
 
            raise errors.BzrCommandError(gettext('failed to reset the tree state{0}').format(extra))
 
539
            raise errors.BzrCommandError('failed to reset the tree state'
 
540
                                         + extra)
550
541
 
551
542
 
552
543
class cmd_revno(Command):
559
550
    takes_args = ['location?']
560
551
    takes_options = [
561
552
        Option('tree', help='Show revno of working tree'),
562
 
        'revision',
563
553
        ]
564
554
 
565
555
    @display_command
566
 
    def run(self, tree=False, location=u'.', revision=None):
567
 
        if revision is not None and tree:
568
 
            raise errors.BzrCommandError(gettext("--tree and --revision can "
569
 
                "not be used together"))
570
 
 
 
556
    def run(self, tree=False, location=u'.'):
571
557
        if tree:
572
558
            try:
573
559
                wt = WorkingTree.open_containing(location)[0]
574
560
                self.add_cleanup(wt.lock_read().unlock)
575
561
            except (errors.NoWorkingTree, errors.NotLocalUrl):
576
562
                raise errors.NoWorkingTree(location)
577
 
            b = wt.branch
578
563
            revid = wt.last_revision()
 
564
            try:
 
565
                revno_t = wt.branch.revision_id_to_dotted_revno(revid)
 
566
            except errors.NoSuchRevision:
 
567
                revno_t = ('???',)
 
568
            revno = ".".join(str(n) for n in revno_t)
579
569
        else:
580
570
            b = Branch.open_containing(location)[0]
581
571
            self.add_cleanup(b.lock_read().unlock)
582
 
            if revision:
583
 
                if len(revision) != 1:
584
 
                    raise errors.BzrCommandError(gettext(
585
 
                        "Tags can only be placed on a single revision, "
586
 
                        "not on a range"))
587
 
                revid = revision[0].as_revision_id(b)
588
 
            else:
589
 
                revid = b.last_revision()
590
 
        try:
591
 
            revno_t = b.revision_id_to_dotted_revno(revid)
592
 
        except errors.NoSuchRevision:
593
 
            revno_t = ('???',)
594
 
        revno = ".".join(str(n) for n in revno_t)
 
572
            revno = b.revno()
595
573
        self.cleanup_now()
596
 
        self.outf.write(revno + '\n')
 
574
        self.outf.write(str(revno) + '\n')
597
575
 
598
576
 
599
577
class cmd_revision_info(Command):
668
646
    are added.  This search proceeds recursively into versioned
669
647
    directories.  If no names are given '.' is assumed.
670
648
 
671
 
    A warning will be printed when nested trees are encountered,
672
 
    unless they are explicitly ignored.
673
 
 
674
649
    Therefore simply saying 'bzr add' will version all files that
675
650
    are currently unknown.
676
651
 
692
667
    
693
668
    Any files matching patterns in the ignore list will not be added
694
669
    unless they are explicitly mentioned.
695
 
    
696
 
    In recursive mode, files larger than the configuration option 
697
 
    add.maximum_file_size will be skipped. Named items are never skipped due
698
 
    to file size.
699
670
    """
700
671
    takes_args = ['file*']
701
672
    takes_options = [
728
699
            action = bzrlib.add.AddFromBaseAction(base_tree, base_path,
729
700
                          to_file=self.outf, should_print=(not is_quiet()))
730
701
        else:
731
 
            action = bzrlib.add.AddWithSkipLargeAction(to_file=self.outf,
 
702
            action = bzrlib.add.AddAction(to_file=self.outf,
732
703
                should_print=(not is_quiet()))
733
704
 
734
705
        if base_tree:
741
712
            if verbose:
742
713
                for glob in sorted(ignored.keys()):
743
714
                    for path in ignored[glob]:
744
 
                        self.outf.write(
745
 
                         gettext("ignored {0} matching \"{1}\"\n").format(
746
 
                         path, glob))
 
715
                        self.outf.write("ignored %s matching \"%s\"\n"
 
716
                                        % (path, glob))
747
717
 
748
718
 
749
719
class cmd_mkdir(Command):
763
733
            if id != None:
764
734
                os.mkdir(d)
765
735
                wt.add([dd])
766
 
                if not is_quiet():
767
 
                    self.outf.write(gettext('added %s\n') % d)
 
736
                self.outf.write('added %s\n' % d)
768
737
            else:
769
738
                raise errors.NotVersionedError(path=base)
770
739
 
808
777
    @display_command
809
778
    def run(self, revision=None, show_ids=False, kind=None, file_list=None):
810
779
        if kind and kind not in ['file', 'directory', 'symlink']:
811
 
            raise errors.BzrCommandError(gettext('invalid kind %r specified') % (kind,))
 
780
            raise errors.BzrCommandError('invalid kind %r specified' % (kind,))
812
781
 
813
782
        revision = _get_one_revision('inventory', revision)
814
783
        work_tree, file_list = WorkingTree.open_containing_paths(file_list)
827
796
                                      require_versioned=True)
828
797
            # find_ids_across_trees may include some paths that don't
829
798
            # exist in 'tree'.
830
 
            entries = sorted(
831
 
                (tree.id2path(file_id), tree.inventory[file_id])
832
 
                for file_id in file_ids if tree.has_id(file_id))
 
799
            entries = sorted((tree.id2path(file_id), tree.inventory[file_id])
 
800
                             for file_id in file_ids if file_id in tree)
833
801
        else:
834
802
            entries = tree.inventory.entries()
835
803
 
878
846
        if auto:
879
847
            return self.run_auto(names_list, after, dry_run)
880
848
        elif dry_run:
881
 
            raise errors.BzrCommandError(gettext('--dry-run requires --auto.'))
 
849
            raise errors.BzrCommandError('--dry-run requires --auto.')
882
850
        if names_list is None:
883
851
            names_list = []
884
852
        if len(names_list) < 2:
885
 
            raise errors.BzrCommandError(gettext("missing file argument"))
 
853
            raise errors.BzrCommandError("missing file argument")
886
854
        tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
887
855
        self.add_cleanup(tree.lock_tree_write().unlock)
888
856
        self._run(tree, names_list, rel_names, after)
889
857
 
890
858
    def run_auto(self, names_list, after, dry_run):
891
859
        if names_list is not None and len(names_list) > 1:
892
 
            raise errors.BzrCommandError(gettext('Only one path may be specified to'
893
 
                                         ' --auto.'))
 
860
            raise errors.BzrCommandError('Only one path may be specified to'
 
861
                                         ' --auto.')
894
862
        if after:
895
 
            raise errors.BzrCommandError(gettext('--after cannot be specified with'
896
 
                                         ' --auto.'))
 
863
            raise errors.BzrCommandError('--after cannot be specified with'
 
864
                                         ' --auto.')
897
865
        work_tree, file_list = WorkingTree.open_containing_paths(
898
866
            names_list, default_directory='.')
899
867
        self.add_cleanup(work_tree.lock_tree_write().unlock)
929
897
                    self.outf.write("%s => %s\n" % (src, dest))
930
898
        else:
931
899
            if len(names_list) != 2:
932
 
                raise errors.BzrCommandError(gettext('to mv multiple files the'
 
900
                raise errors.BzrCommandError('to mv multiple files the'
933
901
                                             ' destination must be a versioned'
934
 
                                             ' directory'))
 
902
                                             ' directory')
935
903
 
936
904
            # for cicp file-systems: the src references an existing inventory
937
905
            # item:
997
965
    branches have diverged.
998
966
 
999
967
    If there is no default location set, the first pull will set it (use
1000
 
    --no-remember to avoid setting it). After that, you can omit the
 
968
    --no-remember to avoid settting it). After that, you can omit the
1001
969
    location to use the default.  To change the default, use --remember. The
1002
970
    value will only be saved if the remote location can be accessed.
1003
971
 
1004
 
    The --verbose option will display the revisions pulled using the log_format
1005
 
    configuration option. You can use a different format by overriding it with
1006
 
    -Olog_format=<other_format>.
1007
 
 
1008
972
    Note: The location can be specified either in the form of a branch,
1009
973
    or in the form of a path to a file containing a merge directive generated
1010
974
    with bzr send.
1047
1011
            self.add_cleanup(branch_to.lock_write().unlock)
1048
1012
 
1049
1013
        if tree_to is None and show_base:
1050
 
            raise errors.BzrCommandError(gettext("Need working tree for --show-base."))
 
1014
            raise errors.BzrCommandError("Need working tree for --show-base.")
1051
1015
 
1052
1016
        if local and not branch_to.get_bound_location():
1053
1017
            raise errors.LocalRequiresBoundBranch()
1063
1027
        stored_loc = branch_to.get_parent()
1064
1028
        if location is None:
1065
1029
            if stored_loc is None:
1066
 
                raise errors.BzrCommandError(gettext("No pull location known or"
1067
 
                                             " specified."))
 
1030
                raise errors.BzrCommandError("No pull location known or"
 
1031
                                             " specified.")
1068
1032
            else:
1069
1033
                display_url = urlutils.unescape_for_display(stored_loc,
1070
1034
                        self.outf.encoding)
1071
1035
                if not is_quiet():
1072
 
                    self.outf.write(gettext("Using saved parent location: %s\n") % display_url)
 
1036
                    self.outf.write("Using saved parent location: %s\n" % display_url)
1073
1037
                location = stored_loc
1074
1038
 
1075
1039
        revision = _get_one_revision('pull', revision)
1076
1040
        if mergeable is not None:
1077
1041
            if revision is not None:
1078
 
                raise errors.BzrCommandError(gettext(
1079
 
                    'Cannot use -r with merge directives or bundles'))
 
1042
                raise errors.BzrCommandError(
 
1043
                    'Cannot use -r with merge directives or bundles')
1080
1044
            mergeable.install_revisions(branch_to.repository)
1081
1045
            base_revision_id, revision_id, verified = \
1082
1046
                mergeable.get_merge_request(branch_to.repository)
1100
1064
                view_info=view_info)
1101
1065
            result = tree_to.pull(
1102
1066
                branch_from, overwrite, revision_id, change_reporter,
1103
 
                local=local, show_base=show_base)
 
1067
                possible_transports=possible_transports, local=local,
 
1068
                show_base=show_base)
1104
1069
        else:
1105
1070
            result = branch_to.pull(
1106
1071
                branch_from, overwrite, revision_id, local=local)
1137
1102
    After that you will be able to do a push without '--overwrite'.
1138
1103
 
1139
1104
    If there is no default push location set, the first push will set it (use
1140
 
    --no-remember to avoid setting it).  After that, you can omit the
 
1105
    --no-remember to avoid settting it).  After that, you can omit the
1141
1106
    location to use the default.  To change the default, use --remember. The
1142
1107
    value will only be saved if the remote location can be accessed.
1143
 
 
1144
 
    The --verbose option will display the revisions pushed using the log_format
1145
 
    configuration option. You can use a different format by overriding it with
1146
 
    -Olog_format=<other_format>.
1147
1108
    """
1148
1109
 
1149
1110
    _see_also = ['pull', 'update', 'working-trees']
1187
1148
            directory = '.'
1188
1149
        # Get the source branch
1189
1150
        (tree, br_from,
1190
 
         _unused) = controldir.ControlDir.open_containing_tree_or_branch(directory)
 
1151
         _unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1191
1152
        # Get the tip's revision_id
1192
1153
        revision = _get_one_revision('push', revision)
1193
1154
        if revision is not None:
1214
1175
                    # error by the feedback given to them. RBC 20080227.
1215
1176
                    stacked_on = parent_url
1216
1177
            if not stacked_on:
1217
 
                raise errors.BzrCommandError(gettext(
1218
 
                    "Could not determine branch to refer to."))
 
1178
                raise errors.BzrCommandError(
 
1179
                    "Could not determine branch to refer to.")
1219
1180
 
1220
1181
        # Get the destination location
1221
1182
        if location is None:
1222
1183
            stored_loc = br_from.get_push_location()
1223
1184
            if stored_loc is None:
1224
 
                raise errors.BzrCommandError(gettext(
1225
 
                    "No push location known or specified."))
 
1185
                raise errors.BzrCommandError(
 
1186
                    "No push location known or specified.")
1226
1187
            else:
1227
1188
                display_url = urlutils.unescape_for_display(stored_loc,
1228
1189
                        self.outf.encoding)
1229
 
                note(gettext("Using saved push location: %s") % display_url)
 
1190
                self.outf.write("Using saved push location: %s\n" % display_url)
1230
1191
                location = stored_loc
1231
1192
 
1232
1193
        _show_push_branch(br_from, revision_id, location, self.outf,
1290
1251
                deprecated_name=self.invoked_as,
1291
1252
                recommended_name='branch',
1292
1253
                deprecated_in_version='2.4')
1293
 
        accelerator_tree, br_from = controldir.ControlDir.open_tree_or_branch(
 
1254
        accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1294
1255
            from_location)
1295
1256
        if not (hardlink or files_from):
1296
1257
            # accelerator_tree is usually slower because you have to read N
1315
1276
            to_transport.mkdir('.')
1316
1277
        except errors.FileExists:
1317
1278
            if not use_existing_dir:
1318
 
                raise errors.BzrCommandError(gettext('Target directory "%s" '
1319
 
                    'already exists.') % to_location)
 
1279
                raise errors.BzrCommandError('Target directory "%s" '
 
1280
                    'already exists.' % to_location)
1320
1281
            else:
1321
1282
                try:
1322
 
                    to_dir = controldir.ControlDir.open_from_transport(
1323
 
                        to_transport)
 
1283
                    bzrdir.BzrDir.open_from_transport(to_transport)
1324
1284
                except errors.NotBranchError:
1325
 
                    to_dir = None
 
1285
                    pass
1326
1286
                else:
1327
 
                    try:
1328
 
                        to_dir.open_branch()
1329
 
                    except errors.NotBranchError:
1330
 
                        pass
1331
 
                    else:
1332
 
                        raise errors.AlreadyBranchError(to_location)
 
1287
                    raise errors.AlreadyBranchError(to_location)
1333
1288
        except errors.NoSuchFile:
1334
 
            raise errors.BzrCommandError(gettext('Parent of "%s" does not exist.')
 
1289
            raise errors.BzrCommandError('Parent of "%s" does not exist.'
1335
1290
                                         % to_location)
1336
 
        else:
1337
 
            to_dir = None
1338
 
        if to_dir is None:
1339
 
            try:
1340
 
                # preserve whatever source format we have.
1341
 
                to_dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1342
 
                                            possible_transports=[to_transport],
1343
 
                                            accelerator_tree=accelerator_tree,
1344
 
                                            hardlink=hardlink, stacked=stacked,
1345
 
                                            force_new_repo=standalone,
1346
 
                                            create_tree_if_local=not no_tree,
1347
 
                                            source_branch=br_from)
1348
 
                branch = to_dir.open_branch()
1349
 
            except errors.NoSuchRevision:
1350
 
                to_transport.delete_tree('.')
1351
 
                msg = gettext("The branch {0} has no revision {1}.").format(
1352
 
                    from_location, revision)
1353
 
                raise errors.BzrCommandError(msg)
1354
 
        else:
1355
 
            branch = br_from.sprout(to_dir, revision_id=revision_id)
 
1291
        try:
 
1292
            # preserve whatever source format we have.
 
1293
            dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
 
1294
                                        possible_transports=[to_transport],
 
1295
                                        accelerator_tree=accelerator_tree,
 
1296
                                        hardlink=hardlink, stacked=stacked,
 
1297
                                        force_new_repo=standalone,
 
1298
                                        create_tree_if_local=not no_tree,
 
1299
                                        source_branch=br_from)
 
1300
            branch = dir.open_branch()
 
1301
        except errors.NoSuchRevision:
 
1302
            to_transport.delete_tree('.')
 
1303
            msg = "The branch %s has no revision %s." % (from_location,
 
1304
                revision)
 
1305
            raise errors.BzrCommandError(msg)
1356
1306
        _merge_tags_if_possible(br_from, branch)
1357
1307
        # If the source branch is stacked, the new branch may
1358
1308
        # be stacked whether we asked for that explicitly or not.
1359
1309
        # We therefore need a try/except here and not just 'if stacked:'
1360
1310
        try:
1361
 
            note(gettext('Created new stacked branch referring to %s.') %
 
1311
            note('Created new stacked branch referring to %s.' %
1362
1312
                branch.get_stacked_on_url())
1363
1313
        except (errors.NotStacked, errors.UnstackableBranchFormat,
1364
1314
            errors.UnstackableRepositoryFormat), e:
1365
 
            note(ngettext('Branched %d revision.', 'Branched %d revisions.', branch.revno()) % branch.revno())
 
1315
            note('Branched %d revision(s).' % branch.revno())
1366
1316
        if bind:
1367
1317
            # Bind to the parent
1368
1318
            parent_branch = Branch.open(from_location)
1369
1319
            branch.bind(parent_branch)
1370
 
            note(gettext('New branch bound to %s') % from_location)
 
1320
            note('New branch bound to %s' % from_location)
1371
1321
        if switch:
1372
1322
            # Switch to the new branch
1373
1323
            wt, _ = WorkingTree.open_containing('.')
1374
1324
            _mod_switch.switch(wt.bzrdir, branch)
1375
 
            note(gettext('Switched to branch: %s'),
 
1325
            note('Switched to branch: %s',
1376
1326
                urlutils.unescape_for_display(branch.base, 'utf-8'))
1377
1327
 
1378
1328
 
1379
 
class cmd_branches(Command):
1380
 
    __doc__ = """List the branches available at the current location.
1381
 
 
1382
 
    This command will print the names of all the branches at the current
1383
 
    location.
1384
 
    """
1385
 
 
1386
 
    takes_args = ['location?']
1387
 
    takes_options = [
1388
 
                  Option('recursive', short_name='R',
1389
 
                         help='Recursively scan for branches rather than '
1390
 
                              'just looking in the specified location.')]
1391
 
 
1392
 
    def run(self, location=".", recursive=False):
1393
 
        if recursive:
1394
 
            t = transport.get_transport(location)
1395
 
            if not t.listable():
1396
 
                raise errors.BzrCommandError(
1397
 
                    "Can't scan this type of location.")
1398
 
            for b in controldir.ControlDir.find_branches(t):
1399
 
                self.outf.write("%s\n" % urlutils.unescape_for_display(
1400
 
                    urlutils.relative_url(t.base, b.base),
1401
 
                    self.outf.encoding).rstrip("/"))
1402
 
        else:
1403
 
            dir = controldir.ControlDir.open_containing(location)[0]
1404
 
            for branch in dir.list_branches():
1405
 
                if branch.name is None:
1406
 
                    self.outf.write(gettext(" (default)\n"))
1407
 
                else:
1408
 
                    self.outf.write(" %s\n" % branch.name.encode(
1409
 
                        self.outf.encoding))
1410
 
 
1411
 
 
1412
1329
class cmd_checkout(Command):
1413
1330
    __doc__ = """Create a new checkout of an existing branch.
1414
1331
 
1453
1370
        if branch_location is None:
1454
1371
            branch_location = osutils.getcwd()
1455
1372
            to_location = branch_location
1456
 
        accelerator_tree, source = controldir.ControlDir.open_tree_or_branch(
 
1373
        accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch(
1457
1374
            branch_location)
1458
1375
        if not (hardlink or files_from):
1459
1376
            # accelerator_tree is usually slower because you have to read N
1514
1431
 
1515
1432
 
1516
1433
class cmd_update(Command):
1517
 
    __doc__ = """Update a working tree to a new revision.
1518
 
 
1519
 
    This will perform a merge of the destination revision (the tip of the
1520
 
    branch, or the specified revision) into the working tree, and then make
1521
 
    that revision the basis revision for the working tree.  
1522
 
 
1523
 
    You can use this to visit an older revision, or to update a working tree
1524
 
    that is out of date from its branch.
1525
 
    
1526
 
    If there are any uncommitted changes in the tree, they will be carried
1527
 
    across and remain as uncommitted changes after the update.  To discard
1528
 
    these changes, use 'bzr revert'.  The uncommitted changes may conflict
1529
 
    with the changes brought in by the change in basis revision.
1530
 
 
1531
 
    If the tree's branch is bound to a master branch, bzr will also update
 
1434
    __doc__ = """Update a tree to have the latest code committed to its branch.
 
1435
 
 
1436
    This will perform a merge into the working tree, and may generate
 
1437
    conflicts. If you have any local changes, you will still
 
1438
    need to commit them after the update for the update to be complete.
 
1439
 
 
1440
    If you want to discard your local changes, you can just do a
 
1441
    'bzr revert' instead of 'bzr commit' after the update.
 
1442
 
 
1443
    If you want to restore a file that has been removed locally, use
 
1444
    'bzr revert' instead of 'bzr update'.
 
1445
 
 
1446
    If the tree's branch is bound to a master branch, it will also update
1532
1447
    the branch from the master.
1533
 
 
1534
 
    You cannot update just a single file or directory, because each Bazaar
1535
 
    working tree has just a single basis revision.  If you want to restore a
1536
 
    file that has been removed locally, use 'bzr revert' instead of 'bzr
1537
 
    update'.  If you want to restore a file to its state in a previous
1538
 
    revision, use 'bzr revert' with a '-r' option, or use 'bzr cat' to write
1539
 
    out the old content of that file to a new location.
1540
 
 
1541
 
    The 'dir' argument, if given, must be the location of the root of a
1542
 
    working tree to update.  By default, the working tree that contains the 
1543
 
    current working directory is used.
1544
1448
    """
1545
1449
 
1546
1450
    _see_also = ['pull', 'working-trees', 'status-flags']
1551
1455
                     ]
1552
1456
    aliases = ['up']
1553
1457
 
1554
 
    def run(self, dir=None, revision=None, show_base=None):
 
1458
    def run(self, dir='.', revision=None, show_base=None):
1555
1459
        if revision is not None and len(revision) != 1:
1556
 
            raise errors.BzrCommandError(gettext(
1557
 
                "bzr update --revision takes exactly one revision"))
1558
 
        if dir is None:
1559
 
            tree = WorkingTree.open_containing('.')[0]
1560
 
        else:
1561
 
            tree, relpath = WorkingTree.open_containing(dir)
1562
 
            if relpath:
1563
 
                # See bug 557886.
1564
 
                raise errors.BzrCommandError(gettext(
1565
 
                    "bzr update can only update a whole tree, "
1566
 
                    "not a file or subdirectory"))
 
1460
            raise errors.BzrCommandError(
 
1461
                        "bzr update --revision takes exactly one revision")
 
1462
        tree = WorkingTree.open_containing(dir)[0]
1567
1463
        branch = tree.branch
1568
1464
        possible_transports = []
1569
1465
        master = branch.get_master_branch(
1593
1489
            revision_id = branch.last_revision()
1594
1490
        if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1595
1491
            revno = branch.revision_id_to_dotted_revno(revision_id)
1596
 
            note(gettext("Tree is up to date at revision {0} of branch {1}"
1597
 
                        ).format('.'.join(map(str, revno)), branch_location))
 
1492
            note("Tree is up to date at revision %s of branch %s" %
 
1493
                ('.'.join(map(str, revno)), branch_location))
1598
1494
            return 0
1599
1495
        view_info = _get_view_info_for_change_reporter(tree)
1600
1496
        change_reporter = delta._ChangeReporter(
1608
1504
                old_tip=old_tip,
1609
1505
                show_base=show_base)
1610
1506
        except errors.NoSuchRevision, e:
1611
 
            raise errors.BzrCommandError(gettext(
 
1507
            raise errors.BzrCommandError(
1612
1508
                                  "branch has no revision %s\n"
1613
1509
                                  "bzr update --revision only works"
1614
 
                                  " for a revision in the branch history")
 
1510
                                  " for a revision in the branch history"
1615
1511
                                  % (e.revision))
1616
1512
        revno = tree.branch.revision_id_to_dotted_revno(
1617
1513
            _mod_revision.ensure_null(tree.last_revision()))
1618
 
        note(gettext('Updated to revision {0} of branch {1}').format(
1619
 
             '.'.join(map(str, revno)), branch_location))
 
1514
        note('Updated to revision %s of branch %s' %
 
1515
             ('.'.join(map(str, revno)), branch_location))
1620
1516
        parent_ids = tree.get_parent_ids()
1621
1517
        if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1622
 
            note(gettext('Your local commits will now show as pending merges with '
1623
 
                 "'bzr status', and can be committed with 'bzr commit'."))
 
1518
            note('Your local commits will now show as pending merges with '
 
1519
                 "'bzr status', and can be committed with 'bzr commit'.")
1624
1520
        if conflicts != 0:
1625
1521
            return 1
1626
1522
        else:
1667
1563
        else:
1668
1564
            noise_level = 0
1669
1565
        from bzrlib.info import show_bzrdir_info
1670
 
        show_bzrdir_info(controldir.ControlDir.open_containing(location)[0],
 
1566
        show_bzrdir_info(bzrdir.BzrDir.open_containing(location)[0],
1671
1567
                         verbose=noise_level, outfile=self.outf)
1672
1568
 
1673
1569
 
1698
1594
    def run(self, file_list, verbose=False, new=False,
1699
1595
        file_deletion_strategy='safe'):
1700
1596
        if file_deletion_strategy == 'force':
1701
 
            note(gettext("(The --force option is deprecated, rather use --no-backup "
1702
 
                "in future.)"))
 
1597
            note("(The --force option is deprecated, rather use --no-backup "
 
1598
                "in future.)")
1703
1599
            file_deletion_strategy = 'no-backup'
1704
1600
 
1705
1601
        tree, file_list = WorkingTree.open_containing_paths(file_list)
1715
1611
                specific_files=file_list).added
1716
1612
            file_list = sorted([f[0] for f in added], reverse=True)
1717
1613
            if len(file_list) == 0:
1718
 
                raise errors.BzrCommandError(gettext('No matching files.'))
 
1614
                raise errors.BzrCommandError('No matching files.')
1719
1615
        elif file_list is None:
1720
1616
            # missing files show up in iter_changes(basis) as
1721
1617
            # versioned-with-no-kind.
1805
1701
 
1806
1702
    def run(self, branch=".", canonicalize_chks=False):
1807
1703
        from bzrlib.reconcile import reconcile
1808
 
        dir = controldir.ControlDir.open(branch)
 
1704
        dir = bzrdir.BzrDir.open(branch)
1809
1705
        reconcile(dir, canonicalize_chks=canonicalize_chks)
1810
1706
 
1811
1707
 
1820
1716
    @display_command
1821
1717
    def run(self, location="."):
1822
1718
        branch = Branch.open_containing(location)[0]
1823
 
        self.add_cleanup(branch.lock_read().unlock)
1824
 
        graph = branch.repository.get_graph()
1825
 
        history = list(graph.iter_lefthand_ancestry(branch.last_revision(),
1826
 
            [_mod_revision.NULL_REVISION]))
1827
 
        for revid in reversed(history):
 
1719
        for revid in branch.revision_history():
1828
1720
            self.outf.write(revid)
1829
1721
            self.outf.write('\n')
1830
1722
 
1848
1740
            b = wt.branch
1849
1741
            last_revision = wt.last_revision()
1850
1742
 
1851
 
        self.add_cleanup(b.repository.lock_read().unlock)
1852
 
        graph = b.repository.get_graph()
1853
 
        revisions = [revid for revid, parents in
1854
 
            graph.iter_ancestry([last_revision])]
1855
 
        for revision_id in reversed(revisions):
1856
 
            if _mod_revision.is_null(revision_id):
1857
 
                continue
 
1743
        revision_ids = b.repository.get_ancestry(last_revision)
 
1744
        revision_ids.pop(0)
 
1745
        for revision_id in revision_ids:
1858
1746
            self.outf.write(revision_id + '\n')
1859
1747
 
1860
1748
 
1891
1779
                help='Specify a format for this branch. '
1892
1780
                'See "help formats".',
1893
1781
                lazy_registry=('bzrlib.bzrdir', 'format_registry'),
1894
 
                converter=lambda name: controldir.format_registry.make_bzrdir(name),
 
1782
                converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
1895
1783
                value_switches=True,
1896
1784
                title="Branch format",
1897
1785
                ),
1904
1792
    def run(self, location=None, format=None, append_revisions_only=False,
1905
1793
            create_prefix=False, no_tree=False):
1906
1794
        if format is None:
1907
 
            format = controldir.format_registry.make_bzrdir('default')
 
1795
            format = bzrdir.format_registry.make_bzrdir('default')
1908
1796
        if location is None:
1909
1797
            location = u'.'
1910
1798
 
1919
1807
            to_transport.ensure_base()
1920
1808
        except errors.NoSuchFile:
1921
1809
            if not create_prefix:
1922
 
                raise errors.BzrCommandError(gettext("Parent directory of %s"
 
1810
                raise errors.BzrCommandError("Parent directory of %s"
1923
1811
                    " does not exist."
1924
1812
                    "\nYou may supply --create-prefix to create all"
1925
 
                    " leading parent directories.")
 
1813
                    " leading parent directories."
1926
1814
                    % location)
1927
1815
            to_transport.create_prefix()
1928
1816
 
1929
1817
        try:
1930
 
            a_bzrdir = controldir.ControlDir.open_from_transport(to_transport)
 
1818
            a_bzrdir = bzrdir.BzrDir.open_from_transport(to_transport)
1931
1819
        except errors.NotBranchError:
1932
1820
            # really a NotBzrDir error...
1933
 
            create_branch = controldir.ControlDir.create_branch_convenience
 
1821
            create_branch = bzrdir.BzrDir.create_branch_convenience
1934
1822
            if no_tree:
1935
1823
                force_new_tree = False
1936
1824
            else:
1947
1835
                        raise errors.BranchExistsWithoutWorkingTree(location)
1948
1836
                raise errors.AlreadyBranchError(location)
1949
1837
            branch = a_bzrdir.create_branch()
1950
 
            if not no_tree and not a_bzrdir.has_workingtree():
 
1838
            if not no_tree:
1951
1839
                a_bzrdir.create_workingtree()
1952
1840
        if append_revisions_only:
1953
1841
            try:
1954
1842
                branch.set_append_revisions_only(True)
1955
1843
            except errors.UpgradeRequired:
1956
 
                raise errors.BzrCommandError(gettext('This branch format cannot be set'
1957
 
                    ' to append-revisions-only.  Try --default.'))
 
1844
                raise errors.BzrCommandError('This branch format cannot be set'
 
1845
                    ' to append-revisions-only.  Try --default.')
1958
1846
        if not is_quiet():
1959
1847
            from bzrlib.info import describe_layout, describe_format
1960
1848
            try:
1964
1852
            repository = branch.repository
1965
1853
            layout = describe_layout(repository, branch, tree).lower()
1966
1854
            format = describe_format(a_bzrdir, repository, branch, tree)
1967
 
            self.outf.write(gettext("Created a {0} (format: {1})\n").format(
1968
 
                  layout, format))
 
1855
            self.outf.write("Created a %s (format: %s)\n" % (layout, format))
1969
1856
            if repository.is_shared():
1970
1857
                #XXX: maybe this can be refactored into transport.path_or_url()
1971
1858
                url = repository.bzrdir.root_transport.external_url()
1973
1860
                    url = urlutils.local_path_from_url(url)
1974
1861
                except errors.InvalidURL:
1975
1862
                    pass
1976
 
                self.outf.write(gettext("Using shared repository: %s\n") % url)
 
1863
                self.outf.write("Using shared repository: %s\n" % url)
1977
1864
 
1978
1865
 
1979
1866
class cmd_init_repository(Command):
2009
1896
    takes_options = [RegistryOption('format',
2010
1897
                            help='Specify a format for this repository. See'
2011
1898
                                 ' "bzr help formats" for details.',
2012
 
                            lazy_registry=('bzrlib.controldir', 'format_registry'),
2013
 
                            converter=lambda name: controldir.format_registry.make_bzrdir(name),
 
1899
                            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
1900
                            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
2014
1901
                            value_switches=True, title='Repository format'),
2015
1902
                     Option('no-trees',
2016
1903
                             help='Branches in the repository will default to'
2020
1907
 
2021
1908
    def run(self, location, format=None, no_trees=False):
2022
1909
        if format is None:
2023
 
            format = controldir.format_registry.make_bzrdir('default')
 
1910
            format = bzrdir.format_registry.make_bzrdir('default')
2024
1911
 
2025
1912
        if location is None:
2026
1913
            location = '.'
2170
2057
        elif ':' in prefix:
2171
2058
            old_label, new_label = prefix.split(":")
2172
2059
        else:
2173
 
            raise errors.BzrCommandError(gettext(
 
2060
            raise errors.BzrCommandError(
2174
2061
                '--prefix expects two values separated by a colon'
2175
 
                ' (eg "old/:new/")'))
 
2062
                ' (eg "old/:new/")')
2176
2063
 
2177
2064
        if revision and len(revision) > 2:
2178
 
            raise errors.BzrCommandError(gettext('bzr diff --revision takes exactly'
2179
 
                                         ' one or two revision specifiers'))
 
2065
            raise errors.BzrCommandError('bzr diff --revision takes exactly'
 
2066
                                         ' one or two revision specifiers')
2180
2067
 
2181
2068
        if using is not None and format is not None:
2182
 
            raise errors.BzrCommandError(gettext(
2183
 
                '{0} and {1} are mutually exclusive').format(
2184
 
                '--using', '--format'))
 
2069
            raise errors.BzrCommandError('--using and --format are mutually '
 
2070
                'exclusive.')
2185
2071
 
2186
2072
        (old_tree, new_tree,
2187
2073
         old_branch, new_branch,
2264
2150
        basis_inv = basis.inventory
2265
2151
        inv = wt.inventory
2266
2152
        for file_id in inv:
2267
 
            if basis_inv.has_id(file_id):
 
2153
            if file_id in basis_inv:
2268
2154
                continue
2269
2155
            if inv.is_root(file_id) and len(basis_inv) == 0:
2270
2156
                continue
2295
2181
    try:
2296
2182
        return int(limitstring)
2297
2183
    except ValueError:
2298
 
        msg = gettext("The limit argument must be an integer.")
 
2184
        msg = "The limit argument must be an integer."
2299
2185
        raise errors.BzrCommandError(msg)
2300
2186
 
2301
2187
 
2303
2189
    try:
2304
2190
        return int(s)
2305
2191
    except ValueError:
2306
 
        msg = gettext("The levels argument must be an integer.")
 
2192
        msg = "The levels argument must be an integer."
2307
2193
        raise errors.BzrCommandError(msg)
2308
2194
 
2309
2195
 
2419
2305
 
2420
2306
    :Other filtering:
2421
2307
 
2422
 
      The --match option can be used for finding revisions that match a
2423
 
      regular expression in a commit message, committer, author or bug.
2424
 
      Specifying the option several times will match any of the supplied
2425
 
      expressions. --match-author, --match-bugs, --match-committer and
2426
 
      --match-message can be used to only match a specific field.
 
2308
      The --message option can be used for finding revisions that match a
 
2309
      regular expression in a commit message.
2427
2310
 
2428
2311
    :Tips & tricks:
2429
2312
 
2489
2372
                   argname='N',
2490
2373
                   type=_parse_levels),
2491
2374
            Option('message',
 
2375
                   short_name='m',
2492
2376
                   help='Show revisions whose message matches this '
2493
2377
                        'regular expression.',
2494
 
                   type=str,
2495
 
                   hidden=True),
 
2378
                   type=str),
2496
2379
            Option('limit',
2497
2380
                   short_name='l',
2498
2381
                   help='Limit the output to the first N revisions.',
2501
2384
            Option('show-diff',
2502
2385
                   short_name='p',
2503
2386
                   help='Show changes made in each revision as a patch.'),
2504
 
            Option('include-merged',
 
2387
            Option('include-merges',
2505
2388
                   help='Show merged revisions like --levels 0 does.'),
2506
 
            Option('include-merges', hidden=True,
2507
 
                   help='Historical alias for --include-merged.'),
2508
 
            Option('omit-merges',
2509
 
                   help='Do not report commits with more than one parent.'),
2510
2389
            Option('exclude-common-ancestry',
2511
2390
                   help='Display only the revisions that are not part'
2512
2391
                   ' of both ancestries (require -rX..Y)'
2513
 
                   ),
2514
 
            Option('signatures',
2515
 
                   help='Show digital signature validity'),
2516
 
            ListOption('match',
2517
 
                short_name='m',
2518
 
                help='Show revisions whose properties match this '
2519
 
                'expression.',
2520
 
                type=str),
2521
 
            ListOption('match-message',
2522
 
                   help='Show revisions whose message matches this '
2523
 
                   'expression.',
2524
 
                type=str),
2525
 
            ListOption('match-committer',
2526
 
                   help='Show revisions whose committer matches this '
2527
 
                   'expression.',
2528
 
                type=str),
2529
 
            ListOption('match-author',
2530
 
                   help='Show revisions whose authors match this '
2531
 
                   'expression.',
2532
 
                type=str),
2533
 
            ListOption('match-bugs',
2534
 
                   help='Show revisions whose bugs match this '
2535
 
                   'expression.',
2536
 
                type=str)
 
2392
                   )
2537
2393
            ]
2538
2394
    encoding_type = 'replace'
2539
2395
 
2549
2405
            message=None,
2550
2406
            limit=None,
2551
2407
            show_diff=False,
2552
 
            include_merged=None,
 
2408
            include_merges=False,
2553
2409
            authors=None,
2554
2410
            exclude_common_ancestry=False,
2555
 
            signatures=False,
2556
 
            match=None,
2557
 
            match_message=None,
2558
 
            match_committer=None,
2559
 
            match_author=None,
2560
 
            match_bugs=None,
2561
 
            omit_merges=False,
2562
 
            include_merges=symbol_versioning.DEPRECATED_PARAMETER,
2563
2411
            ):
2564
2412
        from bzrlib.log import (
2565
2413
            Logger,
2567
2415
            _get_info_for_log_files,
2568
2416
            )
2569
2417
        direction = (forward and 'forward') or 'reverse'
2570
 
        if symbol_versioning.deprecated_passed(include_merges):
2571
 
            ui.ui_factory.show_user_warning(
2572
 
                'deprecated_command_option',
2573
 
                deprecated_name='--include-merges',
2574
 
                recommended_name='--include-merged',
2575
 
                deprecated_in_version='2.5',
2576
 
                command=self.invoked_as)
2577
 
            if include_merged is None:
2578
 
                include_merged = include_merges
2579
 
            else:
2580
 
                raise errors.BzrCommandError(gettext(
2581
 
                    '{0} and {1} are mutually exclusive').format(
2582
 
                    '--include-merges', '--include-merged'))
2583
 
        if include_merged is None:
2584
 
            include_merged = False
2585
2418
        if (exclude_common_ancestry
2586
2419
            and (revision is None or len(revision) != 2)):
2587
 
            raise errors.BzrCommandError(gettext(
2588
 
                '--exclude-common-ancestry requires -r with two revisions'))
2589
 
        if include_merged:
 
2420
            raise errors.BzrCommandError(
 
2421
                '--exclude-common-ancestry requires -r with two revisions')
 
2422
        if include_merges:
2590
2423
            if levels is None:
2591
2424
                levels = 0
2592
2425
            else:
2593
 
                raise errors.BzrCommandError(gettext(
2594
 
                    '{0} and {1} are mutually exclusive').format(
2595
 
                    '--levels', '--include-merged'))
 
2426
                raise errors.BzrCommandError(
 
2427
                    '--levels and --include-merges are mutually exclusive')
2596
2428
 
2597
2429
        if change is not None:
2598
2430
            if len(change) > 1:
2599
2431
                raise errors.RangeInChangeOption()
2600
2432
            if revision is not None:
2601
 
                raise errors.BzrCommandError(gettext(
2602
 
                    '{0} and {1} are mutually exclusive').format(
2603
 
                    '--revision', '--change'))
 
2433
                raise errors.BzrCommandError(
 
2434
                    '--revision and --change are mutually exclusive')
2604
2435
            else:
2605
2436
                revision = change
2606
2437
 
2612
2443
                revision, file_list, self.add_cleanup)
2613
2444
            for relpath, file_id, kind in file_info_list:
2614
2445
                if file_id is None:
2615
 
                    raise errors.BzrCommandError(gettext(
2616
 
                        "Path unknown at end or start of revision range: %s") %
 
2446
                    raise errors.BzrCommandError(
 
2447
                        "Path unknown at end or start of revision range: %s" %
2617
2448
                        relpath)
2618
2449
                # If the relpath is the top of the tree, we log everything
2619
2450
                if relpath == '':
2631
2462
                location = revision[0].get_branch()
2632
2463
            else:
2633
2464
                location = '.'
2634
 
            dir, relpath = controldir.ControlDir.open_containing(location)
 
2465
            dir, relpath = bzrdir.BzrDir.open_containing(location)
2635
2466
            b = dir.open_branch()
2636
2467
            self.add_cleanup(b.lock_read().unlock)
2637
2468
            rev1, rev2 = _get_revision_range(revision, b, self.name())
2638
2469
 
2639
 
        if b.get_config().validate_signatures_in_log():
2640
 
            signatures = True
2641
 
 
2642
 
        if signatures:
2643
 
            if not gpg.GPGStrategy.verify_signatures_available():
2644
 
                raise errors.GpgmeNotInstalled(None)
2645
 
 
2646
2470
        # Decide on the type of delta & diff filtering to use
2647
2471
        # TODO: add an --all-files option to make this configurable & consistent
2648
2472
        if not verbose:
2685
2509
        match_using_deltas = (len(file_ids) != 1 or filter_by_dir
2686
2510
            or delta_type or partial_history)
2687
2511
 
2688
 
        match_dict = {}
2689
 
        if match:
2690
 
            match_dict[''] = match
2691
 
        if match_message:
2692
 
            match_dict['message'] = match_message
2693
 
        if match_committer:
2694
 
            match_dict['committer'] = match_committer
2695
 
        if match_author:
2696
 
            match_dict['author'] = match_author
2697
 
        if match_bugs:
2698
 
            match_dict['bugs'] = match_bugs
2699
 
 
2700
2512
        # Build the LogRequest and execute it
2701
2513
        if len(file_ids) == 0:
2702
2514
            file_ids = None
2705
2517
            start_revision=rev1, end_revision=rev2, limit=limit,
2706
2518
            message_search=message, delta_type=delta_type,
2707
2519
            diff_type=diff_type, _match_using_deltas=match_using_deltas,
2708
 
            exclude_common_ancestry=exclude_common_ancestry, match=match_dict,
2709
 
            signature=signatures, omit_merges=omit_merges,
 
2520
            exclude_common_ancestry=exclude_common_ancestry,
2710
2521
            )
2711
2522
        Logger(b, rqst).show(lf)
2712
2523
 
2729
2540
            # b is taken from revision[0].get_branch(), and
2730
2541
            # show_log will use its revision_history. Having
2731
2542
            # different branches will lead to weird behaviors.
2732
 
            raise errors.BzrCommandError(gettext(
 
2543
            raise errors.BzrCommandError(
2733
2544
                "bzr %s doesn't accept two revisions in different"
2734
 
                " branches.") % command_name)
 
2545
                " branches." % command_name)
2735
2546
        if start_spec.spec is None:
2736
2547
            # Avoid loading all the history.
2737
2548
            rev1 = RevisionInfo(branch, None, None)
2745
2556
        else:
2746
2557
            rev2 = end_spec.in_history(branch)
2747
2558
    else:
2748
 
        raise errors.BzrCommandError(gettext(
2749
 
            'bzr %s --revision takes one or two values.') % command_name)
 
2559
        raise errors.BzrCommandError(
 
2560
            'bzr %s --revision takes one or two values.' % command_name)
2750
2561
    return rev1, rev2
2751
2562
 
2752
2563
 
2823
2634
            null=False, kind=None, show_ids=False, path=None, directory=None):
2824
2635
 
2825
2636
        if kind and kind not in ('file', 'directory', 'symlink'):
2826
 
            raise errors.BzrCommandError(gettext('invalid kind specified'))
 
2637
            raise errors.BzrCommandError('invalid kind specified')
2827
2638
 
2828
2639
        if verbose and null:
2829
 
            raise errors.BzrCommandError(gettext('Cannot set both --verbose and --null'))
 
2640
            raise errors.BzrCommandError('Cannot set both --verbose and --null')
2830
2641
        all = not (unknown or versioned or ignored)
2831
2642
 
2832
2643
        selection = {'I':ignored, '?':unknown, 'V':versioned}
2835
2646
            fs_path = '.'
2836
2647
        else:
2837
2648
            if from_root:
2838
 
                raise errors.BzrCommandError(gettext('cannot specify both --from-root'
2839
 
                                             ' and PATH'))
 
2649
                raise errors.BzrCommandError('cannot specify both --from-root'
 
2650
                                             ' and PATH')
2840
2651
            fs_path = path
2841
2652
        tree, branch, relpath = \
2842
2653
            _open_directory_or_containing_tree_or_branch(fs_path, directory)
2858
2669
            if view_files:
2859
2670
                apply_view = True
2860
2671
                view_str = views.view_display_str(view_files)
2861
 
                note(gettext("Ignoring files outside view. View is %s") % view_str)
 
2672
                note("Ignoring files outside view. View is %s" % view_str)
2862
2673
 
2863
2674
        self.add_cleanup(tree.lock_read().unlock)
2864
2675
        for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
3011
2822
                self.outf.write("%s\n" % pattern)
3012
2823
            return
3013
2824
        if not name_pattern_list:
3014
 
            raise errors.BzrCommandError(gettext("ignore requires at least one "
3015
 
                "NAME_PATTERN or --default-rules."))
 
2825
            raise errors.BzrCommandError("ignore requires at least one "
 
2826
                "NAME_PATTERN or --default-rules.")
3016
2827
        name_pattern_list = [globbing.normalize_pattern(p)
3017
2828
                             for p in name_pattern_list]
3018
2829
        bad_patterns = ''
3019
 
        bad_patterns_count = 0
3020
2830
        for p in name_pattern_list:
3021
2831
            if not globbing.Globster.is_pattern_valid(p):
3022
 
                bad_patterns_count += 1
3023
2832
                bad_patterns += ('\n  %s' % p)
3024
2833
        if bad_patterns:
3025
 
            msg = (ngettext('Invalid ignore pattern found. %s', 
3026
 
                            'Invalid ignore patterns found. %s',
3027
 
                            bad_patterns_count) % bad_patterns)
 
2834
            msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
3028
2835
            ui.ui_factory.show_error(msg)
3029
2836
            raise errors.InvalidPattern('')
3030
2837
        for name_pattern in name_pattern_list:
3031
2838
            if (name_pattern[0] == '/' or
3032
2839
                (len(name_pattern) > 1 and name_pattern[1] == ':')):
3033
 
                raise errors.BzrCommandError(gettext(
3034
 
                    "NAME_PATTERN should not be an absolute path"))
 
2840
                raise errors.BzrCommandError(
 
2841
                    "NAME_PATTERN should not be an absolute path")
3035
2842
        tree, relpath = WorkingTree.open_containing(directory)
3036
2843
        ignores.tree_ignores_add_patterns(tree, name_pattern_list)
3037
2844
        ignored = globbing.Globster(name_pattern_list)
3044
2851
                if ignored.match(filename):
3045
2852
                    matches.append(filename)
3046
2853
        if len(matches) > 0:
3047
 
            self.outf.write(gettext("Warning: the following files are version "
3048
 
                  "controlled and match your ignore pattern:\n%s"
 
2854
            self.outf.write("Warning: the following files are version controlled and"
 
2855
                  " match your ignore pattern:\n%s"
3049
2856
                  "\nThese files will continue to be version controlled"
3050
 
                  " unless you 'bzr remove' them.\n") % ("\n".join(matches),))
 
2857
                  " unless you 'bzr remove' them.\n" % ("\n".join(matches),))
3051
2858
 
3052
2859
 
3053
2860
class cmd_ignored(Command):
3092
2899
        try:
3093
2900
            revno = int(revno)
3094
2901
        except ValueError:
3095
 
            raise errors.BzrCommandError(gettext("not a valid revision-number: %r")
 
2902
            raise errors.BzrCommandError("not a valid revision-number: %r"
3096
2903
                                         % revno)
3097
2904
        revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
3098
2905
        self.outf.write("%s\n" % revid)
3159
2966
            export(rev_tree, dest, format, root, subdir, filtered=filters,
3160
2967
                   per_file_timestamps=per_file_timestamps)
3161
2968
        except errors.NoSuchExportFormat, e:
3162
 
            raise errors.BzrCommandError(gettext('Unsupported export format: %s') % e.format)
 
2969
            raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3163
2970
 
3164
2971
 
3165
2972
class cmd_cat(Command):
3185
2992
    def run(self, filename, revision=None, name_from_revision=False,
3186
2993
            filters=False, directory=None):
3187
2994
        if revision is not None and len(revision) != 1:
3188
 
            raise errors.BzrCommandError(gettext("bzr cat --revision takes exactly"
3189
 
                                         " one revision specifier"))
 
2995
            raise errors.BzrCommandError("bzr cat --revision takes exactly"
 
2996
                                         " one revision specifier")
3190
2997
        tree, branch, relpath = \
3191
2998
            _open_directory_or_containing_tree_or_branch(filename, directory)
3192
2999
        self.add_cleanup(branch.lock_read().unlock)
3202
3009
 
3203
3010
        old_file_id = rev_tree.path2id(relpath)
3204
3011
 
3205
 
        # TODO: Split out this code to something that generically finds the
3206
 
        # best id for a path across one or more trees; it's like
3207
 
        # find_ids_across_trees but restricted to find just one. -- mbp
3208
 
        # 20110705.
3209
3012
        if name_from_revision:
3210
3013
            # Try in revision if requested
3211
3014
            if old_file_id is None:
3212
 
                raise errors.BzrCommandError(gettext(
3213
 
                    "{0!r} is not present in revision {1}").format(
 
3015
                raise errors.BzrCommandError(
 
3016
                    "%r is not present in revision %s" % (
3214
3017
                        filename, rev_tree.get_revision_id()))
3215
3018
            else:
3216
 
                actual_file_id = old_file_id
 
3019
                content = rev_tree.get_file_text(old_file_id)
3217
3020
        else:
3218
3021
            cur_file_id = tree.path2id(relpath)
3219
 
            if cur_file_id is not None and rev_tree.has_id(cur_file_id):
3220
 
                actual_file_id = cur_file_id
3221
 
            elif old_file_id is not None:
3222
 
                actual_file_id = old_file_id
3223
 
            else:
3224
 
                raise errors.BzrCommandError(gettext(
3225
 
                    "{0!r} is not present in revision {1}").format(
 
3022
            found = False
 
3023
            if cur_file_id is not None:
 
3024
                # Then try with the actual file id
 
3025
                try:
 
3026
                    content = rev_tree.get_file_text(cur_file_id)
 
3027
                    found = True
 
3028
                except errors.NoSuchId:
 
3029
                    # The actual file id didn't exist at that time
 
3030
                    pass
 
3031
            if not found and old_file_id is not None:
 
3032
                # Finally try with the old file id
 
3033
                content = rev_tree.get_file_text(old_file_id)
 
3034
                found = True
 
3035
            if not found:
 
3036
                # Can't be found anywhere
 
3037
                raise errors.BzrCommandError(
 
3038
                    "%r is not present in revision %s" % (
3226
3039
                        filename, rev_tree.get_revision_id()))
3227
3040
        if filtered:
3228
 
            from bzrlib.filter_tree import ContentFilterTree
3229
 
            filter_tree = ContentFilterTree(rev_tree,
3230
 
                rev_tree._content_filter_stack)
3231
 
            content = filter_tree.get_file_text(actual_file_id)
 
3041
            from bzrlib.filters import (
 
3042
                ContentFilterContext,
 
3043
                filtered_output_bytes,
 
3044
                )
 
3045
            filters = rev_tree._content_filter_stack(relpath)
 
3046
            chunks = content.splitlines(True)
 
3047
            content = filtered_output_bytes(chunks, filters,
 
3048
                ContentFilterContext(relpath, rev_tree))
 
3049
            self.cleanup_now()
 
3050
            self.outf.writelines(content)
3232
3051
        else:
3233
 
            content = rev_tree.get_file_text(actual_file_id)
3234
 
        self.cleanup_now()
3235
 
        self.outf.write(content)
 
3052
            self.cleanup_now()
 
3053
            self.outf.write(content)
3236
3054
 
3237
3055
 
3238
3056
class cmd_local_time_offset(Command):
3345
3163
    aliases = ['ci', 'checkin']
3346
3164
 
3347
3165
    def _iter_bug_fix_urls(self, fixes, branch):
3348
 
        default_bugtracker  = None
3349
3166
        # Configure the properties for bug fixing attributes.
3350
3167
        for fixed_bug in fixes:
3351
3168
            tokens = fixed_bug.split(':')
3352
 
            if len(tokens) == 1:
3353
 
                if default_bugtracker is None:
3354
 
                    branch_config = branch.get_config()
3355
 
                    default_bugtracker = branch_config.get_user_option(
3356
 
                        "bugtracker")
3357
 
                if default_bugtracker is None:
3358
 
                    raise errors.BzrCommandError(gettext(
3359
 
                        "No tracker specified for bug %s. Use the form "
3360
 
                        "'tracker:id' or specify a default bug tracker "
3361
 
                        "using the `bugtracker` option.\nSee "
3362
 
                        "\"bzr help bugs\" for more information on this "
3363
 
                        "feature. Commit refused.") % fixed_bug)
3364
 
                tag = default_bugtracker
3365
 
                bug_id = tokens[0]
3366
 
            elif len(tokens) != 2:
3367
 
                raise errors.BzrCommandError(gettext(
 
3169
            if len(tokens) != 2:
 
3170
                raise errors.BzrCommandError(
3368
3171
                    "Invalid bug %s. Must be in the form of 'tracker:id'. "
3369
3172
                    "See \"bzr help bugs\" for more information on this "
3370
 
                    "feature.\nCommit refused.") % fixed_bug)
3371
 
            else:
3372
 
                tag, bug_id = tokens
 
3173
                    "feature.\nCommit refused." % fixed_bug)
 
3174
            tag, bug_id = tokens
3373
3175
            try:
3374
3176
                yield bugtracker.get_bug_url(tag, branch, bug_id)
3375
3177
            except errors.UnknownBugTrackerAbbreviation:
3376
 
                raise errors.BzrCommandError(gettext(
3377
 
                    'Unrecognized bug %s. Commit refused.') % fixed_bug)
 
3178
                raise errors.BzrCommandError(
 
3179
                    'Unrecognized bug %s. Commit refused.' % fixed_bug)
3378
3180
            except errors.MalformedBugIdentifier, e:
3379
 
                raise errors.BzrCommandError(gettext(
3380
 
                    "%s\nCommit refused.") % (str(e),))
 
3181
                raise errors.BzrCommandError(
 
3182
                    "%s\nCommit refused." % (str(e),))
3381
3183
 
3382
3184
    def run(self, message=None, file=None, verbose=False, selected_list=None,
3383
3185
            unchanged=False, strict=False, local=False, fixes=None,
3400
3202
            try:
3401
3203
                commit_stamp, offset = timestamp.parse_patch_date(commit_time)
3402
3204
            except ValueError, e:
3403
 
                raise errors.BzrCommandError(gettext(
3404
 
                    "Could not parse --commit-time: " + str(e)))
 
3205
                raise errors.BzrCommandError(
 
3206
                    "Could not parse --commit-time: " + str(e))
3405
3207
 
3406
3208
        properties = {}
3407
3209
 
3440
3242
                message = message.replace('\r\n', '\n')
3441
3243
                message = message.replace('\r', '\n')
3442
3244
            if file:
3443
 
                raise errors.BzrCommandError(gettext(
3444
 
                    "please specify either --message or --file"))
 
3245
                raise errors.BzrCommandError(
 
3246
                    "please specify either --message or --file")
3445
3247
 
3446
3248
        def get_message(commit_obj):
3447
3249
            """Callback to get commit message"""
3470
3272
                    my_message = edit_commit_message_encoded(text,
3471
3273
                        start_message=start_message)
3472
3274
                if my_message is None:
3473
 
                    raise errors.BzrCommandError(gettext("please specify a commit"
3474
 
                        " message with either --message or --file"))
3475
 
                if my_message == "":
3476
 
                    raise errors.BzrCommandError(gettext("Empty commit message specified."
3477
 
                            " Please specify a commit message with either"
3478
 
                            " --message or --file or leave a blank message"
3479
 
                            " with --message \"\"."))
 
3275
                    raise errors.BzrCommandError("please specify a commit"
 
3276
                        " message with either --message or --file")
 
3277
            if my_message == "":
 
3278
                raise errors.BzrCommandError("empty commit message specified")
3480
3279
            return my_message
3481
3280
 
3482
3281
        # The API permits a commit with a filter of [] to mean 'select nothing'
3493
3292
                        exclude=tree.safe_relpath_files(exclude),
3494
3293
                        lossy=lossy)
3495
3294
        except PointlessCommit:
3496
 
            raise errors.BzrCommandError(gettext("No changes to commit."
 
3295
            raise errors.BzrCommandError("No changes to commit."
3497
3296
                " Please 'bzr add' the files you want to commit, or use"
3498
 
                " --unchanged to force an empty commit."))
 
3297
                " --unchanged to force an empty commit.")
3499
3298
        except ConflictsInTree:
3500
 
            raise errors.BzrCommandError(gettext('Conflicts detected in working '
 
3299
            raise errors.BzrCommandError('Conflicts detected in working '
3501
3300
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3502
 
                ' resolve.'))
 
3301
                ' resolve.')
3503
3302
        except StrictCommitFailed:
3504
 
            raise errors.BzrCommandError(gettext("Commit refused because there are"
3505
 
                              " unknown files in the working tree."))
 
3303
            raise errors.BzrCommandError("Commit refused because there are"
 
3304
                              " unknown files in the working tree.")
3506
3305
        except errors.BoundBranchOutOfDate, e:
3507
 
            e.extra_help = (gettext("\n"
 
3306
            e.extra_help = ("\n"
3508
3307
                'To commit to master branch, run update and then commit.\n'
3509
3308
                'You can also pass --local to commit to continue working '
3510
 
                'disconnected.'))
 
3309
                'disconnected.')
3511
3310
            raise
3512
3311
 
3513
3312
 
3620
3419
        RegistryOption('format',
3621
3420
            help='Upgrade to a specific format.  See "bzr help'
3622
3421
                 ' formats" for details.',
3623
 
            lazy_registry=('bzrlib.controldir', 'format_registry'),
3624
 
            converter=lambda name: controldir.format_registry.make_bzrdir(name),
 
3422
            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
3423
            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3625
3424
            value_switches=True, title='Branch format'),
3626
3425
        Option('clean',
3627
3426
            help='Remove the backup.bzr directory if successful.'),
3680
3479
            return
3681
3480
 
3682
3481
        if email:
3683
 
            raise errors.BzrCommandError(gettext("--email can only be used to display existing "
3684
 
                                         "identity"))
 
3482
            raise errors.BzrCommandError("--email can only be used to display existing "
 
3483
                                         "identity")
3685
3484
 
3686
3485
        # display a warning if an email address isn't included in the given name.
3687
3486
        try:
3766
3565
 
3767
3566
    def remove_alias(self, alias_name):
3768
3567
        if alias_name is None:
3769
 
            raise errors.BzrCommandError(gettext(
3770
 
                'bzr alias --remove expects an alias to remove.'))
 
3568
            raise errors.BzrCommandError(
 
3569
                'bzr alias --remove expects an alias to remove.')
3771
3570
        # If alias is not found, print something like:
3772
3571
        # unalias: foo: not found
3773
3572
        c = _mod_config.GlobalConfig()
3911
3710
                                param_name='starting_with', short_name='s',
3912
3711
                                help=
3913
3712
                                'Load only the tests starting with TESTID.'),
3914
 
                     Option('sync',
3915
 
                            help="By default we disable fsync and fdatasync"
3916
 
                                 " while running the test suite.")
3917
3713
                     ]
3918
3714
    encoding_type = 'replace'
3919
3715
 
3927
3723
            first=False, list_only=False,
3928
3724
            randomize=None, exclude=None, strict=False,
3929
3725
            load_list=None, debugflag=None, starting_with=None, subunit=False,
3930
 
            parallel=None, lsprof_tests=False,
3931
 
            sync=False):
 
3726
            parallel=None, lsprof_tests=False):
3932
3727
        from bzrlib import tests
3933
3728
 
3934
3729
        if testspecs_list is not None:
3939
3734
            try:
3940
3735
                from bzrlib.tests import SubUnitBzrRunner
3941
3736
            except ImportError:
3942
 
                raise errors.BzrCommandError(gettext("subunit not available. subunit "
3943
 
                    "needs to be installed to use --subunit."))
 
3737
                raise errors.BzrCommandError("subunit not available. subunit "
 
3738
                    "needs to be installed to use --subunit.")
3944
3739
            self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3945
3740
            # On Windows, disable automatic conversion of '\n' to '\r\n' in
3946
3741
            # stdout, which would corrupt the subunit stream. 
3955
3750
            self.additional_selftest_args.setdefault(
3956
3751
                'suite_decorators', []).append(parallel)
3957
3752
        if benchmark:
3958
 
            raise errors.BzrCommandError(gettext(
 
3753
            raise errors.BzrCommandError(
3959
3754
                "--benchmark is no longer supported from bzr 2.2; "
3960
 
                "use bzr-usertest instead"))
 
3755
                "use bzr-usertest instead")
3961
3756
        test_suite_factory = None
3962
3757
        if not exclude:
3963
3758
            exclude_pattern = None
3964
3759
        else:
3965
3760
            exclude_pattern = '(' + '|'.join(exclude) + ')'
3966
 
        if not sync:
3967
 
            self._disable_fsync()
3968
3761
        selftest_kwargs = {"verbose": verbose,
3969
3762
                          "pattern": pattern,
3970
3763
                          "stop_on_failure": one,
3992
3785
            cleanup()
3993
3786
        return int(not result)
3994
3787
 
3995
 
    def _disable_fsync(self):
3996
 
        """Change the 'os' functionality to not synchronize."""
3997
 
        self._orig_fsync = getattr(os, 'fsync', None)
3998
 
        if self._orig_fsync is not None:
3999
 
            os.fsync = lambda filedes: None
4000
 
        self._orig_fdatasync = getattr(os, 'fdatasync', None)
4001
 
        if self._orig_fdatasync is not None:
4002
 
            os.fdatasync = lambda filedes: None
4003
 
 
4004
3788
 
4005
3789
class cmd_version(Command):
4006
3790
    __doc__ = """Show version of bzr."""
4026
3810
 
4027
3811
    @display_command
4028
3812
    def run(self):
4029
 
        self.outf.write(gettext("It sure does!\n"))
 
3813
        self.outf.write("It sure does!\n")
4030
3814
 
4031
3815
 
4032
3816
class cmd_find_merge_base(Command):
4050
3834
        graph = branch1.repository.get_graph(branch2.repository)
4051
3835
        base_rev_id = graph.find_unique_lca(last1, last2)
4052
3836
 
4053
 
        self.outf.write(gettext('merge base is revision %s\n') % base_rev_id)
 
3837
        self.outf.write('merge base is revision %s\n' % base_rev_id)
4054
3838
 
4055
3839
 
4056
3840
class cmd_merge(Command):
4089
3873
    Use bzr resolve when you have fixed a problem.  See also bzr conflicts.
4090
3874
 
4091
3875
    If there is no default branch set, the first merge will set it (use
4092
 
    --no-remember to avoid setting it). After that, you can omit the branch
 
3876
    --no-remember to avoid settting it). After that, you can omit the branch
4093
3877
    to use the default.  To change the default, use --remember. The value will
4094
3878
    only be saved if the remote location can be accessed.
4095
3879
 
4181
3965
 
4182
3966
        tree = WorkingTree.open_containing(directory)[0]
4183
3967
        if tree.branch.revno() == 0:
4184
 
            raise errors.BzrCommandError(gettext('Merging into empty branches not currently supported, '
4185
 
                                         'https://bugs.launchpad.net/bzr/+bug/308562'))
 
3968
            raise errors.BzrCommandError('Merging into empty branches not currently supported, '
 
3969
                                         'https://bugs.launchpad.net/bzr/+bug/308562')
4186
3970
 
4187
3971
        try:
4188
3972
            basis_tree = tree.revision_tree(tree.last_revision())
4208
3992
                mergeable = None
4209
3993
            else:
4210
3994
                if uncommitted:
4211
 
                    raise errors.BzrCommandError(gettext('Cannot use --uncommitted'
4212
 
                        ' with bundles or merge directives.'))
 
3995
                    raise errors.BzrCommandError('Cannot use --uncommitted'
 
3996
                        ' with bundles or merge directives.')
4213
3997
 
4214
3998
                if revision is not None:
4215
 
                    raise errors.BzrCommandError(gettext(
4216
 
                        'Cannot use -r with merge directives or bundles'))
 
3999
                    raise errors.BzrCommandError(
 
4000
                        'Cannot use -r with merge directives or bundles')
4217
4001
                merger, verified = _mod_merge.Merger.from_mergeable(tree,
4218
4002
                   mergeable, None)
4219
4003
 
4220
4004
        if merger is None and uncommitted:
4221
4005
            if revision is not None and len(revision) > 0:
4222
 
                raise errors.BzrCommandError(gettext('Cannot use --uncommitted and'
4223
 
                    ' --revision at the same time.'))
 
4006
                raise errors.BzrCommandError('Cannot use --uncommitted and'
 
4007
                    ' --revision at the same time.')
4224
4008
            merger = self.get_merger_from_uncommitted(tree, location, None)
4225
4009
            allow_pending = False
4226
4010
 
4239
4023
            if merger.interesting_files:
4240
4024
                if not merger.other_tree.has_filename(
4241
4025
                    merger.interesting_files[0]):
4242
 
                    note(gettext("merger: ") + str(merger))
 
4026
                    note("merger: " + str(merger))
4243
4027
                    raise errors.PathsDoNotExist([location])
4244
 
            note(gettext('Nothing to do.'))
 
4028
            note('Nothing to do.')
4245
4029
            return 0
4246
4030
        if pull and not preview:
4247
4031
            if merger.interesting_files is not None:
4248
 
                raise errors.BzrCommandError(gettext('Cannot pull individual files'))
 
4032
                raise errors.BzrCommandError('Cannot pull individual files')
4249
4033
            if (merger.base_rev_id == tree.last_revision()):
4250
4034
                result = tree.pull(merger.other_branch, False,
4251
4035
                                   merger.other_rev_id)
4252
4036
                result.report(self.outf)
4253
4037
                return 0
4254
4038
        if merger.this_basis is None:
4255
 
            raise errors.BzrCommandError(gettext(
 
4039
            raise errors.BzrCommandError(
4256
4040
                "This branch has no commits."
4257
 
                " (perhaps you would prefer 'bzr pull')"))
 
4041
                " (perhaps you would prefer 'bzr pull')")
4258
4042
        if preview:
4259
4043
            return self._do_preview(merger)
4260
4044
        elif interactive:
4311
4095
    def sanity_check_merger(self, merger):
4312
4096
        if (merger.show_base and
4313
4097
            not merger.merge_type is _mod_merge.Merge3Merger):
4314
 
            raise errors.BzrCommandError(gettext("Show-base is not supported for this"
4315
 
                                         " merge type. %s") % merger.merge_type)
 
4098
            raise errors.BzrCommandError("Show-base is not supported for this"
 
4099
                                         " merge type. %s" % merger.merge_type)
4316
4100
        if merger.reprocess is None:
4317
4101
            if merger.show_base:
4318
4102
                merger.reprocess = False
4320
4104
                # Use reprocess if the merger supports it
4321
4105
                merger.reprocess = merger.merge_type.supports_reprocess
4322
4106
        if merger.reprocess and not merger.merge_type.supports_reprocess:
4323
 
            raise errors.BzrCommandError(gettext("Conflict reduction is not supported"
4324
 
                                         " for merge type %s.") %
 
4107
            raise errors.BzrCommandError("Conflict reduction is not supported"
 
4108
                                         " for merge type %s." %
4325
4109
                                         merger.merge_type)
4326
4110
        if merger.reprocess and merger.show_base:
4327
 
            raise errors.BzrCommandError(gettext("Cannot do conflict reduction and"
4328
 
                                         " show base."))
 
4111
            raise errors.BzrCommandError("Cannot do conflict reduction and"
 
4112
                                         " show base.")
4329
4113
 
4330
4114
    def _get_merger_from_branch(self, tree, location, revision, remember,
4331
4115
                                possible_transports, pb):
4435
4219
            stored_location_type = "parent"
4436
4220
        mutter("%s", stored_location)
4437
4221
        if stored_location is None:
4438
 
            raise errors.BzrCommandError(gettext("No location specified or remembered"))
 
4222
            raise errors.BzrCommandError("No location specified or remembered")
4439
4223
        display_url = urlutils.unescape_for_display(stored_location, 'utf-8')
4440
 
        note(gettext("{0} remembered {1} location {2}").format(verb_string,
4441
 
                stored_location_type, display_url))
 
4224
        note(u"%s remembered %s location %s", verb_string,
 
4225
                stored_location_type, display_url)
4442
4226
        return stored_location
4443
4227
 
4444
4228
 
4481
4265
        self.add_cleanup(tree.lock_write().unlock)
4482
4266
        parents = tree.get_parent_ids()
4483
4267
        if len(parents) != 2:
4484
 
            raise errors.BzrCommandError(gettext("Sorry, remerge only works after normal"
 
4268
            raise errors.BzrCommandError("Sorry, remerge only works after normal"
4485
4269
                                         " merges.  Not cherrypicking or"
4486
 
                                         " multi-merges."))
 
4270
                                         " multi-merges.")
4487
4271
        repository = tree.branch.repository
4488
4272
        interesting_ids = None
4489
4273
        new_conflicts = []
4708
4492
            type=_parse_revision_str,
4709
4493
            help='Filter on local branch revisions (inclusive). '
4710
4494
                'See "help revisionspec" for details.'),
4711
 
        Option('include-merged',
 
4495
        Option('include-merges',
4712
4496
               'Show all revisions in addition to the mainline ones.'),
4713
 
        Option('include-merges', hidden=True,
4714
 
               help='Historical alias for --include-merged.'),
4715
4497
        ]
4716
4498
    encoding_type = 'replace'
4717
4499
 
4720
4502
            theirs_only=False,
4721
4503
            log_format=None, long=False, short=False, line=False,
4722
4504
            show_ids=False, verbose=False, this=False, other=False,
4723
 
            include_merged=None, revision=None, my_revision=None,
4724
 
            directory=u'.',
4725
 
            include_merges=symbol_versioning.DEPRECATED_PARAMETER):
 
4505
            include_merges=False, revision=None, my_revision=None,
 
4506
            directory=u'.'):
4726
4507
        from bzrlib.missing import find_unmerged, iter_log_revisions
4727
4508
        def message(s):
4728
4509
            if not is_quiet():
4729
4510
                self.outf.write(s)
4730
4511
 
4731
 
        if symbol_versioning.deprecated_passed(include_merges):
4732
 
            ui.ui_factory.show_user_warning(
4733
 
                'deprecated_command_option',
4734
 
                deprecated_name='--include-merges',
4735
 
                recommended_name='--include-merged',
4736
 
                deprecated_in_version='2.5',
4737
 
                command=self.invoked_as)
4738
 
            if include_merged is None:
4739
 
                include_merged = include_merges
4740
 
            else:
4741
 
                raise errors.BzrCommandError(gettext(
4742
 
                    '{0} and {1} are mutually exclusive').format(
4743
 
                    '--include-merges', '--include-merged'))
4744
 
        if include_merged is None:
4745
 
            include_merged = False
4746
4512
        if this:
4747
4513
            mine_only = this
4748
4514
        if other:
4763
4529
        if other_branch is None:
4764
4530
            other_branch = parent
4765
4531
            if other_branch is None:
4766
 
                raise errors.BzrCommandError(gettext("No peer location known"
4767
 
                                             " or specified."))
 
4532
                raise errors.BzrCommandError("No peer location known"
 
4533
                                             " or specified.")
4768
4534
            display_url = urlutils.unescape_for_display(parent,
4769
4535
                                                        self.outf.encoding)
4770
 
            message(gettext("Using saved parent location: {0}\n").format(
4771
 
                    display_url))
 
4536
            message("Using saved parent location: "
 
4537
                    + display_url + "\n")
4772
4538
 
4773
4539
        remote_branch = Branch.open(other_branch)
4774
4540
        if remote_branch.base == local_branch.base:
4787
4553
        local_extra, remote_extra = find_unmerged(
4788
4554
            local_branch, remote_branch, restrict,
4789
4555
            backward=not reverse,
4790
 
            include_merged=include_merged,
 
4556
            include_merges=include_merges,
4791
4557
            local_revid_range=local_revid_range,
4792
4558
            remote_revid_range=remote_revid_range)
4793
4559
 
4800
4566
 
4801
4567
        status_code = 0
4802
4568
        if local_extra and not theirs_only:
4803
 
            message(ngettext("You have %d extra revision:\n",
4804
 
                             "You have %d extra revisions:\n", 
4805
 
                             len(local_extra)) %
 
4569
            message("You have %d extra revision(s):\n" %
4806
4570
                len(local_extra))
4807
4571
            for revision in iter_log_revisions(local_extra,
4808
4572
                                local_branch.repository,
4816
4580
        if remote_extra and not mine_only:
4817
4581
            if printed_local is True:
4818
4582
                message("\n\n\n")
4819
 
            message(ngettext("You are missing %d revision:\n",
4820
 
                             "You are missing %d revisions:\n",
4821
 
                             len(remote_extra)) %
 
4583
            message("You are missing %d revision(s):\n" %
4822
4584
                len(remote_extra))
4823
4585
            for revision in iter_log_revisions(remote_extra,
4824
4586
                                remote_branch.repository,
4828
4590
 
4829
4591
        if mine_only and not local_extra:
4830
4592
            # We checked local, and found nothing extra
4831
 
            message(gettext('This branch has no new revisions.\n'))
 
4593
            message('This branch is up to date.\n')
4832
4594
        elif theirs_only and not remote_extra:
4833
4595
            # We checked remote, and found nothing extra
4834
 
            message(gettext('Other branch has no new revisions.\n'))
 
4596
            message('Other branch is up to date.\n')
4835
4597
        elif not (mine_only or theirs_only or local_extra or
4836
4598
                  remote_extra):
4837
4599
            # We checked both branches, and neither one had extra
4838
4600
            # revisions
4839
 
            message(gettext("Branches are up to date.\n"))
 
4601
            message("Branches are up to date.\n")
4840
4602
        self.cleanup_now()
4841
4603
        if not status_code and parent is None and other_branch is not None:
4842
4604
            self.add_cleanup(local_branch.lock_write().unlock)
4872
4634
        ]
4873
4635
 
4874
4636
    def run(self, branch_or_repo='.', clean_obsolete_packs=False):
4875
 
        dir = controldir.ControlDir.open_containing(branch_or_repo)[0]
 
4637
        dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4876
4638
        try:
4877
4639
            branch = dir.open_branch()
4878
4640
            repository = branch.repository
5003
4765
 
5004
4766
    def run(self, revision_id_list=None, revision=None, directory=u'.'):
5005
4767
        if revision_id_list is not None and revision is not None:
5006
 
            raise errors.BzrCommandError(gettext('You can only supply one of revision_id or --revision'))
 
4768
            raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
5007
4769
        if revision_id_list is None and revision is None:
5008
 
            raise errors.BzrCommandError(gettext('You must supply either --revision or a revision_id'))
 
4770
            raise errors.BzrCommandError('You must supply either --revision or a revision_id')
5009
4771
        b = WorkingTree.open_containing(directory)[0].branch
5010
4772
        self.add_cleanup(b.lock_write().unlock)
5011
4773
        return self._run(b, revision_id_list, revision)
5043
4805
                if to_revid is None:
5044
4806
                    to_revno = b.revno()
5045
4807
                if from_revno is None or to_revno is None:
5046
 
                    raise errors.BzrCommandError(gettext('Cannot sign a range of non-revision-history revisions'))
 
4808
                    raise errors.BzrCommandError('Cannot sign a range of non-revision-history revisions')
5047
4809
                b.repository.start_write_group()
5048
4810
                try:
5049
4811
                    for revno in range(from_revno, to_revno + 1):
5055
4817
                else:
5056
4818
                    b.repository.commit_write_group()
5057
4819
            else:
5058
 
                raise errors.BzrCommandError(gettext('Please supply either one revision, or a range.'))
 
4820
                raise errors.BzrCommandError('Please supply either one revision, or a range.')
5059
4821
 
5060
4822
 
5061
4823
class cmd_bind(Command):
5080
4842
            try:
5081
4843
                location = b.get_old_bound_location()
5082
4844
            except errors.UpgradeRequired:
5083
 
                raise errors.BzrCommandError(gettext('No location supplied.  '
5084
 
                    'This format does not remember old locations.'))
 
4845
                raise errors.BzrCommandError('No location supplied.  '
 
4846
                    'This format does not remember old locations.')
5085
4847
            else:
5086
4848
                if location is None:
5087
4849
                    if b.get_bound_location() is not None:
5088
 
                        raise errors.BzrCommandError(gettext('Branch is already bound'))
 
4850
                        raise errors.BzrCommandError('Branch is already bound')
5089
4851
                    else:
5090
 
                        raise errors.BzrCommandError(gettext('No location supplied '
5091
 
                            'and no previous location known'))
 
4852
                        raise errors.BzrCommandError('No location supplied '
 
4853
                            'and no previous location known')
5092
4854
        b_other = Branch.open(location)
5093
4855
        try:
5094
4856
            b.bind(b_other)
5095
4857
        except errors.DivergedBranches:
5096
 
            raise errors.BzrCommandError(gettext('These branches have diverged.'
5097
 
                                         ' Try merging, and then bind again.'))
 
4858
            raise errors.BzrCommandError('These branches have diverged.'
 
4859
                                         ' Try merging, and then bind again.')
5098
4860
        if b.get_config().has_explicit_nickname():
5099
4861
            b.nick = b_other.nick
5100
4862
 
5113
4875
    def run(self, directory=u'.'):
5114
4876
        b, relpath = Branch.open_containing(directory)
5115
4877
        if not b.unbind():
5116
 
            raise errors.BzrCommandError(gettext('Local branch is not bound'))
 
4878
            raise errors.BzrCommandError('Local branch is not bound')
5117
4879
 
5118
4880
 
5119
4881
class cmd_uncommit(Command):
5140
4902
    takes_options = ['verbose', 'revision',
5141
4903
                    Option('dry-run', help='Don\'t actually make changes.'),
5142
4904
                    Option('force', help='Say yes to all questions.'),
5143
 
                    Option('keep-tags',
5144
 
                           help='Keep tags that point to removed revisions.'),
5145
4905
                    Option('local',
5146
4906
                           help="Only remove the commits from the local branch"
5147
4907
                                " when in a checkout."
5151
4911
    aliases = []
5152
4912
    encoding_type = 'replace'
5153
4913
 
5154
 
    def run(self, location=None, dry_run=False, verbose=False,
5155
 
            revision=None, force=False, local=False, keep_tags=False):
 
4914
    def run(self, location=None,
 
4915
            dry_run=False, verbose=False,
 
4916
            revision=None, force=False, local=False):
5156
4917
        if location is None:
5157
4918
            location = u'.'
5158
 
        control, relpath = controldir.ControlDir.open_containing(location)
 
4919
        control, relpath = bzrdir.BzrDir.open_containing(location)
5159
4920
        try:
5160
4921
            tree = control.open_workingtree()
5161
4922
            b = tree.branch
5167
4928
            self.add_cleanup(tree.lock_write().unlock)
5168
4929
        else:
5169
4930
            self.add_cleanup(b.lock_write().unlock)
5170
 
        return self._run(b, tree, dry_run, verbose, revision, force,
5171
 
                         local, keep_tags)
 
4931
        return self._run(b, tree, dry_run, verbose, revision, force, local=local)
5172
4932
 
5173
 
    def _run(self, b, tree, dry_run, verbose, revision, force, local,
5174
 
             keep_tags):
 
4933
    def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
5175
4934
        from bzrlib.log import log_formatter, show_log
5176
4935
        from bzrlib.uncommit import uncommit
5177
4936
 
5192
4951
                rev_id = b.get_rev_id(revno)
5193
4952
 
5194
4953
        if rev_id is None or _mod_revision.is_null(rev_id):
5195
 
            self.outf.write(gettext('No revisions to uncommit.\n'))
 
4954
            self.outf.write('No revisions to uncommit.\n')
5196
4955
            return 1
5197
4956
 
5198
4957
        lf = log_formatter('short',
5207
4966
                 end_revision=last_revno)
5208
4967
 
5209
4968
        if dry_run:
5210
 
            self.outf.write(gettext('Dry-run, pretending to remove'
5211
 
                            ' the above revisions.\n'))
 
4969
            self.outf.write('Dry-run, pretending to remove'
 
4970
                            ' the above revisions.\n')
5212
4971
        else:
5213
 
            self.outf.write(gettext('The above revision(s) will be removed.\n'))
 
4972
            self.outf.write('The above revision(s) will be removed.\n')
5214
4973
 
5215
4974
        if not force:
5216
4975
            if not ui.ui_factory.confirm_action(
5217
 
                    gettext(u'Uncommit these revisions'),
 
4976
                    u'Uncommit these revisions',
5218
4977
                    'bzrlib.builtins.uncommit',
5219
4978
                    {}):
5220
 
                self.outf.write(gettext('Canceled\n'))
 
4979
                self.outf.write('Canceled\n')
5221
4980
                return 0
5222
4981
 
5223
4982
        mutter('Uncommitting from {%s} to {%s}',
5224
4983
               last_rev_id, rev_id)
5225
4984
        uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
5226
 
                 revno=revno, local=local, keep_tags=keep_tags)
5227
 
        self.outf.write(gettext('You can restore the old tip by running:\n'
5228
 
             '  bzr pull . -r revid:%s\n') % last_rev_id)
 
4985
                 revno=revno, local=local)
 
4986
        self.outf.write('You can restore the old tip by running:\n'
 
4987
             '  bzr pull . -r revid:%s\n' % last_rev_id)
5229
4988
 
5230
4989
 
5231
4990
class cmd_break_lock(Command):
5265
5024
            conf = _mod_config.LockableConfig(file_name=location)
5266
5025
            conf.break_lock()
5267
5026
        else:
5268
 
            control, relpath = controldir.ControlDir.open_containing(location)
 
5027
            control, relpath = bzrdir.BzrDir.open_containing(location)
5269
5028
            try:
5270
5029
                control.break_lock()
5271
5030
            except NotImplementedError:
5315
5074
                    'option leads to global uncontrolled write access to your '
5316
5075
                    'file system.'
5317
5076
                ),
5318
 
        Option('client-timeout', type=float,
5319
 
               help='Override the default idle client timeout (5min).'),
5320
5077
        ]
5321
5078
 
5322
5079
    def get_host_and_port(self, port):
5339
5096
        return host, port
5340
5097
 
5341
5098
    def run(self, port=None, inet=False, directory=None, allow_writes=False,
5342
 
            protocol=None, client_timeout=None):
 
5099
            protocol=None):
5343
5100
        from bzrlib import transport
5344
5101
        if directory is None:
5345
5102
            directory = os.getcwd()
5350
5107
        if not allow_writes:
5351
5108
            url = 'readonly+' + url
5352
5109
        t = transport.get_transport(url)
5353
 
        try:
5354
 
            protocol(t, host, port, inet, client_timeout)
5355
 
        except TypeError, e:
5356
 
            # We use symbol_versioning.deprecated_in just so that people
5357
 
            # grepping can find it here.
5358
 
            # symbol_versioning.deprecated_in((2, 5, 0))
5359
 
            symbol_versioning.warn(
5360
 
                'Got TypeError(%s)\ntrying to call protocol: %s.%s\n'
5361
 
                'Most likely it needs to be updated to support a'
5362
 
                ' "timeout" parameter (added in bzr 2.5.0)'
5363
 
                % (e, protocol.__module__, protocol),
5364
 
                DeprecationWarning)
5365
 
            protocol(t, host, port, inet)
 
5110
        protocol(t, host, port, inet)
5366
5111
 
5367
5112
 
5368
5113
class cmd_join(Command):
5391
5136
        containing_tree = WorkingTree.open_containing(parent_dir)[0]
5392
5137
        repo = containing_tree.branch.repository
5393
5138
        if not repo.supports_rich_root():
5394
 
            raise errors.BzrCommandError(gettext(
 
5139
            raise errors.BzrCommandError(
5395
5140
                "Can't join trees because %s doesn't support rich root data.\n"
5396
 
                "You can use bzr upgrade on the repository.")
 
5141
                "You can use bzr upgrade on the repository."
5397
5142
                % (repo,))
5398
5143
        if reference:
5399
5144
            try:
5401
5146
            except errors.BadReferenceTarget, e:
5402
5147
                # XXX: Would be better to just raise a nicely printable
5403
5148
                # exception from the real origin.  Also below.  mbp 20070306
5404
 
                raise errors.BzrCommandError(
5405
 
                       gettext("Cannot join {0}.  {1}").format(tree, e.reason))
 
5149
                raise errors.BzrCommandError("Cannot join %s.  %s" %
 
5150
                                             (tree, e.reason))
5406
5151
        else:
5407
5152
            try:
5408
5153
                containing_tree.subsume(sub_tree)
5409
5154
            except errors.BadSubsumeSource, e:
5410
 
                raise errors.BzrCommandError(
5411
 
                       gettext("Cannot join {0}.  {1}").format(tree, e.reason))
 
5155
                raise errors.BzrCommandError("Cannot join %s.  %s" %
 
5156
                                             (tree, e.reason))
5412
5157
 
5413
5158
 
5414
5159
class cmd_split(Command):
5498
5243
        if submit_branch is None:
5499
5244
            submit_branch = branch.get_parent()
5500
5245
        if submit_branch is None:
5501
 
            raise errors.BzrCommandError(gettext('No submit branch specified or known'))
 
5246
            raise errors.BzrCommandError('No submit branch specified or known')
5502
5247
 
5503
5248
        stored_public_branch = branch.get_public_branch()
5504
5249
        if public_branch is None:
5506
5251
        elif stored_public_branch is None:
5507
5252
            branch.set_public_branch(public_branch)
5508
5253
        if not include_bundle and public_branch is None:
5509
 
            raise errors.BzrCommandError(gettext('No public branch specified or'
5510
 
                                         ' known'))
 
5254
            raise errors.BzrCommandError('No public branch specified or'
 
5255
                                         ' known')
5511
5256
        base_revision_id = None
5512
5257
        if revision is not None:
5513
5258
            if len(revision) > 2:
5514
 
                raise errors.BzrCommandError(gettext('bzr merge-directive takes '
5515
 
                    'at most two one revision identifiers'))
 
5259
                raise errors.BzrCommandError('bzr merge-directive takes '
 
5260
                    'at most two one revision identifiers')
5516
5261
            revision_id = revision[-1].as_revision_id(branch)
5517
5262
            if len(revision) == 2:
5518
5263
                base_revision_id = revision[0].as_revision_id(branch)
5520
5265
            revision_id = branch.last_revision()
5521
5266
        revision_id = ensure_null(revision_id)
5522
5267
        if revision_id == NULL_REVISION:
5523
 
            raise errors.BzrCommandError(gettext('No revisions to bundle.'))
 
5268
            raise errors.BzrCommandError('No revisions to bundle.')
5524
5269
        directive = merge_directive.MergeDirective2.from_objects(
5525
5270
            branch.repository, revision_id, time.time(),
5526
5271
            osutils.local_time_offset(), submit_branch,
5572
5317
 
5573
5318
    Both the submit branch and the public branch follow the usual behavior with
5574
5319
    respect to --remember: If there is no default location set, the first send
5575
 
    will set it (use --no-remember to avoid setting it). After that, you can
 
5320
    will set it (use --no-remember to avoid settting it). After that, you can
5576
5321
    omit the location to use the default.  To change the default, use
5577
5322
    --remember. The value will only be saved if the location can be accessed.
5578
5323
 
5780
5525
        self.add_cleanup(branch.lock_write().unlock)
5781
5526
        if delete:
5782
5527
            if tag_name is None:
5783
 
                raise errors.BzrCommandError(gettext("No tag specified to delete."))
 
5528
                raise errors.BzrCommandError("No tag specified to delete.")
5784
5529
            branch.tags.delete_tag(tag_name)
5785
 
            note(gettext('Deleted tag %s.') % tag_name)
 
5530
            note('Deleted tag %s.' % tag_name)
5786
5531
        else:
5787
5532
            if revision:
5788
5533
                if len(revision) != 1:
5789
 
                    raise errors.BzrCommandError(gettext(
 
5534
                    raise errors.BzrCommandError(
5790
5535
                        "Tags can only be placed on a single revision, "
5791
 
                        "not on a range"))
 
5536
                        "not on a range")
5792
5537
                revision_id = revision[0].as_revision_id(branch)
5793
5538
            else:
5794
5539
                revision_id = branch.last_revision()
5795
5540
            if tag_name is None:
5796
5541
                tag_name = branch.automatic_tag_name(revision_id)
5797
5542
                if tag_name is None:
5798
 
                    raise errors.BzrCommandError(gettext(
5799
 
                        "Please specify a tag name."))
5800
 
            try:
5801
 
                existing_target = branch.tags.lookup_tag(tag_name)
5802
 
            except errors.NoSuchTag:
5803
 
                existing_target = None
5804
 
            if not force and existing_target not in (None, revision_id):
 
5543
                    raise errors.BzrCommandError(
 
5544
                        "Please specify a tag name.")
 
5545
            if (not force) and branch.tags.has_tag(tag_name):
5805
5546
                raise errors.TagAlreadyExists(tag_name)
5806
 
            if existing_target == revision_id:
5807
 
                note(gettext('Tag %s already exists for that revision.') % tag_name)
5808
 
            else:
5809
 
                branch.tags.set_tag(tag_name, revision_id)
5810
 
                if existing_target is None:
5811
 
                    note(gettext('Created tag %s.') % tag_name)
5812
 
                else:
5813
 
                    note(gettext('Updated tag %s.') % tag_name)
 
5547
            branch.tags.set_tag(tag_name, revision_id)
 
5548
            note('Created tag %s.' % tag_name)
5814
5549
 
5815
5550
 
5816
5551
class cmd_tags(Command):
5842
5577
 
5843
5578
        self.add_cleanup(branch.lock_read().unlock)
5844
5579
        if revision:
5845
 
            # Restrict to the specified range
5846
 
            tags = self._tags_for_range(branch, revision)
 
5580
            graph = branch.repository.get_graph()
 
5581
            rev1, rev2 = _get_revision_range(revision, branch, self.name())
 
5582
            revid1, revid2 = rev1.rev_id, rev2.rev_id
 
5583
            # only show revisions between revid1 and revid2 (inclusive)
 
5584
            tags = [(tag, revid) for tag, revid in tags if
 
5585
                graph.is_between(revid, revid1, revid2)]
5847
5586
        if sort is None:
5848
5587
            sort = tag_sort_methods.get()
5849
5588
        sort(branch, tags)
5854
5593
                    revno = branch.revision_id_to_dotted_revno(revid)
5855
5594
                    if isinstance(revno, tuple):
5856
5595
                        revno = '.'.join(map(str, revno))
5857
 
                except (errors.NoSuchRevision,
5858
 
                        errors.GhostRevisionsHaveNoRevno,
5859
 
                        errors.UnsupportedOperation):
 
5596
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
5860
5597
                    # Bad tag data/merges can lead to tagged revisions
5861
5598
                    # which are not in this branch. Fail gracefully ...
5862
5599
                    revno = '?'
5865
5602
        for tag, revspec in tags:
5866
5603
            self.outf.write('%-20s %s\n' % (tag, revspec))
5867
5604
 
5868
 
    def _tags_for_range(self, branch, revision):
5869
 
        range_valid = True
5870
 
        rev1, rev2 = _get_revision_range(revision, branch, self.name())
5871
 
        revid1, revid2 = rev1.rev_id, rev2.rev_id
5872
 
        # _get_revision_range will always set revid2 if it's not specified.
5873
 
        # If revid1 is None, it means we want to start from the branch
5874
 
        # origin which is always a valid ancestor. If revid1 == revid2, the
5875
 
        # ancestry check is useless.
5876
 
        if revid1 and revid1 != revid2:
5877
 
            # FIXME: We really want to use the same graph than
5878
 
            # branch.iter_merge_sorted_revisions below, but this is not
5879
 
            # easily available -- vila 2011-09-23
5880
 
            if branch.repository.get_graph().is_ancestor(revid2, revid1):
5881
 
                # We don't want to output anything in this case...
5882
 
                return []
5883
 
        # only show revisions between revid1 and revid2 (inclusive)
5884
 
        tagged_revids = branch.tags.get_reverse_tag_dict()
5885
 
        found = []
5886
 
        for r in branch.iter_merge_sorted_revisions(
5887
 
            start_revision_id=revid2, stop_revision_id=revid1,
5888
 
            stop_rule='include'):
5889
 
            revid_tags = tagged_revids.get(r[0], None)
5890
 
            if revid_tags:
5891
 
                found.extend([(tag, r[0]) for tag in revid_tags])
5892
 
        return found
5893
 
 
5894
5605
 
5895
5606
class cmd_reconfigure(Command):
5896
5607
    __doc__ = """Reconfigure the type of a bzr directory.
5910
5621
    takes_args = ['location?']
5911
5622
    takes_options = [
5912
5623
        RegistryOption.from_kwargs(
5913
 
            'tree_type',
5914
 
            title='Tree type',
5915
 
            help='The relation between branch and tree.',
 
5624
            'target_type',
 
5625
            title='Target type',
 
5626
            help='The type to reconfigure the directory to.',
5916
5627
            value_switches=True, enum_switch=False,
5917
5628
            branch='Reconfigure to be an unbound branch with no working tree.',
5918
5629
            tree='Reconfigure to be an unbound branch with a working tree.',
5919
5630
            checkout='Reconfigure to be a bound branch with a working tree.',
5920
5631
            lightweight_checkout='Reconfigure to be a lightweight'
5921
5632
                ' checkout (with no local history).',
5922
 
            ),
5923
 
        RegistryOption.from_kwargs(
5924
 
            'repository_type',
5925
 
            title='Repository type',
5926
 
            help='Location fo the repository.',
5927
 
            value_switches=True, enum_switch=False,
5928
5633
            standalone='Reconfigure to be a standalone branch '
5929
5634
                '(i.e. stop using shared repository).',
5930
5635
            use_shared='Reconfigure to use a shared repository.',
5931
 
            ),
5932
 
        RegistryOption.from_kwargs(
5933
 
            'repository_trees',
5934
 
            title='Trees in Repository',
5935
 
            help='Whether new branches in the repository have trees.',
5936
 
            value_switches=True, enum_switch=False,
5937
5636
            with_trees='Reconfigure repository to create '
5938
5637
                'working trees on branches by default.',
5939
5638
            with_no_trees='Reconfigure repository to not create '
5953
5652
            ),
5954
5653
        ]
5955
5654
 
5956
 
    def run(self, location=None, bind_to=None, force=False,
5957
 
            tree_type=None, repository_type=None, repository_trees=None,
5958
 
            stacked_on=None, unstacked=None):
5959
 
        directory = controldir.ControlDir.open(location)
 
5655
    def run(self, location=None, target_type=None, bind_to=None, force=False,
 
5656
            stacked_on=None,
 
5657
            unstacked=None):
 
5658
        directory = bzrdir.BzrDir.open(location)
5960
5659
        if stacked_on and unstacked:
5961
 
            raise errors.BzrCommandError(gettext("Can't use both --stacked-on and --unstacked"))
 
5660
            raise errors.BzrCommandError("Can't use both --stacked-on and --unstacked")
5962
5661
        elif stacked_on is not None:
5963
5662
            reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5964
5663
        elif unstacked:
5966
5665
        # At the moment you can use --stacked-on and a different
5967
5666
        # reconfiguration shape at the same time; there seems no good reason
5968
5667
        # to ban it.
5969
 
        if (tree_type is None and
5970
 
            repository_type is None and
5971
 
            repository_trees is None):
 
5668
        if target_type is None:
5972
5669
            if stacked_on or unstacked:
5973
5670
                return
5974
5671
            else:
5975
 
                raise errors.BzrCommandError(gettext('No target configuration '
5976
 
                    'specified'))
5977
 
        reconfiguration = None
5978
 
        if tree_type == 'branch':
 
5672
                raise errors.BzrCommandError('No target configuration '
 
5673
                    'specified')
 
5674
        elif target_type == 'branch':
5979
5675
            reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5980
 
        elif tree_type == 'tree':
 
5676
        elif target_type == 'tree':
5981
5677
            reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5982
 
        elif tree_type == 'checkout':
 
5678
        elif target_type == 'checkout':
5983
5679
            reconfiguration = reconfigure.Reconfigure.to_checkout(
5984
5680
                directory, bind_to)
5985
 
        elif tree_type == 'lightweight-checkout':
 
5681
        elif target_type == 'lightweight-checkout':
5986
5682
            reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5987
5683
                directory, bind_to)
5988
 
        if reconfiguration:
5989
 
            reconfiguration.apply(force)
5990
 
            reconfiguration = None
5991
 
        if repository_type == 'use-shared':
 
5684
        elif target_type == 'use-shared':
5992
5685
            reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5993
 
        elif repository_type == 'standalone':
 
5686
        elif target_type == 'standalone':
5994
5687
            reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5995
 
        if reconfiguration:
5996
 
            reconfiguration.apply(force)
5997
 
            reconfiguration = None
5998
 
        if repository_trees == 'with-trees':
 
5688
        elif target_type == 'with-trees':
5999
5689
            reconfiguration = reconfigure.Reconfigure.set_repository_trees(
6000
5690
                directory, True)
6001
 
        elif repository_trees == 'with-no-trees':
 
5691
        elif target_type == 'with-no-trees':
6002
5692
            reconfiguration = reconfigure.Reconfigure.set_repository_trees(
6003
5693
                directory, False)
6004
 
        if reconfiguration:
6005
 
            reconfiguration.apply(force)
6006
 
            reconfiguration = None
 
5694
        reconfiguration.apply(force)
6007
5695
 
6008
5696
 
6009
5697
class cmd_switch(Command):
6044
5732
        from bzrlib import switch
6045
5733
        tree_location = directory
6046
5734
        revision = _get_one_revision('switch', revision)
6047
 
        control_dir = controldir.ControlDir.open_containing(tree_location)[0]
 
5735
        control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
6048
5736
        if to_location is None:
6049
5737
            if revision is None:
6050
 
                raise errors.BzrCommandError(gettext('You must supply either a'
6051
 
                                             ' revision or a location'))
 
5738
                raise errors.BzrCommandError('You must supply either a'
 
5739
                                             ' revision or a location')
6052
5740
            to_location = tree_location
6053
5741
        try:
6054
5742
            branch = control_dir.open_branch()
6058
5746
            had_explicit_nick = False
6059
5747
        if create_branch:
6060
5748
            if branch is None:
6061
 
                raise errors.BzrCommandError(gettext('cannot create branch without'
6062
 
                                             ' source branch'))
 
5749
                raise errors.BzrCommandError('cannot create branch without'
 
5750
                                             ' source branch')
6063
5751
            to_location = directory_service.directories.dereference(
6064
5752
                              to_location)
6065
5753
            if '/' not in to_location and '\\' not in to_location:
6082
5770
        if had_explicit_nick:
6083
5771
            branch = control_dir.open_branch() #get the new branch!
6084
5772
            branch.nick = to_branch.nick
6085
 
        note(gettext('Switched to branch: %s'),
 
5773
        note('Switched to branch: %s',
6086
5774
            urlutils.unescape_for_display(to_branch.base, 'utf-8'))
6087
5775
 
6088
5776
    def _get_branch_location(self, control_dir):
6197
5885
            name = current_view
6198
5886
        if delete:
6199
5887
            if file_list:
6200
 
                raise errors.BzrCommandError(gettext(
6201
 
                    "Both --delete and a file list specified"))
 
5888
                raise errors.BzrCommandError(
 
5889
                    "Both --delete and a file list specified")
6202
5890
            elif switch:
6203
 
                raise errors.BzrCommandError(gettext(
6204
 
                    "Both --delete and --switch specified"))
 
5891
                raise errors.BzrCommandError(
 
5892
                    "Both --delete and --switch specified")
6205
5893
            elif all:
6206
5894
                tree.views.set_view_info(None, {})
6207
 
                self.outf.write(gettext("Deleted all views.\n"))
 
5895
                self.outf.write("Deleted all views.\n")
6208
5896
            elif name is None:
6209
 
                raise errors.BzrCommandError(gettext("No current view to delete"))
 
5897
                raise errors.BzrCommandError("No current view to delete")
6210
5898
            else:
6211
5899
                tree.views.delete_view(name)
6212
 
                self.outf.write(gettext("Deleted '%s' view.\n") % name)
 
5900
                self.outf.write("Deleted '%s' view.\n" % name)
6213
5901
        elif switch:
6214
5902
            if file_list:
6215
 
                raise errors.BzrCommandError(gettext(
6216
 
                    "Both --switch and a file list specified"))
 
5903
                raise errors.BzrCommandError(
 
5904
                    "Both --switch and a file list specified")
6217
5905
            elif all:
6218
 
                raise errors.BzrCommandError(gettext(
6219
 
                    "Both --switch and --all specified"))
 
5906
                raise errors.BzrCommandError(
 
5907
                    "Both --switch and --all specified")
6220
5908
            elif switch == 'off':
6221
5909
                if current_view is None:
6222
 
                    raise errors.BzrCommandError(gettext("No current view to disable"))
 
5910
                    raise errors.BzrCommandError("No current view to disable")
6223
5911
                tree.views.set_view_info(None, view_dict)
6224
 
                self.outf.write(gettext("Disabled '%s' view.\n") % (current_view))
 
5912
                self.outf.write("Disabled '%s' view.\n" % (current_view))
6225
5913
            else:
6226
5914
                tree.views.set_view_info(switch, view_dict)
6227
5915
                view_str = views.view_display_str(tree.views.lookup_view())
6228
 
                self.outf.write(gettext("Using '{0}' view: {1}\n").format(switch, view_str))
 
5916
                self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
6229
5917
        elif all:
6230
5918
            if view_dict:
6231
 
                self.outf.write(gettext('Views defined:\n'))
 
5919
                self.outf.write('Views defined:\n')
6232
5920
                for view in sorted(view_dict):
6233
5921
                    if view == current_view:
6234
5922
                        active = "=>"
6237
5925
                    view_str = views.view_display_str(view_dict[view])
6238
5926
                    self.outf.write('%s %-20s %s\n' % (active, view, view_str))
6239
5927
            else:
6240
 
                self.outf.write(gettext('No views defined.\n'))
 
5928
                self.outf.write('No views defined.\n')
6241
5929
        elif file_list:
6242
5930
            if name is None:
6243
5931
                # No name given and no current view set
6244
5932
                name = 'my'
6245
5933
            elif name == 'off':
6246
 
                raise errors.BzrCommandError(gettext(
6247
 
                    "Cannot change the 'off' pseudo view"))
 
5934
                raise errors.BzrCommandError(
 
5935
                    "Cannot change the 'off' pseudo view")
6248
5936
            tree.views.set_view(name, sorted(file_list))
6249
5937
            view_str = views.view_display_str(tree.views.lookup_view())
6250
 
            self.outf.write(gettext("Using '{0}' view: {1}\n").format(name, view_str))
 
5938
            self.outf.write("Using '%s' view: %s\n" % (name, view_str))
6251
5939
        else:
6252
5940
            # list the files
6253
5941
            if name is None:
6254
5942
                # No name given and no current view set
6255
 
                self.outf.write(gettext('No current view.\n'))
 
5943
                self.outf.write('No current view.\n')
6256
5944
            else:
6257
5945
                view_str = views.view_display_str(tree.views.lookup_view(name))
6258
 
                self.outf.write(gettext("'{0}' view is: {1}\n").format(name, view_str))
 
5946
                self.outf.write("'%s' view is: %s\n" % (name, view_str))
6259
5947
 
6260
5948
 
6261
5949
class cmd_hooks(Command):
6275
5963
                        self.outf.write("    %s\n" %
6276
5964
                                        (some_hooks.get_hook_name(hook),))
6277
5965
                else:
6278
 
                    self.outf.write(gettext("    <no hooks installed>\n"))
 
5966
                    self.outf.write("    <no hooks installed>\n")
6279
5967
 
6280
5968
 
6281
5969
class cmd_remove_branch(Command):
6382
6070
        manager = tree.get_shelf_manager()
6383
6071
        shelves = manager.active_shelves()
6384
6072
        if len(shelves) == 0:
6385
 
            note(gettext('No shelved changes.'))
 
6073
            note('No shelved changes.')
6386
6074
            return 0
6387
6075
        for shelf_id in reversed(shelves):
6388
6076
            message = manager.get_metadata(shelf_id).get('message')
6477
6165
        if path is not None:
6478
6166
            branchdir = path
6479
6167
        tree, branch, relpath =(
6480
 
            controldir.ControlDir.open_containing_tree_or_branch(branchdir))
 
6168
            bzrdir.BzrDir.open_containing_tree_or_branch(branchdir))
6481
6169
        if path is not None:
6482
6170
            path = relpath
6483
6171
        if tree is None:
6511
6199
    __doc__ = """Export command helps and error messages in po format."""
6512
6200
 
6513
6201
    hidden = True
6514
 
    takes_options = [Option('plugin', 
6515
 
                            help='Export help text from named command '\
6516
 
                                 '(defaults to all built in commands).',
6517
 
                            type=str)]
6518
6202
 
6519
 
    def run(self, plugin=None):
 
6203
    def run(self):
6520
6204
        from bzrlib.export_pot import export_pot
6521
 
        export_pot(self.outf, plugin)
 
6205
        export_pot(self.outf)
6522
6206
 
6523
6207
 
6524
6208
def _register_lazy_builtins():
6531
6215
        ('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6532
6216
        ('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6533
6217
        ('cmd_conflicts', [], 'bzrlib.conflicts'),
6534
 
        ('cmd_sign_my_commits', [], 'bzrlib.commit_signature_commands'),
6535
 
        ('cmd_verify_signatures', [],
6536
 
                                        'bzrlib.commit_signature_commands'),
 
6218
        ('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6537
6219
        ('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6538
6220
        ]:
6539
6221
        builtin_command_registry.register_lazy(name, aliases, module_name)