~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Robert Collins
  • Date: 2010-05-11 08:36:16 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100511083616-b8fjb19zomwupid0
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
20
20
 
21
21
from bzrlib.lazy_import import lazy_import
22
22
lazy_import(globals(), """
 
23
import codecs
23
24
import cStringIO
24
25
import sys
25
26
import time
32
33
    bzrdir,
33
34
    directory_service,
34
35
    delta,
35
 
    config as _mod_config,
 
36
    config,
36
37
    errors,
37
38
    globbing,
38
39
    hooks,
44
45
    rename_map,
45
46
    revision as _mod_revision,
46
47
    static_tuple,
 
48
    symbol_versioning,
47
49
    timestamp,
48
50
    transport,
49
51
    ui,
50
52
    urlutils,
51
53
    views,
52
 
    gpg,
53
54
    )
54
55
from bzrlib.branch import Branch
55
56
from bzrlib.conflicts import ConflictList
72
73
    _parse_revision_str,
73
74
    )
74
75
from bzrlib.trace import mutter, note, warning, is_quiet, get_verbosity_level
75
 
from bzrlib import (
76
 
    symbol_versioning,
77
 
    )
78
 
 
79
 
 
80
 
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
 
76
 
 
77
 
81
78
def tree_files(file_list, default_branch=u'.', canonicalize=True,
82
79
    apply_view=True):
83
 
    return internal_tree_files(file_list, default_branch, canonicalize,
84
 
        apply_view)
 
80
    try:
 
81
        return internal_tree_files(file_list, default_branch, canonicalize,
 
82
            apply_view)
 
83
    except errors.FileInWrongBranch, e:
 
84
        raise errors.BzrCommandError("%s is not in the same branch as %s" %
 
85
                                     (e.path, file_list[0]))
85
86
 
86
87
 
87
88
def tree_files_for_add(file_list):
151
152
 
152
153
# XXX: Bad function name; should possibly also be a class method of
153
154
# WorkingTree rather than a function.
154
 
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
155
155
def internal_tree_files(file_list, default_branch=u'.', canonicalize=True,
156
156
    apply_view=True):
157
157
    """Convert command-line paths to a WorkingTree and relative paths.
158
158
 
159
 
    Deprecated: use WorkingTree.open_containing_paths instead.
160
 
 
161
159
    This is typically used for command-line processors that take one or
162
160
    more filenames, and infer the workingtree that contains them.
163
161
 
173
171
 
174
172
    :return: workingtree, [relative_paths]
175
173
    """
176
 
    return WorkingTree.open_containing_paths(
177
 
        file_list, default_directory='.',
178
 
        canonicalize=True,
179
 
        apply_view=True)
 
174
    if file_list is None or len(file_list) == 0:
 
175
        tree = WorkingTree.open_containing(default_branch)[0]
 
176
        if tree.supports_views() and apply_view:
 
177
            view_files = tree.views.lookup_view()
 
178
            if view_files:
 
179
                file_list = view_files
 
180
                view_str = views.view_display_str(view_files)
 
181
                note("Ignoring files outside view. View is %s" % view_str)
 
182
        return tree, file_list
 
183
    tree = WorkingTree.open_containing(osutils.realpath(file_list[0]))[0]
 
184
    return tree, safe_relpath_files(tree, file_list, canonicalize,
 
185
        apply_view=apply_view)
 
186
 
 
187
 
 
188
def safe_relpath_files(tree, file_list, canonicalize=True, apply_view=True):
 
189
    """Convert file_list into a list of relpaths in tree.
 
190
 
 
191
    :param tree: A tree to operate on.
 
192
    :param file_list: A list of user provided paths or None.
 
193
    :param apply_view: if True and a view is set, apply it or check that
 
194
        specified files are within it
 
195
    :return: A list of relative paths.
 
196
    :raises errors.PathNotChild: When a provided path is in a different tree
 
197
        than tree.
 
198
    """
 
199
    if file_list is None:
 
200
        return None
 
201
    if tree.supports_views() and apply_view:
 
202
        view_files = tree.views.lookup_view()
 
203
    else:
 
204
        view_files = []
 
205
    new_list = []
 
206
    # tree.relpath exists as a "thunk" to osutils, but canonical_relpath
 
207
    # doesn't - fix that up here before we enter the loop.
 
208
    if canonicalize:
 
209
        fixer = lambda p: osutils.canonical_relpath(tree.basedir, p)
 
210
    else:
 
211
        fixer = tree.relpath
 
212
    for filename in file_list:
 
213
        try:
 
214
            relpath = fixer(osutils.dereference_path(filename))
 
215
            if  view_files and not osutils.is_inside_any(view_files, relpath):
 
216
                raise errors.FileOutsideView(filename, view_files)
 
217
            new_list.append(relpath)
 
218
        except errors.PathNotChild:
 
219
            raise errors.FileInWrongBranch(tree.branch, filename)
 
220
    return new_list
180
221
 
181
222
 
182
223
def _get_view_info_for_change_reporter(tree):
191
232
    return view_info
192
233
 
193
234
 
194
 
def _open_directory_or_containing_tree_or_branch(filename, directory):
195
 
    """Open the tree or branch containing the specified file, unless
196
 
    the --directory option is used to specify a different branch."""
197
 
    if directory is not None:
198
 
        return (None, Branch.open(directory), filename)
199
 
    return bzrdir.BzrDir.open_containing_tree_or_branch(filename)
200
 
 
201
 
 
202
235
# TODO: Make sure no commands unconditionally use the working directory as a
203
236
# branch.  If a filename argument is used, the first of them should be used to
204
237
# specify the branch.  (Perhaps this can be factored out into some kind of
253
286
    To skip the display of pending merge information altogether, use
254
287
    the no-pending option or specify a file/directory.
255
288
 
256
 
    To compare the working directory to a specific revision, pass a
257
 
    single revision to the revision argument.
258
 
 
259
 
    To see which files have changed in a specific revision, or between
260
 
    two revisions, pass a revision range to the revision argument.
261
 
    This will produce the same results as calling 'bzr diff --summarize'.
 
289
    If a revision argument is given, the status is calculated against
 
290
    that revision, or between two revisions if two are provided.
262
291
    """
263
292
 
264
293
    # TODO: --no-recurse, --recurse options
286
315
            raise errors.BzrCommandError('bzr status --revision takes exactly'
287
316
                                         ' one or two revision specifiers')
288
317
 
289
 
        tree, relfile_list = WorkingTree.open_containing_paths(file_list)
 
318
        tree, relfile_list = tree_files(file_list)
290
319
        # Avoid asking for specific files when that is not needed.
291
320
        if relfile_list == ['']:
292
321
            relfile_list = None
311
340
 
312
341
    hidden = True
313
342
    takes_args = ['revision_id?']
314
 
    takes_options = ['directory', 'revision']
 
343
    takes_options = ['revision']
315
344
    # cat-revision is more for frontends so should be exact
316
345
    encoding = 'strict'
317
346
 
324
353
        self.outf.write(revtext.decode('utf-8'))
325
354
 
326
355
    @display_command
327
 
    def run(self, revision_id=None, revision=None, directory=u'.'):
 
356
    def run(self, revision_id=None, revision=None):
328
357
        if revision_id is not None and revision is not None:
329
358
            raise errors.BzrCommandError('You can only supply one of'
330
359
                                         ' revision_id or --revision')
331
360
        if revision_id is None and revision is None:
332
361
            raise errors.BzrCommandError('You must supply either'
333
362
                                         ' --revision or a revision_id')
334
 
 
335
 
        b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
 
363
        b = WorkingTree.open_containing(u'.')[0].branch
336
364
 
337
365
        revisions = b.repository.revisions
338
366
        if revisions is None:
416
444
                self.outf.write(page_bytes[:header_end])
417
445
                page_bytes = data
418
446
            self.outf.write('\nPage %d\n' % (page_idx,))
419
 
            if len(page_bytes) == 0:
420
 
                self.outf.write('(empty)\n');
421
 
            else:
422
 
                decomp_bytes = zlib.decompress(page_bytes)
423
 
                self.outf.write(decomp_bytes)
424
 
                self.outf.write('\n')
 
447
            decomp_bytes = zlib.decompress(page_bytes)
 
448
            self.outf.write(decomp_bytes)
 
449
            self.outf.write('\n')
425
450
 
426
451
    def _dump_entries(self, trans, basename):
427
452
        try:
458
483
    takes_options = [
459
484
        Option('force',
460
485
               help='Remove the working tree even if it has '
461
 
                    'uncommitted or shelved changes.'),
 
486
                    'uncommitted changes.'),
462
487
        ]
463
488
 
464
489
    def run(self, location_list, force=False):
478
503
            if not force:
479
504
                if (working.has_changes()):
480
505
                    raise errors.UncommittedChanges(working)
481
 
                if working.get_shelf_manager().last_shelf() is not None:
482
 
                    raise errors.ShelvedChanges(working)
483
506
 
484
507
            if working.user_url != working.branch.user_url:
485
508
                raise errors.BzrCommandError("You cannot remove the working tree"
488
511
            d.destroy_workingtree()
489
512
 
490
513
 
491
 
class cmd_repair_workingtree(Command):
492
 
    __doc__ = """Reset the working tree state file.
493
 
 
494
 
    This is not meant to be used normally, but more as a way to recover from
495
 
    filesystem corruption, etc. This rebuilds the working inventory back to a
496
 
    'known good' state. Any new modifications (adding a file, renaming, etc)
497
 
    will be lost, though modified files will still be detected as such.
498
 
 
499
 
    Most users will want something more like "bzr revert" or "bzr update"
500
 
    unless the state file has become corrupted.
501
 
 
502
 
    By default this attempts to recover the current state by looking at the
503
 
    headers of the state file. If the state file is too corrupted to even do
504
 
    that, you can supply --revision to force the state of the tree.
505
 
    """
506
 
 
507
 
    takes_options = ['revision', 'directory',
508
 
        Option('force',
509
 
               help='Reset the tree even if it doesn\'t appear to be'
510
 
                    ' corrupted.'),
511
 
    ]
512
 
    hidden = True
513
 
 
514
 
    def run(self, revision=None, directory='.', force=False):
515
 
        tree, _ = WorkingTree.open_containing(directory)
516
 
        self.add_cleanup(tree.lock_tree_write().unlock)
517
 
        if not force:
518
 
            try:
519
 
                tree.check_state()
520
 
            except errors.BzrError:
521
 
                pass # There seems to be a real error here, so we'll reset
522
 
            else:
523
 
                # Refuse
524
 
                raise errors.BzrCommandError(
525
 
                    'The tree does not appear to be corrupt. You probably'
526
 
                    ' want "bzr revert" instead. Use "--force" if you are'
527
 
                    ' sure you want to reset the working tree.')
528
 
        if revision is None:
529
 
            revision_ids = None
530
 
        else:
531
 
            revision_ids = [r.as_revision_id(tree.branch) for r in revision]
532
 
        try:
533
 
            tree.reset_state(revision_ids)
534
 
        except errors.BzrError, e:
535
 
            if revision_ids is None:
536
 
                extra = (', the header appears corrupt, try passing -r -1'
537
 
                         ' to set the state to the last commit')
538
 
            else:
539
 
                extra = ''
540
 
            raise errors.BzrCommandError('failed to reset the tree state'
541
 
                                         + extra)
542
 
 
543
 
 
544
514
class cmd_revno(Command):
545
515
    __doc__ = """Show current revision number.
546
516
 
582
552
    takes_args = ['revision_info*']
583
553
    takes_options = [
584
554
        'revision',
585
 
        custom_help('directory',
 
555
        Option('directory',
586
556
            help='Branch to examine, '
587
 
                 'rather than the one containing the working directory.'),
 
557
                 'rather than the one containing the working directory.',
 
558
            short_name='d',
 
559
            type=unicode,
 
560
            ),
588
561
        Option('tree', help='Show revno of working tree'),
589
562
        ]
590
563
 
781
754
            raise errors.BzrCommandError('invalid kind %r specified' % (kind,))
782
755
 
783
756
        revision = _get_one_revision('inventory', revision)
784
 
        work_tree, file_list = WorkingTree.open_containing_paths(file_list)
 
757
        work_tree, file_list = tree_files(file_list)
785
758
        self.add_cleanup(work_tree.lock_read().unlock)
786
759
        if revision is not None:
787
760
            tree = revision.as_tree(work_tree.branch)
797
770
                                      require_versioned=True)
798
771
            # find_ids_across_trees may include some paths that don't
799
772
            # exist in 'tree'.
800
 
            entries = sorted(
801
 
                (tree.id2path(file_id), tree.inventory[file_id])
802
 
                for file_id in file_ids if tree.has_id(file_id))
 
773
            entries = sorted((tree.id2path(file_id), tree.inventory[file_id])
 
774
                             for file_id in file_ids if file_id in tree)
803
775
        else:
804
776
            entries = tree.inventory.entries()
805
777
 
853
825
            names_list = []
854
826
        if len(names_list) < 2:
855
827
            raise errors.BzrCommandError("missing file argument")
856
 
        tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
 
828
        tree, rel_names = tree_files(names_list, canonicalize=False)
857
829
        self.add_cleanup(tree.lock_tree_write().unlock)
858
830
        self._run(tree, names_list, rel_names, after)
859
831
 
864
836
        if after:
865
837
            raise errors.BzrCommandError('--after cannot be specified with'
866
838
                                         ' --auto.')
867
 
        work_tree, file_list = WorkingTree.open_containing_paths(
868
 
            names_list, default_directory='.')
 
839
        work_tree, file_list = tree_files(names_list, default_branch='.')
869
840
        self.add_cleanup(work_tree.lock_tree_write().unlock)
870
841
        rename_map.RenameMap.guess_renames(work_tree, dry_run)
871
842
 
966
937
    match the remote one, use pull --overwrite. This will work even if the two
967
938
    branches have diverged.
968
939
 
969
 
    If there is no default location set, the first pull will set it (use
970
 
    --no-remember to avoid settting it). After that, you can omit the
971
 
    location to use the default.  To change the default, use --remember. The
972
 
    value will only be saved if the remote location can be accessed.
 
940
    If there is no default location set, the first pull will set it.  After
 
941
    that, you can omit the location to use the default.  To change the
 
942
    default, use --remember. The value will only be saved if the remote
 
943
    location can be accessed.
973
944
 
974
945
    Note: The location can be specified either in the form of a branch,
975
946
    or in the form of a path to a file containing a merge directive generated
980
951
    takes_options = ['remember', 'overwrite', 'revision',
981
952
        custom_help('verbose',
982
953
            help='Show logs of pulled revisions.'),
983
 
        custom_help('directory',
 
954
        Option('directory',
984
955
            help='Branch to pull into, '
985
 
                 'rather than the one containing the working directory.'),
 
956
                 'rather than the one containing the working directory.',
 
957
            short_name='d',
 
958
            type=unicode,
 
959
            ),
986
960
        Option('local',
987
961
            help="Perform a local pull in a bound "
988
962
                 "branch.  Local pulls are not applied to "
989
963
                 "the master branch."
990
964
            ),
991
 
        Option('show-base',
992
 
            help="Show base revision text in conflicts.")
993
965
        ]
994
966
    takes_args = ['location?']
995
967
    encoding_type = 'replace'
996
968
 
997
 
    def run(self, location=None, remember=None, overwrite=False,
 
969
    def run(self, location=None, remember=False, overwrite=False,
998
970
            revision=None, verbose=False,
999
 
            directory=None, local=False,
1000
 
            show_base=False):
 
971
            directory=None, local=False):
1001
972
        # FIXME: too much stuff is in the command class
1002
973
        revision_id = None
1003
974
        mergeable = None
1012
983
            branch_to = Branch.open_containing(directory)[0]
1013
984
            self.add_cleanup(branch_to.lock_write().unlock)
1014
985
 
1015
 
        if tree_to is None and show_base:
1016
 
            raise errors.BzrCommandError("Need working tree for --show-base.")
1017
 
 
1018
986
        if local and not branch_to.get_bound_location():
1019
987
            raise errors.LocalRequiresBoundBranch()
1020
988
 
1051
1019
            branch_from = Branch.open(location,
1052
1020
                possible_transports=possible_transports)
1053
1021
            self.add_cleanup(branch_from.lock_read().unlock)
1054
 
            # Remembers if asked explicitly or no previous location is set
1055
 
            if (remember
1056
 
                or (remember is None and branch_to.get_parent() is None)):
 
1022
 
 
1023
            if branch_to.get_parent() is None or remember:
1057
1024
                branch_to.set_parent(branch_from.base)
1058
1025
 
1059
1026
        if revision is not None:
1066
1033
                view_info=view_info)
1067
1034
            result = tree_to.pull(
1068
1035
                branch_from, overwrite, revision_id, change_reporter,
1069
 
                possible_transports=possible_transports, local=local,
1070
 
                show_base=show_base)
 
1036
                possible_transports=possible_transports, local=local)
1071
1037
        else:
1072
1038
            result = branch_to.pull(
1073
1039
                branch_from, overwrite, revision_id, local=local)
1077
1043
            log.show_branch_change(
1078
1044
                branch_to, self.outf, result.old_revno,
1079
1045
                result.old_revid)
1080
 
        if getattr(result, 'tag_conflicts', None):
1081
 
            return 1
1082
 
        else:
1083
 
            return 0
1084
1046
 
1085
1047
 
1086
1048
class cmd_push(Command):
1103
1065
    do a merge (see bzr help merge) from the other branch, and commit that.
1104
1066
    After that you will be able to do a push without '--overwrite'.
1105
1067
 
1106
 
    If there is no default push location set, the first push will set it (use
1107
 
    --no-remember to avoid settting it).  After that, you can omit the
1108
 
    location to use the default.  To change the default, use --remember. The
1109
 
    value will only be saved if the remote location can be accessed.
 
1068
    If there is no default push location set, the first push will set it.
 
1069
    After that, you can omit the location to use the default.  To change the
 
1070
    default, use --remember. The value will only be saved if the remote
 
1071
    location can be accessed.
1110
1072
    """
1111
1073
 
1112
1074
    _see_also = ['pull', 'update', 'working-trees']
1114
1076
        Option('create-prefix',
1115
1077
               help='Create the path leading up to the branch '
1116
1078
                    'if it does not already exist.'),
1117
 
        custom_help('directory',
 
1079
        Option('directory',
1118
1080
            help='Branch to push from, '
1119
 
                 'rather than the one containing the working directory.'),
 
1081
                 'rather than the one containing the working directory.',
 
1082
            short_name='d',
 
1083
            type=unicode,
 
1084
            ),
1120
1085
        Option('use-existing-dir',
1121
1086
               help='By default push will fail if the target'
1122
1087
                    ' directory exists, but does not already'
1133
1098
        Option('strict',
1134
1099
               help='Refuse to push if there are uncommitted changes in'
1135
1100
               ' the working tree, --no-strict disables the check.'),
1136
 
        Option('no-tree',
1137
 
               help="Don't populate the working tree, even for protocols"
1138
 
               " that support it."),
1139
1101
        ]
1140
1102
    takes_args = ['location?']
1141
1103
    encoding_type = 'replace'
1142
1104
 
1143
 
    def run(self, location=None, remember=None, overwrite=False,
 
1105
    def run(self, location=None, remember=False, overwrite=False,
1144
1106
        create_prefix=False, verbose=False, revision=None,
1145
1107
        use_existing_dir=False, directory=None, stacked_on=None,
1146
 
        stacked=False, strict=None, no_tree=False):
 
1108
        stacked=False, strict=None):
1147
1109
        from bzrlib.push import _show_push_branch
1148
1110
 
1149
1111
        if directory is None:
1195
1157
        _show_push_branch(br_from, revision_id, location, self.outf,
1196
1158
            verbose=verbose, overwrite=overwrite, remember=remember,
1197
1159
            stacked_on=stacked_on, create_prefix=create_prefix,
1198
 
            use_existing_dir=use_existing_dir, no_tree=no_tree)
 
1160
            use_existing_dir=use_existing_dir)
1199
1161
 
1200
1162
 
1201
1163
class cmd_branch(Command):
1210
1172
 
1211
1173
    To retrieve the branch as of a particular revision, supply the --revision
1212
1174
    parameter, as in "branch foo/bar -r 5".
1213
 
 
1214
 
    The synonyms 'clone' and 'get' for this command are deprecated.
1215
1175
    """
1216
1176
 
1217
1177
    _see_also = ['checkout']
1218
1178
    takes_args = ['from_location', 'to_location?']
1219
 
    takes_options = ['revision',
1220
 
        Option('hardlink', help='Hard-link working tree files where possible.'),
1221
 
        Option('files-from', type=str,
1222
 
               help="Get file contents from this tree."),
 
1179
    takes_options = ['revision', Option('hardlink',
 
1180
        help='Hard-link working tree files where possible.'),
1223
1181
        Option('no-tree',
1224
1182
            help="Create a branch without a working-tree."),
1225
1183
        Option('switch',
1243
1201
 
1244
1202
    def run(self, from_location, to_location=None, revision=None,
1245
1203
            hardlink=False, stacked=False, standalone=False, no_tree=False,
1246
 
            use_existing_dir=False, switch=False, bind=False,
1247
 
            files_from=None):
 
1204
            use_existing_dir=False, switch=False, bind=False):
1248
1205
        from bzrlib import switch as _mod_switch
1249
1206
        from bzrlib.tag import _merge_tags_if_possible
1250
 
        if self.invoked_as in ['get', 'clone']:
1251
 
            ui.ui_factory.show_user_warning(
1252
 
                'deprecated_command',
1253
 
                deprecated_name=self.invoked_as,
1254
 
                recommended_name='branch',
1255
 
                deprecated_in_version='2.4')
1256
1207
        accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1257
1208
            from_location)
1258
 
        if not (hardlink or files_from):
1259
 
            # accelerator_tree is usually slower because you have to read N
1260
 
            # files (no readahead, lots of seeks, etc), but allow the user to
1261
 
            # explicitly request it
1262
 
            accelerator_tree = None
1263
 
        if files_from is not None and files_from != from_location:
1264
 
            accelerator_tree = WorkingTree.open(files_from)
1265
1209
        revision = _get_one_revision('branch', revision)
1266
1210
        self.add_cleanup(br_from.lock_read().unlock)
1267
1211
        if revision is not None:
1374
1318
            to_location = branch_location
1375
1319
        accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch(
1376
1320
            branch_location)
1377
 
        if not (hardlink or files_from):
1378
 
            # accelerator_tree is usually slower because you have to read N
1379
 
            # files (no readahead, lots of seeks, etc), but allow the user to
1380
 
            # explicitly request it
1381
 
            accelerator_tree = None
1382
1321
        revision = _get_one_revision('checkout', revision)
1383
 
        if files_from is not None and files_from != branch_location:
 
1322
        if files_from is not None:
1384
1323
            accelerator_tree = WorkingTree.open(files_from)
1385
1324
        if revision is not None:
1386
1325
            revision_id = revision.as_revision_id(source)
1442
1381
    If you want to discard your local changes, you can just do a
1443
1382
    'bzr revert' instead of 'bzr commit' after the update.
1444
1383
 
1445
 
    If you want to restore a file that has been removed locally, use
1446
 
    'bzr revert' instead of 'bzr update'.
1447
 
 
1448
1384
    If the tree's branch is bound to a master branch, it will also update
1449
1385
    the branch from the master.
1450
1386
    """
1451
1387
 
1452
1388
    _see_also = ['pull', 'working-trees', 'status-flags']
1453
1389
    takes_args = ['dir?']
1454
 
    takes_options = ['revision',
1455
 
                     Option('show-base',
1456
 
                            help="Show base revision text in conflicts."),
1457
 
                     ]
 
1390
    takes_options = ['revision']
1458
1391
    aliases = ['up']
1459
1392
 
1460
 
    def run(self, dir='.', revision=None, show_base=None):
 
1393
    def run(self, dir='.', revision=None):
1461
1394
        if revision is not None and len(revision) != 1:
1462
1395
            raise errors.BzrCommandError(
1463
1396
                        "bzr update --revision takes exactly one revision")
1503
1436
                change_reporter,
1504
1437
                possible_transports=possible_transports,
1505
1438
                revision=revision_id,
1506
 
                old_tip=old_tip,
1507
 
                show_base=show_base)
 
1439
                old_tip=old_tip)
1508
1440
        except errors.NoSuchRevision, e:
1509
1441
            raise errors.BzrCommandError(
1510
1442
                                  "branch has no revision %s\n"
1572
1504
class cmd_remove(Command):
1573
1505
    __doc__ = """Remove files or directories.
1574
1506
 
1575
 
    This makes Bazaar stop tracking changes to the specified files. Bazaar will
1576
 
    delete them if they can easily be recovered using revert otherwise they
1577
 
    will be backed up (adding an extention of the form .~#~). If no options or
1578
 
    parameters are given Bazaar will scan for files that are being tracked by
1579
 
    Bazaar but missing in your tree and stop tracking them for you.
 
1507
    This makes bzr stop tracking changes to the specified files. bzr will delete
 
1508
    them if they can easily be recovered using revert. If no options or
 
1509
    parameters are given bzr will scan for files that are being tracked by bzr
 
1510
    but missing in your tree and stop tracking them for you.
1580
1511
    """
1581
1512
    takes_args = ['file*']
1582
1513
    takes_options = ['verbose',
1584
1515
        RegistryOption.from_kwargs('file-deletion-strategy',
1585
1516
            'The file deletion mode to be used.',
1586
1517
            title='Deletion Strategy', value_switches=True, enum_switch=False,
1587
 
            safe='Backup changed files (default).',
 
1518
            safe='Only delete files if they can be'
 
1519
                 ' safely recovered (default).',
1588
1520
            keep='Delete from bzr but leave the working copy.',
1589
 
            no_backup='Don\'t backup changed files.',
1590
1521
            force='Delete all the specified files, even if they can not be '
1591
 
                'recovered and even if they are non-empty directories. '
1592
 
                '(deprecated, use no-backup)')]
 
1522
                'recovered and even if they are non-empty directories.')]
1593
1523
    aliases = ['rm', 'del']
1594
1524
    encoding_type = 'replace'
1595
1525
 
1596
1526
    def run(self, file_list, verbose=False, new=False,
1597
1527
        file_deletion_strategy='safe'):
1598
 
        if file_deletion_strategy == 'force':
1599
 
            note("(The --force option is deprecated, rather use --no-backup "
1600
 
                "in future.)")
1601
 
            file_deletion_strategy = 'no-backup'
1602
 
 
1603
 
        tree, file_list = WorkingTree.open_containing_paths(file_list)
 
1528
        tree, file_list = tree_files(file_list)
1604
1529
 
1605
1530
        if file_list is not None:
1606
1531
            file_list = [f for f in file_list]
1626
1551
            file_deletion_strategy = 'keep'
1627
1552
        tree.remove(file_list, verbose=verbose, to_file=self.outf,
1628
1553
            keep_files=file_deletion_strategy=='keep',
1629
 
            force=(file_deletion_strategy=='no-backup'))
 
1554
            force=file_deletion_strategy=='force')
1630
1555
 
1631
1556
 
1632
1557
class cmd_file_id(Command):
1694
1619
 
1695
1620
    _see_also = ['check']
1696
1621
    takes_args = ['branch?']
1697
 
    takes_options = [
1698
 
        Option('canonicalize-chks',
1699
 
               help='Make sure CHKs are in canonical form (repairs '
1700
 
                    'bug 522637).',
1701
 
               hidden=True),
1702
 
        ]
1703
1622
 
1704
 
    def run(self, branch=".", canonicalize_chks=False):
 
1623
    def run(self, branch="."):
1705
1624
        from bzrlib.reconcile import reconcile
1706
1625
        dir = bzrdir.BzrDir.open(branch)
1707
 
        reconcile(dir, canonicalize_chks=canonicalize_chks)
 
1626
        reconcile(dir)
1708
1627
 
1709
1628
 
1710
1629
class cmd_revision_history(Command):
1742
1661
            b = wt.branch
1743
1662
            last_revision = wt.last_revision()
1744
1663
 
1745
 
        self.add_cleanup(b.repository.lock_read().unlock)
1746
 
        graph = b.repository.get_graph()
1747
 
        revisions = [revid for revid, parents in
1748
 
            graph.iter_ancestry([last_revision])]
1749
 
        for revision_id in reversed(revisions):
1750
 
            if _mod_revision.is_null(revision_id):
1751
 
                continue
 
1664
        revision_ids = b.repository.get_ancestry(last_revision)
 
1665
        revision_ids.pop(0)
 
1666
        for revision_id in revision_ids:
1752
1667
            self.outf.write(revision_id + '\n')
1753
1668
 
1754
1669
 
1791
1706
                ),
1792
1707
         Option('append-revisions-only',
1793
1708
                help='Never change revnos or the existing log.'
1794
 
                '  Append revisions to it only.'),
1795
 
         Option('no-tree',
1796
 
                'Create a branch without a working tree.')
 
1709
                '  Append revisions to it only.')
1797
1710
         ]
1798
1711
    def run(self, location=None, format=None, append_revisions_only=False,
1799
 
            create_prefix=False, no_tree=False):
 
1712
            create_prefix=False):
1800
1713
        if format is None:
1801
1714
            format = bzrdir.format_registry.make_bzrdir('default')
1802
1715
        if location is None:
1825
1738
        except errors.NotBranchError:
1826
1739
            # really a NotBzrDir error...
1827
1740
            create_branch = bzrdir.BzrDir.create_branch_convenience
1828
 
            if no_tree:
1829
 
                force_new_tree = False
1830
 
            else:
1831
 
                force_new_tree = None
1832
1741
            branch = create_branch(to_transport.base, format=format,
1833
 
                                   possible_transports=[to_transport],
1834
 
                                   force_new_tree=force_new_tree)
 
1742
                                   possible_transports=[to_transport])
1835
1743
            a_bzrdir = branch.bzrdir
1836
1744
        else:
1837
1745
            from bzrlib.transport.local import LocalTransport
1841
1749
                        raise errors.BranchExistsWithoutWorkingTree(location)
1842
1750
                raise errors.AlreadyBranchError(location)
1843
1751
            branch = a_bzrdir.create_branch()
1844
 
            if not no_tree:
1845
 
                a_bzrdir.create_workingtree()
 
1752
            a_bzrdir.create_workingtree()
1846
1753
        if append_revisions_only:
1847
1754
            try:
1848
1755
                branch.set_append_revisions_only(True)
1942
1849
    "bzr diff -p1" is equivalent to "bzr diff --prefix old/:new/", and
1943
1850
    produces patches suitable for "patch -p1".
1944
1851
 
1945
 
    Note that when using the -r argument with a range of revisions, the
1946
 
    differences are computed between the two specified revisions.  That
1947
 
    is, the command does not show the changes introduced by the first 
1948
 
    revision in the range.  This differs from the interpretation of 
1949
 
    revision ranges used by "bzr log" which includes the first revision
1950
 
    in the range.
1951
 
 
1952
1852
    :Exit values:
1953
1853
        1 - changed
1954
1854
        2 - unrepresentable changes
1972
1872
 
1973
1873
            bzr diff -r1..3 xxx
1974
1874
 
1975
 
        The changes introduced by revision 2 (equivalent to -r1..2)::
1976
 
 
1977
 
            bzr diff -c2
1978
 
 
1979
 
        To see the changes introduced by revision X::
 
1875
        To see the changes introduced in revision X::
1980
1876
        
1981
1877
            bzr diff -cX
1982
1878
 
1986
1882
 
1987
1883
            bzr diff -r<chosen_parent>..X
1988
1884
 
1989
 
        The changes between the current revision and the previous revision
1990
 
        (equivalent to -c-1 and -r-2..-1)
 
1885
        The changes introduced by revision 2 (equivalent to -r1..2)::
1991
1886
 
1992
 
            bzr diff -r-2..
 
1887
            bzr diff -c2
1993
1888
 
1994
1889
        Show just the differences for file NEWS::
1995
1890
 
2010
1905
        Same as 'bzr diff' but prefix paths with old/ and new/::
2011
1906
 
2012
1907
            bzr diff --prefix old/:new/
2013
 
            
2014
 
        Show the differences using a custom diff program with options::
2015
 
        
2016
 
            bzr diff --using /usr/bin/diff --diff-options -wu
2017
1908
    """
2018
1909
    _see_also = ['status']
2019
1910
    takes_args = ['file*']
2039
1930
            type=unicode,
2040
1931
            ),
2041
1932
        RegistryOption('format',
2042
 
            short_name='F',
2043
1933
            help='Diff format to use.',
2044
1934
            lazy_registry=('bzrlib.diff', 'format_registry'),
2045
 
            title='Diff format'),
 
1935
            value_switches=False, title='Diff format'),
2046
1936
        ]
2047
1937
    aliases = ['di', 'dif']
2048
1938
    encoding_type = 'exact'
2079
1969
         old_branch, new_branch,
2080
1970
         specific_files, extra_trees) = get_trees_and_branches_to_diff_locked(
2081
1971
            file_list, revision, old, new, self.add_cleanup, apply_view=True)
2082
 
        # GNU diff on Windows uses ANSI encoding for filenames
2083
 
        path_encoding = osutils.get_diff_header_encoding()
2084
1972
        return show_diff_trees(old_tree, new_tree, sys.stdout,
2085
1973
                               specific_files=specific_files,
2086
1974
                               external_diff_options=diff_options,
2087
1975
                               old_label=old_label, new_label=new_label,
2088
 
                               extra_trees=extra_trees,
2089
 
                               path_encoding=path_encoding,
2090
 
                               using=using,
 
1976
                               extra_trees=extra_trees, using=using,
2091
1977
                               format_cls=format)
2092
1978
 
2093
1979
 
2101
1987
    # level of effort but possibly much less IO.  (Or possibly not,
2102
1988
    # if the directories are very large...)
2103
1989
    _see_also = ['status', 'ls']
2104
 
    takes_options = ['directory', 'show-ids']
 
1990
    takes_options = ['show-ids']
2105
1991
 
2106
1992
    @display_command
2107
 
    def run(self, show_ids=False, directory=u'.'):
2108
 
        tree = WorkingTree.open_containing(directory)[0]
 
1993
    def run(self, show_ids=False):
 
1994
        tree = WorkingTree.open_containing(u'.')[0]
2109
1995
        self.add_cleanup(tree.lock_read().unlock)
2110
1996
        old = tree.basis_tree()
2111
1997
        self.add_cleanup(old.lock_read().unlock)
2124
2010
 
2125
2011
    hidden = True
2126
2012
    _see_also = ['status', 'ls']
2127
 
    takes_options = ['directory', 'null']
 
2013
    takes_options = [
 
2014
            Option('null',
 
2015
                   help='Write an ascii NUL (\\0) separator '
 
2016
                   'between files rather than a newline.')
 
2017
            ]
2128
2018
 
2129
2019
    @display_command
2130
 
    def run(self, null=False, directory=u'.'):
2131
 
        tree = WorkingTree.open_containing(directory)[0]
2132
 
        self.add_cleanup(tree.lock_read().unlock)
 
2020
    def run(self, null=False):
 
2021
        tree = WorkingTree.open_containing(u'.')[0]
2133
2022
        td = tree.changes_from(tree.basis_tree())
2134
 
        self.cleanup_now()
2135
2023
        for path, id, kind, text_modified, meta_modified in td.modified:
2136
2024
            if null:
2137
2025
                self.outf.write(path + '\0')
2145
2033
 
2146
2034
    hidden = True
2147
2035
    _see_also = ['status', 'ls']
2148
 
    takes_options = ['directory', 'null']
 
2036
    takes_options = [
 
2037
            Option('null',
 
2038
                   help='Write an ascii NUL (\\0) separator '
 
2039
                   'between files rather than a newline.')
 
2040
            ]
2149
2041
 
2150
2042
    @display_command
2151
 
    def run(self, null=False, directory=u'.'):
2152
 
        wt = WorkingTree.open_containing(directory)[0]
 
2043
    def run(self, null=False):
 
2044
        wt = WorkingTree.open_containing(u'.')[0]
2153
2045
        self.add_cleanup(wt.lock_read().unlock)
2154
2046
        basis = wt.basis_tree()
2155
2047
        self.add_cleanup(basis.lock_read().unlock)
2156
2048
        basis_inv = basis.inventory
2157
2049
        inv = wt.inventory
2158
2050
        for file_id in inv:
2159
 
            if basis_inv.has_id(file_id):
 
2051
            if file_id in basis_inv:
2160
2052
                continue
2161
2053
            if inv.is_root(file_id) and len(basis_inv) == 0:
2162
2054
                continue
2163
2055
            path = inv.id2path(file_id)
2164
 
            if not os.access(osutils.pathjoin(wt.basedir, path), os.F_OK):
 
2056
            if not os.access(osutils.abspath(path), os.F_OK):
2165
2057
                continue
2166
2058
            if null:
2167
2059
                self.outf.write(path + '\0')
2367
2259
                   help='Show just the specified revision.'
2368
2260
                   ' See also "help revisionspec".'),
2369
2261
            'log-format',
2370
 
            RegistryOption('authors',
2371
 
                'What names to list as authors - first, all or committer.',
2372
 
                title='Authors',
2373
 
                lazy_registry=('bzrlib.log', 'author_list_registry'),
2374
 
            ),
2375
2262
            Option('levels',
2376
2263
                   short_name='n',
2377
2264
                   help='Number of levels to display - 0 for all, 1 for flat.',
2395
2282
            Option('exclude-common-ancestry',
2396
2283
                   help='Display only the revisions that are not part'
2397
2284
                   ' of both ancestries (require -rX..Y)'
2398
 
                   ),
2399
 
            Option('signatures',
2400
 
                   help='Show digital signature validity'),
 
2285
                   )
2401
2286
            ]
2402
2287
    encoding_type = 'replace'
2403
2288
 
2414
2299
            limit=None,
2415
2300
            show_diff=False,
2416
2301
            include_merges=False,
2417
 
            authors=None,
2418
2302
            exclude_common_ancestry=False,
2419
 
            signatures=False,
2420
2303
            ):
2421
2304
        from bzrlib.log import (
2422
2305
            Logger,
2476
2359
            self.add_cleanup(b.lock_read().unlock)
2477
2360
            rev1, rev2 = _get_revision_range(revision, b, self.name())
2478
2361
 
2479
 
        if b.get_config().validate_signatures_in_log():
2480
 
            signatures = True
2481
 
 
2482
 
        if signatures:
2483
 
            if not gpg.GPGStrategy.verify_signatures_available():
2484
 
                raise errors.GpgmeNotInstalled(None)
2485
 
 
2486
2362
        # Decide on the type of delta & diff filtering to use
2487
2363
        # TODO: add an --all-files option to make this configurable & consistent
2488
2364
        if not verbose:
2506
2382
                        show_timezone=timezone,
2507
2383
                        delta_format=get_verbosity_level(),
2508
2384
                        levels=levels,
2509
 
                        show_advice=levels is None,
2510
 
                        author_list_handler=authors)
 
2385
                        show_advice=levels is None)
2511
2386
 
2512
2387
        # Choose the algorithm for doing the logging. It's annoying
2513
2388
        # having multiple code paths like this but necessary until
2534
2409
            message_search=message, delta_type=delta_type,
2535
2410
            diff_type=diff_type, _match_using_deltas=match_using_deltas,
2536
2411
            exclude_common_ancestry=exclude_common_ancestry,
2537
 
            signature=signatures
2538
2412
            )
2539
2413
        Logger(b, rqst).show(lf)
2540
2414
 
2631
2505
                   help='Recurse into subdirectories.'),
2632
2506
            Option('from-root',
2633
2507
                   help='Print paths relative to the root of the branch.'),
2634
 
            Option('unknown', short_name='u',
2635
 
                help='Print unknown files.'),
 
2508
            Option('unknown', help='Print unknown files.'),
2636
2509
            Option('versioned', help='Print versioned files.',
2637
2510
                   short_name='V'),
2638
 
            Option('ignored', short_name='i',
2639
 
                help='Print ignored files.'),
2640
 
            Option('kind', short_name='k',
 
2511
            Option('ignored', help='Print ignored files.'),
 
2512
            Option('null',
 
2513
                   help='Write an ascii NUL (\\0) separator '
 
2514
                   'between files rather than a newline.'),
 
2515
            Option('kind',
2641
2516
                   help='List entries of a particular kind: file, directory, symlink.',
2642
2517
                   type=unicode),
2643
 
            'null',
2644
2518
            'show-ids',
2645
 
            'directory',
2646
2519
            ]
2647
2520
    @display_command
2648
2521
    def run(self, revision=None, verbose=False,
2649
2522
            recursive=False, from_root=False,
2650
2523
            unknown=False, versioned=False, ignored=False,
2651
 
            null=False, kind=None, show_ids=False, path=None, directory=None):
 
2524
            null=False, kind=None, show_ids=False, path=None):
2652
2525
 
2653
2526
        if kind and kind not in ('file', 'directory', 'symlink'):
2654
2527
            raise errors.BzrCommandError('invalid kind specified')
2666
2539
                raise errors.BzrCommandError('cannot specify both --from-root'
2667
2540
                                             ' and PATH')
2668
2541
            fs_path = path
2669
 
        tree, branch, relpath = \
2670
 
            _open_directory_or_containing_tree_or_branch(fs_path, directory)
 
2542
        tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
 
2543
            fs_path)
2671
2544
 
2672
2545
        # Calculate the prefix to use
2673
2546
        prefix = None
2741
2614
 
2742
2615
    hidden = True
2743
2616
    _see_also = ['ls']
2744
 
    takes_options = ['directory']
2745
2617
 
2746
2618
    @display_command
2747
 
    def run(self, directory=u'.'):
2748
 
        for f in WorkingTree.open_containing(directory)[0].unknowns():
 
2619
    def run(self):
 
2620
        for f in WorkingTree.open_containing(u'.')[0].unknowns():
2749
2621
            self.outf.write(osutils.quotefn(f) + '\n')
2750
2622
 
2751
2623
 
2778
2650
    Patterns prefixed with '!!' act as regular ignore patterns, but have
2779
2651
    precedence over the '!' exception patterns.
2780
2652
 
2781
 
    :Notes: 
2782
 
        
2783
 
    * Ignore patterns containing shell wildcards must be quoted from
2784
 
      the shell on Unix.
2785
 
 
2786
 
    * Ignore patterns starting with "#" act as comments in the ignore file.
2787
 
      To ignore patterns that begin with that character, use the "RE:" prefix.
 
2653
    Note: ignore patterns containing shell wildcards must be quoted from
 
2654
    the shell on Unix.
2788
2655
 
2789
2656
    :Examples:
2790
2657
        Ignore the top level Makefile::
2799
2666
 
2800
2667
            bzr ignore "!special.class"
2801
2668
 
2802
 
        Ignore files whose name begins with the "#" character::
2803
 
 
2804
 
            bzr ignore "RE:^#"
2805
 
 
2806
2669
        Ignore .o files under the lib directory::
2807
2670
 
2808
2671
            bzr ignore "lib/**/*.o"
2816
2679
            bzr ignore "RE:(?!debian/).*"
2817
2680
        
2818
2681
        Ignore everything except the "local" toplevel directory,
2819
 
        but always ignore autosave files ending in ~, even under local/::
 
2682
        but always ignore "*~" autosave files, even under local/::
2820
2683
        
2821
2684
            bzr ignore "*"
2822
2685
            bzr ignore "!./local"
2825
2688
 
2826
2689
    _see_also = ['status', 'ignored', 'patterns']
2827
2690
    takes_args = ['name_pattern*']
2828
 
    takes_options = ['directory',
 
2691
    takes_options = [
2829
2692
        Option('default-rules',
2830
2693
               help='Display the default ignore rules that bzr uses.')
2831
2694
        ]
2832
2695
 
2833
 
    def run(self, name_pattern_list=None, default_rules=None,
2834
 
            directory=u'.'):
 
2696
    def run(self, name_pattern_list=None, default_rules=None):
2835
2697
        from bzrlib import ignores
2836
2698
        if default_rules is not None:
2837
2699
            # dump the default rules and exit
2843
2705
                "NAME_PATTERN or --default-rules.")
2844
2706
        name_pattern_list = [globbing.normalize_pattern(p)
2845
2707
                             for p in name_pattern_list]
2846
 
        bad_patterns = ''
2847
 
        for p in name_pattern_list:
2848
 
            if not globbing.Globster.is_pattern_valid(p):
2849
 
                bad_patterns += ('\n  %s' % p)
2850
 
        if bad_patterns:
2851
 
            msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2852
 
            ui.ui_factory.show_error(msg)
2853
 
            raise errors.InvalidPattern('')
2854
2708
        for name_pattern in name_pattern_list:
2855
2709
            if (name_pattern[0] == '/' or
2856
2710
                (len(name_pattern) > 1 and name_pattern[1] == ':')):
2857
2711
                raise errors.BzrCommandError(
2858
2712
                    "NAME_PATTERN should not be an absolute path")
2859
 
        tree, relpath = WorkingTree.open_containing(directory)
 
2713
        tree, relpath = WorkingTree.open_containing(u'.')
2860
2714
        ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2861
2715
        ignored = globbing.Globster(name_pattern_list)
2862
2716
        matches = []
2863
 
        self.add_cleanup(tree.lock_read().unlock)
 
2717
        tree.lock_read()
2864
2718
        for entry in tree.list_files():
2865
2719
            id = entry[3]
2866
2720
            if id is not None:
2867
2721
                filename = entry[0]
2868
2722
                if ignored.match(filename):
2869
2723
                    matches.append(filename)
 
2724
        tree.unlock()
2870
2725
        if len(matches) > 0:
2871
2726
            self.outf.write("Warning: the following files are version controlled and"
2872
2727
                  " match your ignore pattern:\n%s"
2887
2742
 
2888
2743
    encoding_type = 'replace'
2889
2744
    _see_also = ['ignore', 'ls']
2890
 
    takes_options = ['directory']
2891
2745
 
2892
2746
    @display_command
2893
 
    def run(self, directory=u'.'):
2894
 
        tree = WorkingTree.open_containing(directory)[0]
 
2747
    def run(self):
 
2748
        tree = WorkingTree.open_containing(u'.')[0]
2895
2749
        self.add_cleanup(tree.lock_read().unlock)
2896
2750
        for path, file_class, kind, file_id, entry in tree.list_files():
2897
2751
            if file_class != 'I':
2909
2763
    """
2910
2764
    hidden = True
2911
2765
    takes_args = ['revno']
2912
 
    takes_options = ['directory']
2913
2766
 
2914
2767
    @display_command
2915
 
    def run(self, revno, directory=u'.'):
 
2768
    def run(self, revno):
2916
2769
        try:
2917
2770
            revno = int(revno)
2918
2771
        except ValueError:
2919
2772
            raise errors.BzrCommandError("not a valid revision-number: %r"
2920
2773
                                         % revno)
2921
 
        revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
 
2774
        revid = WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2922
2775
        self.outf.write("%s\n" % revid)
2923
2776
 
2924
2777
 
2950
2803
         zip                          .zip
2951
2804
      =================       =========================
2952
2805
    """
2953
 
    encoding = 'exact'
2954
2806
    takes_args = ['dest', 'branch_or_subdir?']
2955
 
    takes_options = ['directory',
 
2807
    takes_options = [
2956
2808
        Option('format',
2957
2809
               help="Type of file to export to.",
2958
2810
               type=unicode),
2967
2819
                    'revision in which it was changed.'),
2968
2820
        ]
2969
2821
    def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2970
 
        root=None, filters=False, per_file_timestamps=False, directory=u'.'):
 
2822
        root=None, filters=False, per_file_timestamps=False):
2971
2823
        from bzrlib.export import export
2972
2824
 
2973
2825
        if branch_or_subdir is None:
2974
 
            tree = WorkingTree.open_containing(directory)[0]
 
2826
            tree = WorkingTree.open_containing(u'.')[0]
2975
2827
            b = tree.branch
2976
2828
            subdir = None
2977
2829
        else:
2996
2848
    """
2997
2849
 
2998
2850
    _see_also = ['ls']
2999
 
    takes_options = ['directory',
 
2851
    takes_options = [
3000
2852
        Option('name-from-revision', help='The path name in the old tree.'),
3001
2853
        Option('filters', help='Apply content filters to display the '
3002
2854
                'convenience form.'),
3007
2859
 
3008
2860
    @display_command
3009
2861
    def run(self, filename, revision=None, name_from_revision=False,
3010
 
            filters=False, directory=None):
 
2862
            filters=False):
3011
2863
        if revision is not None and len(revision) != 1:
3012
2864
            raise errors.BzrCommandError("bzr cat --revision takes exactly"
3013
2865
                                         " one revision specifier")
3014
2866
        tree, branch, relpath = \
3015
 
            _open_directory_or_containing_tree_or_branch(filename, directory)
 
2867
            bzrdir.BzrDir.open_containing_tree_or_branch(filename)
3016
2868
        self.add_cleanup(branch.lock_read().unlock)
3017
2869
        return self._run(tree, branch, relpath, filename, revision,
3018
2870
                         name_from_revision, filters)
3134
2986
      to trigger updates to external systems like bug trackers. The --fixes
3135
2987
      option can be used to record the association between a revision and
3136
2988
      one or more bugs. See ``bzr help bugs`` for details.
 
2989
 
 
2990
      A selective commit may fail in some cases where the committed
 
2991
      tree would be invalid. Consider::
 
2992
  
 
2993
        bzr init foo
 
2994
        mkdir foo/bar
 
2995
        bzr add foo/bar
 
2996
        bzr commit foo -m "committing foo"
 
2997
        bzr mv foo/bar foo/baz
 
2998
        mkdir foo/bar
 
2999
        bzr add foo/bar
 
3000
        bzr commit foo/bar -m "committing bar but not baz"
 
3001
  
 
3002
      In the example above, the last commit will fail by design. This gives
 
3003
      the user the opportunity to decide whether they want to commit the
 
3004
      rename at the same time, separately first, or not at all. (As a general
 
3005
      rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
3137
3006
    """
 
3007
    # TODO: Run hooks on tree to-be-committed, and after commit.
 
3008
 
 
3009
    # TODO: Strict commit that fails if there are deleted files.
 
3010
    #       (what does "deleted files" mean ??)
 
3011
 
 
3012
    # TODO: Give better message for -s, --summary, used by tla people
 
3013
 
 
3014
    # XXX: verbose currently does nothing
3138
3015
 
3139
3016
    _see_also = ['add', 'bugs', 'hooks', 'uncommit']
3140
3017
    takes_args = ['selected*']
3172
3049
             Option('show-diff', short_name='p',
3173
3050
                    help='When no message is supplied, show the diff along'
3174
3051
                    ' with the status summary in the message editor.'),
3175
 
             Option('lossy', 
3176
 
                    help='When committing to a foreign version control '
3177
 
                    'system do not push data that can not be natively '
3178
 
                    'represented.'),
3179
3052
             ]
3180
3053
    aliases = ['ci', 'checkin']
3181
3054
 
3200
3073
 
3201
3074
    def run(self, message=None, file=None, verbose=False, selected_list=None,
3202
3075
            unchanged=False, strict=False, local=False, fixes=None,
3203
 
            author=None, show_diff=False, exclude=None, commit_time=None,
3204
 
            lossy=False):
 
3076
            author=None, show_diff=False, exclude=None, commit_time=None):
3205
3077
        from bzrlib.errors import (
3206
3078
            PointlessCommit,
3207
3079
            ConflictsInTree,
3210
3082
        from bzrlib.msgeditor import (
3211
3083
            edit_commit_message_encoded,
3212
3084
            generate_commit_message_template,
3213
 
            make_commit_message_template_encoded,
3214
 
            set_commit_message,
 
3085
            make_commit_message_template_encoded
3215
3086
        )
3216
3087
 
3217
3088
        commit_stamp = offset = None
3222
3093
                raise errors.BzrCommandError(
3223
3094
                    "Could not parse --commit-time: " + str(e))
3224
3095
 
 
3096
        # TODO: Need a blackbox test for invoking the external editor; may be
 
3097
        # slightly problematic to run this cross-platform.
 
3098
 
 
3099
        # TODO: do more checks that the commit will succeed before
 
3100
        # spending the user's valuable time typing a commit message.
 
3101
 
3225
3102
        properties = {}
3226
3103
 
3227
 
        tree, selected_list = WorkingTree.open_containing_paths(selected_list)
 
3104
        tree, selected_list = tree_files(selected_list)
3228
3105
        if selected_list == ['']:
3229
3106
            # workaround - commit of root of tree should be exactly the same
3230
3107
            # as just default commit in that tree, and succeed even though
3265
3142
        def get_message(commit_obj):
3266
3143
            """Callback to get commit message"""
3267
3144
            if file:
3268
 
                f = open(file)
3269
 
                try:
3270
 
                    my_message = f.read().decode(osutils.get_user_encoding())
3271
 
                finally:
3272
 
                    f.close()
 
3145
                my_message = codecs.open(
 
3146
                    file, 'rt', osutils.get_user_encoding()).read()
3273
3147
            elif message is not None:
3274
3148
                my_message = message
3275
3149
            else:
3283
3157
                # make_commit_message_template_encoded returns user encoding.
3284
3158
                # We probably want to be using edit_commit_message instead to
3285
3159
                # avoid this.
3286
 
                my_message = set_commit_message(commit_obj)
3287
 
                if my_message is None:
3288
 
                    start_message = generate_commit_message_template(commit_obj)
3289
 
                    my_message = edit_commit_message_encoded(text,
3290
 
                        start_message=start_message)
 
3160
                start_message = generate_commit_message_template(commit_obj)
 
3161
                my_message = edit_commit_message_encoded(text,
 
3162
                    start_message=start_message)
3291
3163
                if my_message is None:
3292
3164
                    raise errors.BzrCommandError("please specify a commit"
3293
3165
                        " message with either --message or --file")
3306
3178
                        reporter=None, verbose=verbose, revprops=properties,
3307
3179
                        authors=author, timestamp=commit_stamp,
3308
3180
                        timezone=offset,
3309
 
                        exclude=tree.safe_relpath_files(exclude),
3310
 
                        lossy=lossy)
 
3181
                        exclude=safe_relpath_files(tree, exclude))
3311
3182
        except PointlessCommit:
3312
3183
            raise errors.BzrCommandError("No changes to commit."
3313
 
                " Please 'bzr add' the files you want to commit, or use"
3314
 
                " --unchanged to force an empty commit.")
 
3184
                              " Use --unchanged to commit anyhow.")
3315
3185
        except ConflictsInTree:
3316
3186
            raise errors.BzrCommandError('Conflicts detected in working '
3317
3187
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3398
3268
 
3399
3269
 
3400
3270
class cmd_upgrade(Command):
3401
 
    __doc__ = """Upgrade a repository, branch or working tree to a newer format.
3402
 
 
3403
 
    When the default format has changed after a major new release of
3404
 
    Bazaar, you may be informed during certain operations that you
3405
 
    should upgrade. Upgrading to a newer format may improve performance
3406
 
    or make new features available. It may however limit interoperability
3407
 
    with older repositories or with older versions of Bazaar.
3408
 
 
3409
 
    If you wish to upgrade to a particular format rather than the
3410
 
    current default, that can be specified using the --format option.
3411
 
    As a consequence, you can use the upgrade command this way to
3412
 
    "downgrade" to an earlier format, though some conversions are
3413
 
    a one way process (e.g. changing from the 1.x default to the
3414
 
    2.x default) so downgrading is not always possible.
3415
 
 
3416
 
    A backup.bzr.~#~ directory is created at the start of the conversion
3417
 
    process (where # is a number). By default, this is left there on
3418
 
    completion. If the conversion fails, delete the new .bzr directory
3419
 
    and rename this one back in its place. Use the --clean option to ask
3420
 
    for the backup.bzr directory to be removed on successful conversion.
3421
 
    Alternatively, you can delete it by hand if everything looks good
3422
 
    afterwards.
3423
 
 
3424
 
    If the location given is a shared repository, dependent branches
3425
 
    are also converted provided the repository converts successfully.
3426
 
    If the conversion of a branch fails, remaining branches are still
3427
 
    tried.
3428
 
 
3429
 
    For more information on upgrades, see the Bazaar Upgrade Guide,
3430
 
    http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
 
3271
    __doc__ = """Upgrade branch storage to current format.
 
3272
 
 
3273
    The check command or bzr developers may sometimes advise you to run
 
3274
    this command. When the default format has changed you may also be warned
 
3275
    during other operations to upgrade.
3431
3276
    """
3432
3277
 
3433
 
    _see_also = ['check', 'reconcile', 'formats']
 
3278
    _see_also = ['check']
3434
3279
    takes_args = ['url?']
3435
3280
    takes_options = [
3436
 
        RegistryOption('format',
3437
 
            help='Upgrade to a specific format.  See "bzr help'
3438
 
                 ' formats" for details.',
3439
 
            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3440
 
            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3441
 
            value_switches=True, title='Branch format'),
3442
 
        Option('clean',
3443
 
            help='Remove the backup.bzr directory if successful.'),
3444
 
        Option('dry-run',
3445
 
            help="Show what would be done, but don't actually do anything."),
3446
 
    ]
 
3281
                    RegistryOption('format',
 
3282
                        help='Upgrade to a specific format.  See "bzr help'
 
3283
                             ' formats" for details.',
 
3284
                        lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
3285
                        converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
 
3286
                        value_switches=True, title='Branch format'),
 
3287
                    ]
3447
3288
 
3448
 
    def run(self, url='.', format=None, clean=False, dry_run=False):
 
3289
    def run(self, url='.', format=None):
3449
3290
        from bzrlib.upgrade import upgrade
3450
 
        exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
3451
 
        if exceptions:
3452
 
            if len(exceptions) == 1:
3453
 
                # Compatibility with historical behavior
3454
 
                raise exceptions[0]
3455
 
            else:
3456
 
                return 3
 
3291
        upgrade(url, format)
3457
3292
 
3458
3293
 
3459
3294
class cmd_whoami(Command):
3468
3303
 
3469
3304
            bzr whoami "Frank Chu <fchu@example.com>"
3470
3305
    """
3471
 
    takes_options = [ 'directory',
3472
 
                      Option('email',
 
3306
    takes_options = [ Option('email',
3473
3307
                             help='Display email address only.'),
3474
3308
                      Option('branch',
3475
3309
                             help='Set identity for the current branch instead of '
3479
3313
    encoding_type = 'replace'
3480
3314
 
3481
3315
    @display_command
3482
 
    def run(self, email=False, branch=False, name=None, directory=None):
 
3316
    def run(self, email=False, branch=False, name=None):
3483
3317
        if name is None:
3484
 
            if directory is None:
3485
 
                # use branch if we're inside one; otherwise global config
3486
 
                try:
3487
 
                    c = Branch.open_containing(u'.')[0].get_config()
3488
 
                except errors.NotBranchError:
3489
 
                    c = _mod_config.GlobalConfig()
3490
 
            else:
3491
 
                c = Branch.open(directory).get_config()
 
3318
            # use branch if we're inside one; otherwise global config
 
3319
            try:
 
3320
                c = Branch.open_containing('.')[0].get_config()
 
3321
            except errors.NotBranchError:
 
3322
                c = config.GlobalConfig()
3492
3323
            if email:
3493
3324
                self.outf.write(c.user_email() + '\n')
3494
3325
            else:
3495
3326
                self.outf.write(c.username() + '\n')
3496
3327
            return
3497
3328
 
3498
 
        if email:
3499
 
            raise errors.BzrCommandError("--email can only be used to display existing "
3500
 
                                         "identity")
3501
 
 
3502
3329
        # display a warning if an email address isn't included in the given name.
3503
3330
        try:
3504
 
            _mod_config.extract_email_address(name)
 
3331
            config.extract_email_address(name)
3505
3332
        except errors.NoEmailInUsername, e:
3506
3333
            warning('"%s" does not seem to contain an email address.  '
3507
3334
                    'This is allowed, but not recommended.', name)
3508
3335
 
3509
3336
        # use global config unless --branch given
3510
3337
        if branch:
3511
 
            if directory is None:
3512
 
                c = Branch.open_containing(u'.')[0].get_config()
3513
 
            else:
3514
 
                c = Branch.open(directory).get_config()
 
3338
            c = Branch.open_containing('.')[0].get_config()
3515
3339
        else:
3516
 
            c = _mod_config.GlobalConfig()
 
3340
            c = config.GlobalConfig()
3517
3341
        c.set_user_option('email', name)
3518
3342
 
3519
3343
 
3529
3353
 
3530
3354
    _see_also = ['info']
3531
3355
    takes_args = ['nickname?']
3532
 
    takes_options = ['directory']
3533
 
    def run(self, nickname=None, directory=u'.'):
3534
 
        branch = Branch.open_containing(directory)[0]
 
3356
    def run(self, nickname=None):
 
3357
        branch = Branch.open_containing(u'.')[0]
3535
3358
        if nickname is None:
3536
3359
            self.printme(branch)
3537
3360
        else:
3586
3409
                'bzr alias --remove expects an alias to remove.')
3587
3410
        # If alias is not found, print something like:
3588
3411
        # unalias: foo: not found
3589
 
        c = _mod_config.GlobalConfig()
 
3412
        c = config.GlobalConfig()
3590
3413
        c.unset_alias(alias_name)
3591
3414
 
3592
3415
    @display_command
3593
3416
    def print_aliases(self):
3594
3417
        """Print out the defined aliases in a similar format to bash."""
3595
 
        aliases = _mod_config.GlobalConfig().get_aliases()
 
3418
        aliases = config.GlobalConfig().get_aliases()
3596
3419
        for key, value in sorted(aliases.iteritems()):
3597
3420
            self.outf.write('bzr alias %s="%s"\n' % (key, value))
3598
3421
 
3608
3431
 
3609
3432
    def set_alias(self, alias_name, alias_command):
3610
3433
        """Save the alias in the global config."""
3611
 
        c = _mod_config.GlobalConfig()
 
3434
        c = config.GlobalConfig()
3612
3435
        c.set_alias(alias_name, alias_command)
3613
3436
 
3614
3437
 
3649
3472
    If you set BZR_TEST_PDB=1 when running selftest, failing tests will drop
3650
3473
    into a pdb postmortem session.
3651
3474
 
3652
 
    The --coverage=DIRNAME global option produces a report with covered code
3653
 
    indicated.
3654
 
 
3655
3475
    :Examples:
3656
3476
        Run only tests relating to 'ignore'::
3657
3477
 
3668
3488
        if typestring == "sftp":
3669
3489
            from bzrlib.tests import stub_sftp
3670
3490
            return stub_sftp.SFTPAbsoluteServer
3671
 
        elif typestring == "memory":
 
3491
        if typestring == "memory":
3672
3492
            from bzrlib.tests import test_server
3673
3493
            return memory.MemoryServer
3674
 
        elif typestring == "fakenfs":
 
3494
        if typestring == "fakenfs":
3675
3495
            from bzrlib.tests import test_server
3676
3496
            return test_server.FakeNFSServer
3677
3497
        msg = "No known transport type %s. Supported types are: sftp\n" %\
3690
3510
                                 'throughout the test suite.',
3691
3511
                            type=get_transport_type),
3692
3512
                     Option('benchmark',
3693
 
                            help='Run the benchmarks rather than selftests.',
3694
 
                            hidden=True),
 
3513
                            help='Run the benchmarks rather than selftests.'),
3695
3514
                     Option('lsprof-timed',
3696
3515
                            help='Generate lsprof output for benchmarked'
3697
3516
                                 ' sections of code.'),
3698
3517
                     Option('lsprof-tests',
3699
3518
                            help='Generate lsprof output for each test.'),
 
3519
                     Option('cache-dir', type=str,
 
3520
                            help='Cache intermediate benchmark output in this '
 
3521
                                 'directory.'),
3700
3522
                     Option('first',
3701
3523
                            help='Run all tests, but run specified tests first.',
3702
3524
                            short_name='f',
3711
3533
                     Option('randomize', type=str, argname="SEED",
3712
3534
                            help='Randomize the order of tests using the given'
3713
3535
                                 ' seed or "now" for the current time.'),
3714
 
                     ListOption('exclude', type=str, argname="PATTERN",
3715
 
                                short_name='x',
3716
 
                                help='Exclude tests that match this regular'
3717
 
                                ' expression.'),
 
3536
                     Option('exclude', type=str, argname="PATTERN",
 
3537
                            short_name='x',
 
3538
                            help='Exclude tests that match this regular'
 
3539
                                 ' expression.'),
3718
3540
                     Option('subunit',
3719
3541
                        help='Output test progress via subunit.'),
3720
3542
                     Option('strict', help='Fail on missing dependencies or '
3736
3558
 
3737
3559
    def run(self, testspecs_list=None, verbose=False, one=False,
3738
3560
            transport=None, benchmark=None,
3739
 
            lsprof_timed=None,
 
3561
            lsprof_timed=None, cache_dir=None,
3740
3562
            first=False, list_only=False,
3741
3563
            randomize=None, exclude=None, strict=False,
3742
3564
            load_list=None, debugflag=None, starting_with=None, subunit=False,
3743
3565
            parallel=None, lsprof_tests=False):
3744
 
        from bzrlib import tests
3745
 
 
 
3566
        from bzrlib.tests import selftest
 
3567
        import bzrlib.benchmarks as benchmarks
 
3568
        from bzrlib.benchmarks import tree_creator
 
3569
 
 
3570
        # Make deprecation warnings visible, unless -Werror is set
 
3571
        symbol_versioning.activate_deprecation_warnings(override=False)
 
3572
 
 
3573
        if cache_dir is not None:
 
3574
            tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3746
3575
        if testspecs_list is not None:
3747
3576
            pattern = '|'.join(testspecs_list)
3748
3577
        else:
3756
3585
            self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3757
3586
            # On Windows, disable automatic conversion of '\n' to '\r\n' in
3758
3587
            # stdout, which would corrupt the subunit stream. 
3759
 
            # FIXME: This has been fixed in subunit trunk (>0.0.5) so the
3760
 
            # following code can be deleted when it's sufficiently deployed
3761
 
            # -- vila/mgz 20100514
3762
 
            if (sys.platform == "win32"
3763
 
                and getattr(sys.stdout, 'fileno', None) is not None):
 
3588
            if sys.platform == "win32" and sys.stdout.fileno() >= 0:
3764
3589
                import msvcrt
3765
3590
                msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
3766
3591
        if parallel:
3767
3592
            self.additional_selftest_args.setdefault(
3768
3593
                'suite_decorators', []).append(parallel)
3769
3594
        if benchmark:
3770
 
            raise errors.BzrCommandError(
3771
 
                "--benchmark is no longer supported from bzr 2.2; "
3772
 
                "use bzr-usertest instead")
3773
 
        test_suite_factory = None
3774
 
        if not exclude:
3775
 
            exclude_pattern = None
 
3595
            test_suite_factory = benchmarks.test_suite
 
3596
            # Unless user explicitly asks for quiet, be verbose in benchmarks
 
3597
            verbose = not is_quiet()
 
3598
            # TODO: should possibly lock the history file...
 
3599
            benchfile = open(".perf_history", "at", buffering=1)
 
3600
            self.add_cleanup(benchfile.close)
3776
3601
        else:
3777
 
            exclude_pattern = '(' + '|'.join(exclude) + ')'
 
3602
            test_suite_factory = None
 
3603
            benchfile = None
3778
3604
        selftest_kwargs = {"verbose": verbose,
3779
3605
                          "pattern": pattern,
3780
3606
                          "stop_on_failure": one,
3782
3608
                          "test_suite_factory": test_suite_factory,
3783
3609
                          "lsprof_timed": lsprof_timed,
3784
3610
                          "lsprof_tests": lsprof_tests,
 
3611
                          "bench_history": benchfile,
3785
3612
                          "matching_tests_first": first,
3786
3613
                          "list_only": list_only,
3787
3614
                          "random_seed": randomize,
3788
 
                          "exclude_pattern": exclude_pattern,
 
3615
                          "exclude_pattern": exclude,
3789
3616
                          "strict": strict,
3790
3617
                          "load_list": load_list,
3791
3618
                          "debug_flags": debugflag,
3792
3619
                          "starting_with": starting_with
3793
3620
                          }
3794
3621
        selftest_kwargs.update(self.additional_selftest_args)
3795
 
 
3796
 
        # Make deprecation warnings visible, unless -Werror is set
3797
 
        cleanup = symbol_versioning.activate_deprecation_warnings(
3798
 
            override=False)
3799
 
        try:
3800
 
            result = tests.selftest(**selftest_kwargs)
3801
 
        finally:
3802
 
            cleanup()
 
3622
        result = selftest(**selftest_kwargs)
3803
3623
        return int(not result)
3804
3624
 
3805
3625
 
3860
3680
    The source of the merge can be specified either in the form of a branch,
3861
3681
    or in the form of a path to a file containing a merge directive generated
3862
3682
    with bzr send. If neither is specified, the default is the upstream branch
3863
 
    or the branch most recently merged using --remember.  The source of the
3864
 
    merge may also be specified in the form of a path to a file in another
3865
 
    branch:  in this case, only the modifications to that file are merged into
3866
 
    the current working tree.
3867
 
 
3868
 
    When merging from a branch, by default bzr will try to merge in all new
3869
 
    work from the other branch, automatically determining an appropriate base
3870
 
    revision.  If this fails, you may need to give an explicit base.
3871
 
 
3872
 
    To pick a different ending revision, pass "--revision OTHER".  bzr will
3873
 
    try to merge in all new work up to and including revision OTHER.
3874
 
 
3875
 
    If you specify two values, "--revision BASE..OTHER", only revisions BASE
3876
 
    through OTHER, excluding BASE but including OTHER, will be merged.  If this
3877
 
    causes some revisions to be skipped, i.e. if the destination branch does
3878
 
    not already contain revision BASE, such a merge is commonly referred to as
3879
 
    a "cherrypick". Unlike a normal merge, Bazaar does not currently track
3880
 
    cherrypicks. The changes look like a normal commit, and the history of the
3881
 
    changes from the other branch is not stored in the commit.
3882
 
 
3883
 
    Revision numbers are always relative to the source branch.
 
3683
    or the branch most recently merged using --remember.
 
3684
 
 
3685
    When merging a branch, by default the tip will be merged. To pick a different
 
3686
    revision, pass --revision. If you specify two values, the first will be used as
 
3687
    BASE and the second one as OTHER. Merging individual revisions, or a subset of
 
3688
    available revisions, like this is commonly referred to as "cherrypicking".
 
3689
 
 
3690
    Revision numbers are always relative to the branch being merged.
 
3691
 
 
3692
    By default, bzr will try to merge in all new work from the other
 
3693
    branch, automatically determining an appropriate base.  If this
 
3694
    fails, you may need to give an explicit base.
3884
3695
 
3885
3696
    Merge will do its best to combine the changes in two branches, but there
3886
3697
    are some kinds of problems only a human can fix.  When it encounters those,
3889
3700
 
3890
3701
    Use bzr resolve when you have fixed a problem.  See also bzr conflicts.
3891
3702
 
3892
 
    If there is no default branch set, the first merge will set it (use
3893
 
    --no-remember to avoid settting it). After that, you can omit the branch
3894
 
    to use the default.  To change the default, use --remember. The value will
3895
 
    only be saved if the remote location can be accessed.
 
3703
    If there is no default branch set, the first merge will set it. After
 
3704
    that, you can omit the branch to use the default.  To change the
 
3705
    default, use --remember. The value will only be saved if the remote
 
3706
    location can be accessed.
3896
3707
 
3897
3708
    The results of the merge are placed into the destination working
3898
3709
    directory, where they can be reviewed (with bzr diff), tested, and then
3899
3710
    committed to record the result of the merge.
3900
3711
 
3901
3712
    merge refuses to run if there are any uncommitted changes, unless
3902
 
    --force is given.  If --force is given, then the changes from the source 
3903
 
    will be merged with the current working tree, including any uncommitted
3904
 
    changes in the tree.  The --force option can also be used to create a
 
3713
    --force is given. The --force option can also be used to create a
3905
3714
    merge revision which has more than two parents.
3906
3715
 
3907
3716
    If one would like to merge changes from the working tree of the other
3912
3721
    you to apply each diff hunk and file change, similar to "shelve".
3913
3722
 
3914
3723
    :Examples:
3915
 
        To merge all new revisions from bzr.dev::
 
3724
        To merge the latest revision from bzr.dev::
3916
3725
 
3917
3726
            bzr merge ../bzr.dev
3918
3727
 
3955
3764
                ' completely merged into the source, pull from the'
3956
3765
                ' source rather than merging.  When this happens,'
3957
3766
                ' you do not need to commit the result.'),
3958
 
        custom_help('directory',
 
3767
        Option('directory',
3959
3768
               help='Branch to merge into, '
3960
 
                    'rather than the one containing the working directory.'),
 
3769
                    'rather than the one containing the working directory.',
 
3770
               short_name='d',
 
3771
               type=unicode,
 
3772
               ),
3961
3773
        Option('preview', help='Instead of merging, show a diff of the'
3962
3774
               ' merge.'),
3963
3775
        Option('interactive', help='Select changes interactively.',
3965
3777
    ]
3966
3778
 
3967
3779
    def run(self, location=None, revision=None, force=False,
3968
 
            merge_type=None, show_base=False, reprocess=None, remember=None,
 
3780
            merge_type=None, show_base=False, reprocess=None, remember=False,
3969
3781
            uncommitted=False, pull=False,
3970
3782
            directory=None,
3971
3783
            preview=False,
3979
3791
        merger = None
3980
3792
        allow_pending = True
3981
3793
        verified = 'inapplicable'
3982
 
 
3983
3794
        tree = WorkingTree.open_containing(directory)[0]
3984
 
        if tree.branch.revno() == 0:
3985
 
            raise errors.BzrCommandError('Merging into empty branches not currently supported, '
3986
 
                                         'https://bugs.launchpad.net/bzr/+bug/308562')
3987
3795
 
3988
3796
        try:
3989
3797
            basis_tree = tree.revision_tree(tree.last_revision())
4035
3843
        self.sanity_check_merger(merger)
4036
3844
        if (merger.base_rev_id == merger.other_rev_id and
4037
3845
            merger.other_rev_id is not None):
4038
 
            # check if location is a nonexistent file (and not a branch) to
4039
 
            # disambiguate the 'Nothing to do'
4040
 
            if merger.interesting_files:
4041
 
                if not merger.other_tree.has_filename(
4042
 
                    merger.interesting_files[0]):
4043
 
                    note("merger: " + str(merger))
4044
 
                    raise errors.PathsDoNotExist([location])
4045
3846
            note('Nothing to do.')
4046
3847
            return 0
4047
 
        if pull and not preview:
 
3848
        if pull:
4048
3849
            if merger.interesting_files is not None:
4049
3850
                raise errors.BzrCommandError('Cannot pull individual files')
4050
3851
            if (merger.base_rev_id == tree.last_revision()):
4074
3875
    def _do_preview(self, merger):
4075
3876
        from bzrlib.diff import show_diff_trees
4076
3877
        result_tree = self._get_preview(merger)
4077
 
        path_encoding = osutils.get_diff_header_encoding()
4078
3878
        show_diff_trees(merger.this_tree, result_tree, self.outf,
4079
 
                        old_label='', new_label='',
4080
 
                        path_encoding=path_encoding)
 
3879
                        old_label='', new_label='')
4081
3880
 
4082
3881
    def _do_merge(self, merger, change_reporter, allow_pending, verified):
4083
3882
        merger.change_reporter = change_reporter
4159
3958
        if other_revision_id is None:
4160
3959
            other_revision_id = _mod_revision.ensure_null(
4161
3960
                other_branch.last_revision())
4162
 
        # Remember where we merge from. We need to remember if:
4163
 
        # - user specify a location (and we don't merge from the parent
4164
 
        #   branch)
4165
 
        # - user ask to remember or there is no previous location set to merge
4166
 
        #   from and user didn't ask to *not* remember
4167
 
        if (user_location is not None
4168
 
            and ((remember
4169
 
                  or (remember is None
4170
 
                      and tree.branch.get_submit_branch() is None)))):
 
3961
        # Remember where we merge from
 
3962
        if ((remember or tree.branch.get_submit_branch() is None) and
 
3963
             user_location is not None):
4171
3964
            tree.branch.set_submit_branch(other_branch.base)
4172
 
        # Merge tags (but don't set them in the master branch yet, the user
4173
 
        # might revert this merge).  Commit will propagate them.
4174
 
        _merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
 
3965
        _merge_tags_if_possible(other_branch, tree.branch)
4175
3966
        merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4176
3967
            other_revision_id, base_revision_id, other_branch, base_branch)
4177
3968
        if other_path != '':
4278
4069
        from bzrlib.conflicts import restore
4279
4070
        if merge_type is None:
4280
4071
            merge_type = _mod_merge.Merge3Merger
4281
 
        tree, file_list = WorkingTree.open_containing_paths(file_list)
 
4072
        tree, file_list = tree_files(file_list)
4282
4073
        self.add_cleanup(tree.lock_write().unlock)
4283
4074
        parents = tree.get_parent_ids()
4284
4075
        if len(parents) != 2:
4345
4136
    last committed revision is used.
4346
4137
 
4347
4138
    To remove only some changes, without reverting to a prior version, use
4348
 
    merge instead.  For example, "merge . -r -2..-3" (don't forget the ".")
4349
 
    will remove the changes introduced by the second last commit (-2), without
4350
 
    affecting the changes introduced by the last commit (-1).  To remove
4351
 
    certain changes on a hunk-by-hunk basis, see the shelve command.
 
4139
    merge instead.  For example, "merge . --revision -2..-3" will remove the
 
4140
    changes introduced by -2, without affecting the changes introduced by -1.
 
4141
    Or to remove certain changes on a hunk-by-hunk basis, see the Shelf plugin.
4352
4142
 
4353
4143
    By default, any files that have been manually changed will be backed up
4354
4144
    first.  (Files changed only by merge are not backed up.)  Backup files have
4384
4174
    target branches.
4385
4175
    """
4386
4176
 
4387
 
    _see_also = ['cat', 'export', 'merge', 'shelve']
 
4177
    _see_also = ['cat', 'export']
4388
4178
    takes_options = [
4389
4179
        'revision',
4390
4180
        Option('no-backup', "Do not save backups of reverted files."),
4395
4185
 
4396
4186
    def run(self, revision=None, no_backup=False, file_list=None,
4397
4187
            forget_merges=None):
4398
 
        tree, file_list = WorkingTree.open_containing_paths(file_list)
 
4188
        tree, file_list = tree_files(file_list)
4399
4189
        self.add_cleanup(tree.lock_tree_write().unlock)
4400
4190
        if forget_merges:
4401
4191
            tree.set_parent_ids(tree.get_parent_ids()[:1])
4491
4281
    _see_also = ['merge', 'pull']
4492
4282
    takes_args = ['other_branch?']
4493
4283
    takes_options = [
4494
 
        'directory',
4495
4284
        Option('reverse', 'Reverse the order of revisions.'),
4496
4285
        Option('mine-only',
4497
4286
               'Display changes in the local branch only.'),
4519
4308
            theirs_only=False,
4520
4309
            log_format=None, long=False, short=False, line=False,
4521
4310
            show_ids=False, verbose=False, this=False, other=False,
4522
 
            include_merges=False, revision=None, my_revision=None,
4523
 
            directory=u'.'):
 
4311
            include_merges=False, revision=None, my_revision=None):
4524
4312
        from bzrlib.missing import find_unmerged, iter_log_revisions
4525
4313
        def message(s):
4526
4314
            if not is_quiet():
4539
4327
        elif theirs_only:
4540
4328
            restrict = 'remote'
4541
4329
 
4542
 
        local_branch = Branch.open_containing(directory)[0]
 
4330
        local_branch = Branch.open_containing(u".")[0]
4543
4331
        self.add_cleanup(local_branch.lock_read().unlock)
4544
4332
 
4545
4333
        parent = local_branch.get_parent()
4683
4471
 
4684
4472
    @display_command
4685
4473
    def run(self, verbose=False):
4686
 
        from bzrlib import plugin
4687
 
        # Don't give writelines a generator as some codecs don't like that
4688
 
        self.outf.writelines(
4689
 
            list(plugin.describe_plugins(show_paths=verbose)))
 
4474
        import bzrlib.plugin
 
4475
        from inspect import getdoc
 
4476
        result = []
 
4477
        for name, plugin in bzrlib.plugin.plugins().items():
 
4478
            version = plugin.__version__
 
4479
            if version == 'unknown':
 
4480
                version = ''
 
4481
            name_ver = '%s %s' % (name, version)
 
4482
            d = getdoc(plugin.module)
 
4483
            if d:
 
4484
                doc = d.split('\n')[0]
 
4485
            else:
 
4486
                doc = '(no description)'
 
4487
            result.append((name_ver, doc, plugin.path()))
 
4488
        for name_ver, doc, path in sorted(result):
 
4489
            self.outf.write("%s\n" % name_ver)
 
4490
            self.outf.write("   %s\n" % doc)
 
4491
            if verbose:
 
4492
                self.outf.write("   %s\n" % path)
 
4493
            self.outf.write("\n")
4690
4494
 
4691
4495
 
4692
4496
class cmd_testament(Command):
4738
4542
                     Option('long', help='Show commit date in annotations.'),
4739
4543
                     'revision',
4740
4544
                     'show-ids',
4741
 
                     'directory',
4742
4545
                     ]
4743
4546
    encoding_type = 'exact'
4744
4547
 
4745
4548
    @display_command
4746
4549
    def run(self, filename, all=False, long=False, revision=None,
4747
 
            show_ids=False, directory=None):
4748
 
        from bzrlib.annotate import (
4749
 
            annotate_file_tree,
4750
 
            )
 
4550
            show_ids=False):
 
4551
        from bzrlib.annotate import annotate_file, annotate_file_tree
4751
4552
        wt, branch, relpath = \
4752
 
            _open_directory_or_containing_tree_or_branch(filename, directory)
 
4553
            bzrdir.BzrDir.open_containing_tree_or_branch(filename)
4753
4554
        if wt is not None:
4754
4555
            self.add_cleanup(wt.lock_read().unlock)
4755
4556
        else:
4756
4557
            self.add_cleanup(branch.lock_read().unlock)
4757
4558
        tree = _get_one_revision_tree('annotate', revision, branch=branch)
4758
4559
        self.add_cleanup(tree.lock_read().unlock)
4759
 
        if wt is not None and revision is None:
 
4560
        if wt is not None:
4760
4561
            file_id = wt.path2id(relpath)
4761
4562
        else:
4762
4563
            file_id = tree.path2id(relpath)
4763
4564
        if file_id is None:
4764
4565
            raise errors.NotVersionedError(filename)
 
4566
        file_version = tree.inventory[file_id].revision
4765
4567
        if wt is not None and revision is None:
4766
4568
            # If there is a tree and we're not annotating historical
4767
4569
            # versions, annotate the working tree's content.
4768
4570
            annotate_file_tree(wt, file_id, self.outf, long, all,
4769
4571
                show_ids=show_ids)
4770
4572
        else:
4771
 
            annotate_file_tree(tree, file_id, self.outf, long, all,
4772
 
                show_ids=show_ids, branch=branch)
 
4573
            annotate_file(branch, file_version, file_id, long, all, self.outf,
 
4574
                          show_ids=show_ids)
4773
4575
 
4774
4576
 
4775
4577
class cmd_re_sign(Command):
4778
4580
 
4779
4581
    hidden = True # is this right ?
4780
4582
    takes_args = ['revision_id*']
4781
 
    takes_options = ['directory', 'revision']
 
4583
    takes_options = ['revision']
4782
4584
 
4783
 
    def run(self, revision_id_list=None, revision=None, directory=u'.'):
 
4585
    def run(self, revision_id_list=None, revision=None):
4784
4586
        if revision_id_list is not None and revision is not None:
4785
4587
            raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
4786
4588
        if revision_id_list is None and revision is None:
4787
4589
            raise errors.BzrCommandError('You must supply either --revision or a revision_id')
4788
 
        b = WorkingTree.open_containing(directory)[0].branch
 
4590
        b = WorkingTree.open_containing(u'.')[0].branch
4789
4591
        self.add_cleanup(b.lock_write().unlock)
4790
4592
        return self._run(b, revision_id_list, revision)
4791
4593
 
4851
4653
 
4852
4654
    _see_also = ['checkouts', 'unbind']
4853
4655
    takes_args = ['location?']
4854
 
    takes_options = ['directory']
 
4656
    takes_options = []
4855
4657
 
4856
 
    def run(self, location=None, directory=u'.'):
4857
 
        b, relpath = Branch.open_containing(directory)
 
4658
    def run(self, location=None):
 
4659
        b, relpath = Branch.open_containing(u'.')
4858
4660
        if location is None:
4859
4661
            try:
4860
4662
                location = b.get_old_bound_location()
4887
4689
 
4888
4690
    _see_also = ['checkouts', 'bind']
4889
4691
    takes_args = []
4890
 
    takes_options = ['directory']
 
4692
    takes_options = []
4891
4693
 
4892
 
    def run(self, directory=u'.'):
4893
 
        b, relpath = Branch.open_containing(directory)
 
4694
    def run(self):
 
4695
        b, relpath = Branch.open_containing(u'.')
4894
4696
        if not b.unbind():
4895
4697
            raise errors.BzrCommandError('Local branch is not bound')
4896
4698
 
4989
4791
            self.outf.write('The above revision(s) will be removed.\n')
4990
4792
 
4991
4793
        if not force:
4992
 
            if not ui.ui_factory.confirm_action(
4993
 
                    u'Uncommit these revisions',
4994
 
                    'bzrlib.builtins.uncommit',
4995
 
                    {}):
4996
 
                self.outf.write('Canceled\n')
 
4794
            if not ui.ui_factory.get_boolean('Are you sure'):
 
4795
                self.outf.write('Canceled')
4997
4796
                return 0
4998
4797
 
4999
4798
        mutter('Uncommitting from {%s} to {%s}',
5005
4804
 
5006
4805
 
5007
4806
class cmd_break_lock(Command):
5008
 
    __doc__ = """Break a dead lock.
5009
 
 
5010
 
    This command breaks a lock on a repository, branch, working directory or
5011
 
    config file.
 
4807
    __doc__ = """Break a dead lock on a repository, branch or working directory.
5012
4808
 
5013
4809
    CAUTION: Locks should only be broken when you are sure that the process
5014
4810
    holding the lock has been stopped.
5019
4815
    :Examples:
5020
4816
        bzr break-lock
5021
4817
        bzr break-lock bzr+ssh://example.com/bzr/foo
5022
 
        bzr break-lock --conf ~/.bazaar
5023
4818
    """
5024
 
 
5025
4819
    takes_args = ['location?']
5026
 
    takes_options = [
5027
 
        Option('config',
5028
 
               help='LOCATION is the directory where the config lock is.'),
5029
 
        Option('force',
5030
 
            help='Do not ask for confirmation before breaking the lock.'),
5031
 
        ]
5032
4820
 
5033
 
    def run(self, location=None, config=False, force=False):
 
4821
    def run(self, location=None, show=False):
5034
4822
        if location is None:
5035
4823
            location = u'.'
5036
 
        if force:
5037
 
            ui.ui_factory = ui.ConfirmationUserInterfacePolicy(ui.ui_factory,
5038
 
                None,
5039
 
                {'bzrlib.lockdir.break': True})
5040
 
        if config:
5041
 
            conf = _mod_config.LockableConfig(file_name=location)
5042
 
            conf.break_lock()
5043
 
        else:
5044
 
            control, relpath = bzrdir.BzrDir.open_containing(location)
5045
 
            try:
5046
 
                control.break_lock()
5047
 
            except NotImplementedError:
5048
 
                pass
 
4824
        control, relpath = bzrdir.BzrDir.open_containing(location)
 
4825
        try:
 
4826
            control.break_lock()
 
4827
        except NotImplementedError:
 
4828
            pass
5049
4829
 
5050
4830
 
5051
4831
class cmd_wait_until_signalled(Command):
5080
4860
                    'result in a dynamically allocated port.  The default port '
5081
4861
                    'depends on the protocol.',
5082
4862
               type=str),
5083
 
        custom_help('directory',
5084
 
               help='Serve contents of this directory.'),
 
4863
        Option('directory',
 
4864
               help='Serve contents of this directory.',
 
4865
               type=unicode),
5085
4866
        Option('allow-writes',
5086
4867
               help='By default the server is a readonly server.  Supplying '
5087
4868
                    '--allow-writes enables write access to the contents of '
5114
4895
 
5115
4896
    def run(self, port=None, inet=False, directory=None, allow_writes=False,
5116
4897
            protocol=None):
5117
 
        from bzrlib import transport
 
4898
        from bzrlib.transport import get_transport, transport_server_registry
5118
4899
        if directory is None:
5119
4900
            directory = os.getcwd()
5120
4901
        if protocol is None:
5121
 
            protocol = transport.transport_server_registry.get()
 
4902
            protocol = transport_server_registry.get()
5122
4903
        host, port = self.get_host_and_port(port)
5123
4904
        url = urlutils.local_path_to_url(directory)
5124
4905
        if not allow_writes:
5125
4906
            url = 'readonly+' + url
5126
 
        t = transport.get_transport(url)
5127
 
        protocol(t, host, port, inet)
 
4907
        transport = get_transport(url)
 
4908
        protocol(transport, host, port, inet)
5128
4909
 
5129
4910
 
5130
4911
class cmd_join(Command):
5136
4917
    not part of it.  (Such trees can be produced by "bzr split", but also by
5137
4918
    running "bzr branch" with the target inside a tree.)
5138
4919
 
5139
 
    The result is a combined tree, with the subtree no longer an independent
 
4920
    The result is a combined tree, with the subtree no longer an independant
5140
4921
    part.  This is marked as a merge of the subtree into the containing tree,
5141
4922
    and all history is preserved.
5142
4923
    """
5223
5004
    _see_also = ['send']
5224
5005
 
5225
5006
    takes_options = [
5226
 
        'directory',
5227
5007
        RegistryOption.from_kwargs('patch-type',
5228
5008
            'The type of patch to include in the directive.',
5229
5009
            title='Patch type',
5242
5022
    encoding_type = 'exact'
5243
5023
 
5244
5024
    def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
5245
 
            sign=False, revision=None, mail_to=None, message=None,
5246
 
            directory=u'.'):
 
5025
            sign=False, revision=None, mail_to=None, message=None):
5247
5026
        from bzrlib.revision import ensure_null, NULL_REVISION
5248
5027
        include_patch, include_bundle = {
5249
5028
            'plain': (False, False),
5250
5029
            'diff': (True, False),
5251
5030
            'bundle': (True, True),
5252
5031
            }[patch_type]
5253
 
        branch = Branch.open(directory)
 
5032
        branch = Branch.open('.')
5254
5033
        stored_submit_branch = branch.get_submit_branch()
5255
5034
        if submit_branch is None:
5256
5035
            submit_branch = stored_submit_branch
5332
5111
    source branch defaults to that containing the working directory, but can
5333
5112
    be changed using --from.
5334
5113
 
5335
 
    Both the submit branch and the public branch follow the usual behavior with
5336
 
    respect to --remember: If there is no default location set, the first send
5337
 
    will set it (use --no-remember to avoid settting it). After that, you can
5338
 
    omit the location to use the default.  To change the default, use
5339
 
    --remember. The value will only be saved if the location can be accessed.
5340
 
 
5341
5114
    In order to calculate those changes, bzr must analyse the submit branch.
5342
5115
    Therefore it is most efficient for the submit branch to be a local mirror.
5343
5116
    If a public location is known for the submit_branch, that location is used
5347
5120
    given, in which case it is sent to a file.
5348
5121
 
5349
5122
    Mail is sent using your preferred mail program.  This should be transparent
5350
 
    on Windows (it uses MAPI).  On Unix, it requires the xdg-email utility.
 
5123
    on Windows (it uses MAPI).  On Linux, it requires the xdg-email utility.
5351
5124
    If the preferred client can't be found (or used), your editor will be used.
5352
5125
 
5353
5126
    To use a specific mail program, set the mail_client configuration option.
5412
5185
        ]
5413
5186
 
5414
5187
    def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5415
 
            no_patch=False, revision=None, remember=None, output=None,
 
5188
            no_patch=False, revision=None, remember=False, output=None,
5416
5189
            format=None, mail_to=None, message=None, body=None,
5417
5190
            strict=None, **kwargs):
5418
5191
        from bzrlib.send import send
5524
5297
        Option('delete',
5525
5298
            help='Delete this tag rather than placing it.',
5526
5299
            ),
5527
 
        custom_help('directory',
5528
 
            help='Branch in which to place the tag.'),
 
5300
        Option('directory',
 
5301
            help='Branch in which to place the tag.',
 
5302
            short_name='d',
 
5303
            type=unicode,
 
5304
            ),
5529
5305
        Option('force',
5530
5306
            help='Replace existing tags.',
5531
5307
            ),
5544
5320
            if tag_name is None:
5545
5321
                raise errors.BzrCommandError("No tag specified to delete.")
5546
5322
            branch.tags.delete_tag(tag_name)
5547
 
            note('Deleted tag %s.' % tag_name)
 
5323
            self.outf.write('Deleted tag %s.\n' % tag_name)
5548
5324
        else:
5549
5325
            if revision:
5550
5326
                if len(revision) != 1:
5562
5338
            if (not force) and branch.tags.has_tag(tag_name):
5563
5339
                raise errors.TagAlreadyExists(tag_name)
5564
5340
            branch.tags.set_tag(tag_name, revision_id)
5565
 
            note('Created tag %s.' % tag_name)
 
5341
            self.outf.write('Created tag %s.\n' % tag_name)
5566
5342
 
5567
5343
 
5568
5344
class cmd_tags(Command):
5573
5349
 
5574
5350
    _see_also = ['tag']
5575
5351
    takes_options = [
5576
 
        custom_help('directory',
5577
 
            help='Branch whose tags should be displayed.'),
5578
 
        RegistryOption('sort',
 
5352
        Option('directory',
 
5353
            help='Branch whose tags should be displayed.',
 
5354
            short_name='d',
 
5355
            type=unicode,
 
5356
            ),
 
5357
        RegistryOption.from_kwargs('sort',
5579
5358
            'Sort tags by different criteria.', title='Sorting',
5580
 
            lazy_registry=('bzrlib.tag', 'tag_sort_methods')
 
5359
            alpha='Sort tags lexicographically (default).',
 
5360
            time='Sort tags chronologically.',
5581
5361
            ),
5582
5362
        'show-ids',
5583
5363
        'revision',
5584
5364
    ]
5585
5365
 
5586
5366
    @display_command
5587
 
    def run(self, directory='.', sort=None, show_ids=False, revision=None):
5588
 
        from bzrlib.tag import tag_sort_methods
 
5367
    def run(self,
 
5368
            directory='.',
 
5369
            sort='alpha',
 
5370
            show_ids=False,
 
5371
            revision=None,
 
5372
            ):
5589
5373
        branch, relpath = Branch.open_containing(directory)
5590
5374
 
5591
5375
        tags = branch.tags.get_tag_dict().items()
5600
5384
            # only show revisions between revid1 and revid2 (inclusive)
5601
5385
            tags = [(tag, revid) for tag, revid in tags if
5602
5386
                graph.is_between(revid, revid1, revid2)]
5603
 
        if sort is None:
5604
 
            sort = tag_sort_methods.get()
5605
 
        sort(branch, tags)
 
5387
        if sort == 'alpha':
 
5388
            tags.sort()
 
5389
        elif sort == 'time':
 
5390
            timestamps = {}
 
5391
            for tag, revid in tags:
 
5392
                try:
 
5393
                    revobj = branch.repository.get_revision(revid)
 
5394
                except errors.NoSuchRevision:
 
5395
                    timestamp = sys.maxint # place them at the end
 
5396
                else:
 
5397
                    timestamp = revobj.timestamp
 
5398
                timestamps[revid] = timestamp
 
5399
            tags.sort(key=lambda x: timestamps[x[1]])
5606
5400
        if not show_ids:
5607
5401
            # [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5608
5402
            for index, (tag, revid) in enumerate(tags):
5610
5404
                    revno = branch.revision_id_to_dotted_revno(revid)
5611
5405
                    if isinstance(revno, tuple):
5612
5406
                        revno = '.'.join(map(str, revno))
5613
 
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
 
5407
                except errors.NoSuchRevision:
5614
5408
                    # Bad tag data/merges can lead to tagged revisions
5615
5409
                    # which are not in this branch. Fail gracefully ...
5616
5410
                    revno = '?'
5674
5468
            unstacked=None):
5675
5469
        directory = bzrdir.BzrDir.open(location)
5676
5470
        if stacked_on and unstacked:
5677
 
            raise errors.BzrCommandError("Can't use both --stacked-on and --unstacked")
 
5471
            raise BzrCommandError("Can't use both --stacked-on and --unstacked")
5678
5472
        elif stacked_on is not None:
5679
5473
            reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5680
5474
        elif unstacked:
5735
5529
    """
5736
5530
 
5737
5531
    takes_args = ['to_location?']
5738
 
    takes_options = ['directory',
5739
 
                     Option('force',
 
5532
    takes_options = [Option('force',
5740
5533
                        help='Switch even if local commits will be lost.'),
5741
5534
                     'revision',
5742
5535
                     Option('create-branch', short_name='b',
5745
5538
                    ]
5746
5539
 
5747
5540
    def run(self, to_location=None, force=False, create_branch=False,
5748
 
            revision=None, directory=u'.'):
 
5541
            revision=None):
5749
5542
        from bzrlib import switch
5750
 
        tree_location = directory
 
5543
        tree_location = '.'
5751
5544
        revision = _get_one_revision('switch', revision)
5752
5545
        control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5753
5546
        if to_location is None:
5754
5547
            if revision is None:
5755
5548
                raise errors.BzrCommandError('You must supply either a'
5756
5549
                                             ' revision or a location')
5757
 
            to_location = tree_location
 
5550
            to_location = '.'
5758
5551
        try:
5759
5552
            branch = control_dir.open_branch()
5760
5553
            had_explicit_nick = branch.get_config().has_explicit_nickname()
5895
5688
            name=None,
5896
5689
            switch=None,
5897
5690
            ):
5898
 
        tree, file_list = WorkingTree.open_containing_paths(file_list,
5899
 
            apply_view=False)
 
5691
        tree, file_list = tree_files(file_list, apply_view=False)
5900
5692
        current_view, view_dict = tree.views.get_view_info()
5901
5693
        if name is None:
5902
5694
            name = current_view
6006
5798
            location = "."
6007
5799
        branch = Branch.open_containing(location)[0]
6008
5800
        branch.bzrdir.destroy_branch()
6009
 
 
 
5801
        
6010
5802
 
6011
5803
class cmd_shelve(Command):
6012
5804
    __doc__ = """Temporarily set aside some changes from the current tree.
6031
5823
 
6032
5824
    You can put multiple items on the shelf, and by default, 'unshelve' will
6033
5825
    restore the most recently shelved changes.
6034
 
 
6035
 
    For complicated changes, it is possible to edit the changes in a separate
6036
 
    editor program to decide what the file remaining in the working copy
6037
 
    should look like.  To do this, add the configuration option
6038
 
 
6039
 
        change_editor = PROGRAM @new_path @old_path
6040
 
 
6041
 
    where @new_path is replaced with the path of the new version of the 
6042
 
    file and @old_path is replaced with the path of the old version of 
6043
 
    the file.  The PROGRAM should save the new file with the desired 
6044
 
    contents of the file in the working tree.
6045
 
        
6046
5826
    """
6047
5827
 
6048
5828
    takes_args = ['file*']
6049
5829
 
6050
5830
    takes_options = [
6051
 
        'directory',
6052
5831
        'revision',
6053
5832
        Option('all', help='Shelve all changes.'),
6054
5833
        'message',
6060
5839
        Option('destroy',
6061
5840
               help='Destroy removed changes instead of shelving them.'),
6062
5841
    ]
6063
 
    _see_also = ['unshelve', 'configuration']
 
5842
    _see_also = ['unshelve']
6064
5843
 
6065
5844
    def run(self, revision=None, all=False, file_list=None, message=None,
6066
 
            writer=None, list=False, destroy=False, directory=None):
 
5845
            writer=None, list=False, destroy=False):
6067
5846
        if list:
6068
 
            return self.run_for_list(directory=directory)
 
5847
            return self.run_for_list()
6069
5848
        from bzrlib.shelf_ui import Shelver
6070
5849
        if writer is None:
6071
5850
            writer = bzrlib.option.diff_writer_registry.get()
6072
5851
        try:
6073
5852
            shelver = Shelver.from_args(writer(sys.stdout), revision, all,
6074
 
                file_list, message, destroy=destroy, directory=directory)
 
5853
                file_list, message, destroy=destroy)
6075
5854
            try:
6076
5855
                shelver.run()
6077
5856
            finally:
6079
5858
        except errors.UserAbort:
6080
5859
            return 0
6081
5860
 
6082
 
    def run_for_list(self, directory=None):
6083
 
        if directory is None:
6084
 
            directory = u'.'
6085
 
        tree = WorkingTree.open_containing(directory)[0]
 
5861
    def run_for_list(self):
 
5862
        tree = WorkingTree.open_containing('.')[0]
6086
5863
        self.add_cleanup(tree.lock_read().unlock)
6087
5864
        manager = tree.get_shelf_manager()
6088
5865
        shelves = manager.active_shelves()
6107
5884
 
6108
5885
    takes_args = ['shelf_id?']
6109
5886
    takes_options = [
6110
 
        'directory',
6111
5887
        RegistryOption.from_kwargs(
6112
5888
            'action', help="The action to perform.",
6113
5889
            enum_switch=False, value_switches=True,
6121
5897
    ]
6122
5898
    _see_also = ['shelve']
6123
5899
 
6124
 
    def run(self, shelf_id=None, action='apply', directory=u'.'):
 
5900
    def run(self, shelf_id=None, action='apply'):
6125
5901
        from bzrlib.shelf_ui import Unshelver
6126
 
        unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
 
5902
        unshelver = Unshelver.from_args(shelf_id, action)
6127
5903
        try:
6128
5904
            unshelver.run()
6129
5905
        finally:
6145
5921
 
6146
5922
    To check what clean-tree will do, use --dry-run.
6147
5923
    """
6148
 
    takes_options = ['directory',
6149
 
                     Option('ignored', help='Delete all ignored files.'),
6150
 
                     Option('detritus', help='Delete conflict files, merge and revert'
 
5924
    takes_options = [Option('ignored', help='Delete all ignored files.'),
 
5925
                     Option('detritus', help='Delete conflict files, merge'
6151
5926
                            ' backups, and failed selftest dirs.'),
6152
5927
                     Option('unknown',
6153
5928
                            help='Delete files unknown to bzr (default).'),
6155
5930
                            ' deleting them.'),
6156
5931
                     Option('force', help='Do not prompt before deleting.')]
6157
5932
    def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
6158
 
            force=False, directory=u'.'):
 
5933
            force=False):
6159
5934
        from bzrlib.clean_tree import clean_tree
6160
5935
        if not (unknown or ignored or detritus):
6161
5936
            unknown = True
6162
5937
        if dry_run:
6163
5938
            force = True
6164
 
        clean_tree(directory, unknown=unknown, ignored=ignored,
6165
 
                   detritus=detritus, dry_run=dry_run, no_prompt=force)
 
5939
        clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
 
5940
                   dry_run=dry_run, no_prompt=force)
6166
5941
 
6167
5942
 
6168
5943
class cmd_reference(Command):
6212
5987
            self.outf.write('%s %s\n' % (path, location))
6213
5988
 
6214
5989
 
6215
 
class cmd_export_pot(Command):
6216
 
    __doc__ = """Export command helps and error messages in po format."""
6217
 
 
6218
 
    hidden = True
6219
 
 
6220
 
    def run(self):
6221
 
        from bzrlib.export_pot import export_pot
6222
 
        export_pot(self.outf)
6223
 
 
6224
 
 
6225
5990
def _register_lazy_builtins():
6226
5991
    # register lazy builtins from other modules; called at startup and should
6227
5992
    # be only called once.
6228
5993
    for (name, aliases, module_name) in [
6229
5994
        ('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6230
 
        ('cmd_config', [], 'bzrlib.config'),
6231
5995
        ('cmd_dpush', [], 'bzrlib.foreign'),
6232
5996
        ('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6233
5997
        ('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6234
5998
        ('cmd_conflicts', [], 'bzrlib.conflicts'),
6235
 
        ('cmd_sign_my_commits', [], 'bzrlib.commit_signature_commands'),
6236
 
        ('cmd_verify_signatures', [],
6237
 
                                        'bzrlib.commit_signature_commands'),
6238
 
        ('cmd_test_script', [], 'bzrlib.cmd_test_script'),
 
5999
        ('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6239
6000
        ]:
6240
6001
        builtin_command_registry.register_lazy(name, aliases, module_name)