60
60
from bzrlib.workingtree import WorkingTree
63
from bzrlib.commands import Command, display_command
63
from bzrlib.commands import (
65
builtin_command_registry,
64
68
from bzrlib.option import (
330
334
class cmd_cat_revision(Command):
331
"""Write out metadata for a revision.
335
__doc__ = """Write out metadata for a revision.
333
337
The revision to print can either be specified by a specific
334
338
revision identifier, or you can use --revision.
388
392
class cmd_dump_btree(Command):
389
"""Dump the contents of a btree index file to stdout.
393
__doc__ = """Dump the contents of a btree index file to stdout.
391
395
PATH is a btree index file, it can be any URL. This includes things like
392
396
.bzr/repository/pack-names, or .bzr/repository/indices/a34b3a...ca4a4.iix
456
460
for node in bt.iter_all_entries():
457
461
# Node is made up of:
458
462
# (index, key, value, [references])
459
refs_as_tuples = static_tuple.as_tuples(node[3])
466
refs_as_tuples = None
468
refs_as_tuples = static_tuple.as_tuples(refs)
460
469
as_tuple = (tuple(node[1]), node[2], refs_as_tuples)
461
470
self.outf.write('%s\n' % (as_tuple,))
464
473
class cmd_remove_tree(Command):
465
"""Remove the working tree from a given branch/checkout.
474
__doc__ = """Remove the working tree from a given branch/checkout.
467
476
Since a lightweight checkout is little more than a working tree
468
477
this will refuse to run against one.
495
504
if (working.has_changes()):
496
505
raise errors.UncommittedChanges(working)
498
working_path = working.bzrdir.root_transport.base
499
branch_path = working.branch.bzrdir.root_transport.base
500
if working_path != branch_path:
507
if working.user_url != working.branch.user_url:
501
508
raise errors.BzrCommandError("You cannot remove the working tree"
502
509
" from a lightweight checkout")
980
987
tree_to = WorkingTree.open_containing(directory)[0]
981
988
branch_to = tree_to.branch
990
self.add_cleanup(tree_to.unlock)
982
991
except errors.NoWorkingTree:
984
993
branch_to = Branch.open_containing(directory)[0]
994
branch_to.lock_write()
995
self.add_cleanup(branch_to.unlock)
986
997
if local and not branch_to.get_bound_location():
987
998
raise errors.LocalRequiresBoundBranch()
1019
1030
branch_from = Branch.open(location,
1020
1031
possible_transports=possible_transports)
1032
branch_from.lock_read()
1033
self.add_cleanup(branch_from.unlock)
1022
1035
if branch_to.get_parent() is None or remember:
1023
1036
branch_to.set_parent(branch_from.base)
1025
if branch_from is not branch_to:
1026
branch_from.lock_read()
1027
self.add_cleanup(branch_from.unlock)
1028
1038
if revision is not None:
1029
1039
revision_id = revision.as_revision_id(branch_from)
1031
branch_to.lock_write()
1032
self.add_cleanup(branch_to.unlock)
1033
1041
if tree_to is not None:
1034
1042
view_info = _get_view_info_for_change_reporter(tree_to)
1035
1043
change_reporter = delta._ChangeReporter(
1117
1125
# Get the source branch
1118
1126
(tree, br_from,
1119
1127
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1121
strict = br_from.get_config().get_user_option_as_bool('push_strict')
1122
if strict is None: strict = True # default value
1123
1128
# Get the tip's revision_id
1124
1129
revision = _get_one_revision('push', revision)
1125
1130
if revision is not None:
1126
1131
revision_id = revision.in_history(br_from).rev_id
1128
1133
revision_id = None
1129
if strict and tree is not None and revision_id is None:
1130
if (tree.has_changes()):
1131
raise errors.UncommittedChanges(
1132
tree, more='Use --no-strict to force the push.')
1133
if tree.last_revision() != tree.branch.last_revision():
1134
# The tree has lost sync with its branch, there is little
1135
# chance that the user is aware of it but he can still force
1136
# the push with --no-strict
1137
raise errors.OutOfDateTree(
1138
tree, more='Use --no-strict to force the push.')
1134
if tree is not None and revision_id is None:
1135
tree.check_changed_or_out_of_date(
1136
strict, 'push_strict',
1137
more_error='Use --no-strict to force the push.',
1138
more_warning='Uncommitted changes will not be pushed.')
1140
1139
# Get the stacked_on branch, if any
1141
1140
if stacked_on is not None:
1142
1141
stacked_on = urlutils.normalize_url(stacked_on)
1176
1175
class cmd_branch(Command):
1177
"""Create a new branch that is a copy of an existing branch.
1176
__doc__ = """Create a new branch that is a copy of an existing branch.
1179
1178
If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
1180
1179
be used. In other words, "branch ../foo/bar" will attempt to create ./bar.
1289
1288
class cmd_checkout(Command):
1290
"""Create a new checkout of an existing branch.
1289
__doc__ = """Create a new checkout of an existing branch.
1292
1291
If BRANCH_LOCATION is omitted, checkout will reconstitute a working tree for
1293
1292
the branch found in '.'. This is useful if you have removed the working tree
1390
1389
class cmd_update(Command):
1391
"""Update a tree to have the latest code committed to its branch.
1390
__doc__ = """Update a tree to have the latest code committed to its branch.
1393
1392
This will perform a merge into the working tree, and may generate
1394
1393
conflicts. If you have any local changes, you will still
1423
1422
branch_location = tree.branch.base
1424
1423
self.add_cleanup(tree.unlock)
1425
1424
# get rid of the final '/' and be ready for display
1426
branch_location = urlutils.unescape_for_display(branch_location[:-1],
1425
branch_location = urlutils.unescape_for_display(
1426
branch_location.rstrip('/'),
1428
1428
existing_pending_merges = tree.get_parent_ids()[1:]
1429
1429
if master is None:
1439
1439
revision_id = branch.last_revision()
1440
1440
if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1441
revno = branch.revision_id_to_revno(revision_id)
1442
note("Tree is up to date at revision %d of branch %s" %
1443
(revno, branch_location))
1441
revno = branch.revision_id_to_dotted_revno(revision_id)
1442
note("Tree is up to date at revision %s of branch %s" %
1443
('.'.join(map(str, revno)), branch_location))
1445
1445
view_info = _get_view_info_for_change_reporter(tree)
1446
1446
change_reporter = delta._ChangeReporter(
1458
1458
"bzr update --revision only works"
1459
1459
" for a revision in the branch history"
1460
1460
% (e.revision))
1461
revno = tree.branch.revision_id_to_revno(
1461
revno = tree.branch.revision_id_to_dotted_revno(
1462
1462
_mod_revision.ensure_null(tree.last_revision()))
1463
note('Updated to revision %d of branch %s' %
1464
(revno, branch_location))
1465
if tree.get_parent_ids()[1:] != existing_pending_merges:
1463
note('Updated to revision %s of branch %s' %
1464
('.'.join(map(str, revno)), branch_location))
1465
parent_ids = tree.get_parent_ids()
1466
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1466
1467
note('Your local commits will now show as pending merges with '
1467
1468
"'bzr status', and can be committed with 'bzr commit'.")
1468
1469
if conflicts != 0:
1474
1475
class cmd_info(Command):
1475
"""Show information about a working tree, branch or repository.
1476
__doc__ = """Show information about a working tree, branch or repository.
1477
1478
This command will show all known locations and formats associated to the
1478
1479
tree, branch or repository.
1572
1573
class cmd_file_id(Command):
1573
"""Print file_id of a particular file or directory.
1574
__doc__ = """Print file_id of a particular file or directory.
1575
1576
The file_id is assigned when the file is first added and remains the
1576
1577
same through all revisions where the file exists, even when it is
1594
1595
class cmd_file_path(Command):
1595
"""Print path of file_ids to a file or directory.
1596
__doc__ = """Print path of file_ids to a file or directory.
1597
1598
This prints one line for each directory down to the target,
1598
1599
starting at the branch root.
1660
1661
class cmd_ancestry(Command):
1661
"""List all revisions merged into this branch."""
1662
__doc__ = """List all revisions merged into this branch."""
1663
1664
_see_also = ['log', 'revision-history']
1664
1665
takes_args = ['location?']
1794
1795
class cmd_init_repository(Command):
1795
"""Create a shared repository for branches to share storage space.
1796
__doc__ = """Create a shared repository for branches to share storage space.
1797
1798
New branches created under the repository directory will store their
1798
1799
revisions in the repository, not in the branch directory. For branches
1854
1855
class cmd_diff(Command):
1855
"""Show differences in the working tree, between revisions or branches.
1856
__doc__ = """Show differences in the working tree, between revisions or branches.
1857
1858
If no arguments are given, all changes for the current tree are listed.
1858
1859
If files are given, only the changes in those files are listed.
1944
1945
help='Use this command to compare files.',
1948
RegistryOption('format',
1949
help='Diff format to use.',
1950
lazy_registry=('bzrlib.diff', 'format_registry'),
1951
value_switches=False, title='Diff format'),
1948
1953
aliases = ['di', 'dif']
1949
1954
encoding_type = 'exact'
1951
1956
@display_command
1952
1957
def run(self, revision=None, file_list=None, diff_options=None,
1953
prefix=None, old=None, new=None, using=None):
1954
from bzrlib.diff import get_trees_and_branches_to_diff, show_diff_trees
1958
prefix=None, old=None, new=None, using=None, format=None):
1959
from bzrlib.diff import (get_trees_and_branches_to_diff_locked,
1956
1962
if (prefix is None) or (prefix == '0'):
1957
1963
# diff -p0 format
1971
1977
raise errors.BzrCommandError('bzr diff --revision takes exactly'
1972
1978
' one or two revision specifiers')
1980
if using is not None and format is not None:
1981
raise errors.BzrCommandError('--using and --format are mutually '
1974
1984
(old_tree, new_tree,
1975
1985
old_branch, new_branch,
1976
specific_files, extra_trees) = get_trees_and_branches_to_diff(
1977
file_list, revision, old, new, apply_view=True)
1986
specific_files, extra_trees) = get_trees_and_branches_to_diff_locked(
1987
file_list, revision, old, new, self.add_cleanup, apply_view=True)
1978
1988
return show_diff_trees(old_tree, new_tree, sys.stdout,
1979
1989
specific_files=specific_files,
1980
1990
external_diff_options=diff_options,
1981
1991
old_label=old_label, new_label=new_label,
1982
extra_trees=extra_trees, using=using)
1992
extra_trees=extra_trees, using=using,
1985
1996
class cmd_deleted(Command):
1986
"""List files deleted in the working tree.
1997
__doc__ = """List files deleted in the working tree.
1988
1999
# TODO: Show files deleted since a previous revision, or
1989
2000
# between two revisions.
2288
2299
help='Show changes made in each revision as a patch.'),
2289
2300
Option('include-merges',
2290
2301
help='Show merged revisions like --levels 0 does.'),
2302
Option('exclude-common-ancestry',
2303
help='Display only the revisions that are not part'
2304
' of both ancestries (require -rX..Y)'
2292
2307
encoding_type = 'replace'
2305
2320
show_diff=False,
2306
include_merges=False):
2321
include_merges=False,
2322
exclude_common_ancestry=False,
2307
2324
from bzrlib.log import (
2309
2326
make_log_request_dict,
2310
2327
_get_info_for_log_files,
2312
2329
direction = (forward and 'forward') or 'reverse'
2330
if (exclude_common_ancestry
2331
and (revision is None or len(revision) != 2)):
2332
raise errors.BzrCommandError(
2333
'--exclude-common-ancestry requires -r with two revisions')
2313
2334
if include_merges:
2314
2335
if levels is None:
2408
2429
direction=direction, specific_fileids=file_ids,
2409
2430
start_revision=rev1, end_revision=rev2, limit=limit,
2410
2431
message_search=message, delta_type=delta_type,
2411
diff_type=diff_type, _match_using_deltas=match_using_deltas)
2432
diff_type=diff_type, _match_using_deltas=match_using_deltas,
2433
exclude_common_ancestry=exclude_common_ancestry,
2412
2435
Logger(b, rqst).show(lf)
2433
2456
raise errors.BzrCommandError(
2434
2457
"bzr %s doesn't accept two revisions in different"
2435
2458
" branches." % command_name)
2436
rev1 = start_spec.in_history(branch)
2459
if start_spec.spec is None:
2460
# Avoid loading all the history.
2461
rev1 = RevisionInfo(branch, None, None)
2463
rev1 = start_spec.in_history(branch)
2437
2464
# Avoid loading all of history when we know a missing
2438
2465
# end of range means the last revision ...
2439
2466
if end_spec.spec is None:
2634
2661
using this command or directly by using an editor, be sure to commit
2664
Bazaar also supports a global ignore file ~/.bazaar/ignore. On Windows
2665
the global ignore file can be found in the application data directory as
2666
C:\\Documents and Settings\\<user>\\Application Data\\Bazaar\\2.0\\ignore.
2667
Global ignores are not touched by this command. The global ignore file
2668
can be edited directly using an editor.
2637
2670
Patterns prefixed with '!' are exceptions to ignore patterns and take
2638
2671
precedence over regular ignores. Such exceptions are used to specify
2639
2672
files that should be versioned which would otherwise be ignored.
2680
2713
_see_also = ['status', 'ignored', 'patterns']
2681
2714
takes_args = ['name_pattern*']
2682
2715
takes_options = [
2683
Option('old-default-rules',
2684
help='Write out the ignore rules bzr < 0.9 always used.')
2716
Option('default-rules',
2717
help='Display the default ignore rules that bzr uses.')
2687
def run(self, name_pattern_list=None, old_default_rules=None):
2720
def run(self, name_pattern_list=None, default_rules=None):
2688
2721
from bzrlib import ignores
2689
if old_default_rules is not None:
2690
# dump the rules and exit
2691
for pattern in ignores.OLD_DEFAULTS:
2722
if default_rules is not None:
2723
# dump the default rules and exit
2724
for pattern in ignores.USER_DEFAULTS:
2692
2725
self.outf.write("%s\n" % pattern)
2694
2727
if not name_pattern_list:
2695
2728
raise errors.BzrCommandError("ignore requires at least one "
2696
"NAME_PATTERN or --old-default-rules")
2729
"NAME_PATTERN or --default-rules.")
2697
2730
name_pattern_list = [globbing.normalize_pattern(p)
2698
2731
for p in name_pattern_list]
2699
2732
for name_pattern in name_pattern_list:
2808
2841
help="Name of the root directory inside the exported file."),
2842
Option('per-file-timestamps',
2843
help='Set modification time of files to that of the last '
2844
'revision in which it was changed.'),
2810
2846
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2811
root=None, filters=False):
2847
root=None, filters=False, per_file_timestamps=False):
2812
2848
from bzrlib.export import export
2814
2850
if branch_or_subdir is None:
2822
2858
rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
2824
export(rev_tree, dest, format, root, subdir, filtered=filters)
2860
export(rev_tree, dest, format, root, subdir, filtered=filters,
2861
per_file_timestamps=per_file_timestamps)
2825
2862
except errors.NoSuchExportFormat, e:
2826
2863
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
2829
2866
class cmd_cat(Command):
2830
"""Write the contents of a file as of a given revision to standard output.
2867
__doc__ = """Write the contents of a file as of a given revision to standard output.
2832
2869
If no revision is nominated, the last revision is used.
3036
3073
"the master branch until a normal commit "
3037
3074
"is performed."
3076
Option('show-diff', short_name='p',
3040
3077
help='When no message is supplied, show the diff along'
3041
3078
' with the status summary in the message editor.'),
3122
3159
'(use --file "%(f)s" to take commit message from that file)'
3123
3160
% { 'f': message })
3124
3161
ui.ui_factory.show_warning(warning_msg)
3163
message = message.replace('\r\n', '\n')
3164
message = message.replace('\r', '\n')
3166
raise errors.BzrCommandError(
3167
"please specify either --message or --file")
3126
3169
def get_message(commit_obj):
3127
3170
"""Callback to get commit message"""
3128
my_message = message
3129
if my_message is not None and '\r' in my_message:
3130
my_message = my_message.replace('\r\n', '\n')
3131
my_message = my_message.replace('\r', '\n')
3132
if my_message is None and not file:
3133
t = make_commit_message_template_encoded(tree,
3172
my_message = codecs.open(
3173
file, 'rt', osutils.get_user_encoding()).read()
3174
elif message is not None:
3175
my_message = message
3177
# No message supplied: make one up.
3178
# text is the status of the tree
3179
text = make_commit_message_template_encoded(tree,
3134
3180
selected_list, diff=show_diff,
3135
3181
output_encoding=osutils.get_user_encoding())
3182
# start_message is the template generated from hooks
3183
# XXX: Warning - looks like hooks return unicode,
3184
# make_commit_message_template_encoded returns user encoding.
3185
# We probably want to be using edit_commit_message instead to
3136
3187
start_message = generate_commit_message_template(commit_obj)
3137
my_message = edit_commit_message_encoded(t,
3188
my_message = edit_commit_message_encoded(text,
3138
3189
start_message=start_message)
3139
3190
if my_message is None:
3140
3191
raise errors.BzrCommandError("please specify a commit"
3141
3192
" message with either --message or --file")
3142
elif my_message and file:
3143
raise errors.BzrCommandError(
3144
"please specify either --message or --file")
3146
my_message = codecs.open(file, 'rt',
3147
osutils.get_user_encoding()).read()
3148
3193
if my_message == "":
3149
3194
raise errors.BzrCommandError("empty commit message specified")
3150
3195
return my_message
3162
3207
timezone=offset,
3163
3208
exclude=safe_relpath_files(tree, exclude))
3164
3209
except PointlessCommit:
3165
# FIXME: This should really happen before the file is read in;
3166
# perhaps prepare the commit; get the message; then actually commit
3167
3210
raise errors.BzrCommandError("No changes to commit."
3168
3211
" Use --unchanged to commit anyhow.")
3169
3212
except ConflictsInTree:
3184
3227
class cmd_check(Command):
3185
"""Validate working tree structure, branch consistency and repository history.
3228
__doc__ = """Validate working tree structure, branch consistency and repository history.
3187
3230
This command checks various invariants about branch and repository storage
3188
3231
to detect data corruption or bzr bugs.
3422
3465
class cmd_selftest(Command):
3423
"""Run internal test suite.
3466
__doc__ = """Run internal test suite.
3425
3468
If arguments are given, they are regular expressions that say which tests
3426
3469
should run. Tests matching any expression are run, and other tests are
3567
3610
raise errors.BzrCommandError("subunit not available. subunit "
3568
3611
"needs to be installed to use --subunit.")
3569
3612
self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3613
# On Windows, disable automatic conversion of '\n' to '\r\n' in
3614
# stdout, which would corrupt the subunit stream.
3615
if sys.platform == "win32" and sys.stdout.fileno() >= 0:
3617
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
3571
3619
self.additional_selftest_args.setdefault(
3572
3620
'suite_decorators', []).append(parallel)
3632
3680
class cmd_find_merge_base(Command):
3633
"""Find and print a base revision for merging two branches."""
3681
__doc__ = """Find and print a base revision for merging two branches."""
3634
3682
# TODO: Options to specify revisions on either side, as if
3635
3683
# merging only part of the history.
3636
3684
takes_args = ['branch', 'other']
3658
3706
class cmd_merge(Command):
3659
"""Perform a three-way merge.
3707
__doc__ = """Perform a three-way merge.
3661
3709
The source of the merge can be specified either in the form of a branch,
3662
3710
or in the form of a path to a file containing a merge directive generated
4049
4097
def run(self, file_list=None, merge_type=None, show_base=False,
4050
4098
reprocess=False):
4099
from bzrlib.conflicts import restore
4051
4100
if merge_type is None:
4052
4101
merge_type = _mod_merge.Merge3Merger
4053
4102
tree, file_list = tree_files(file_list)
4113
4162
class cmd_revert(Command):
4114
"""Revert files to a previous revision.
4163
__doc__ = """Revert files to a previous revision.
4116
4165
Giving a list of files will revert only those files. Otherwise, all files
4117
4166
will be reverted. If the revision is not specified with '--revision', the
4168
4217
def run(self, revision=None, no_backup=False, file_list=None,
4169
4218
forget_merges=None):
4170
4219
tree, file_list = tree_files(file_list)
4220
tree.lock_tree_write()
4172
4221
self.add_cleanup(tree.unlock)
4173
4222
if forget_merges:
4174
4223
tree.set_parent_ids(tree.get_parent_ids()[:1])
4325
4377
remote_branch = Branch.open(other_branch)
4326
4378
if remote_branch.base == local_branch.base:
4327
4379
remote_branch = local_branch
4381
remote_branch.lock_read()
4382
self.add_cleanup(remote_branch.unlock)
4329
local_branch.lock_read()
4330
self.add_cleanup(local_branch.unlock)
4331
4384
local_revid_range = _revision_range_to_revid_range(
4332
4385
_get_revision_range(my_revision, local_branch,
4335
remote_branch.lock_read()
4336
self.add_cleanup(remote_branch.unlock)
4337
4388
remote_revid_range = _revision_range_to_revid_range(
4338
4389
_get_revision_range(revision,
4339
4390
remote_branch, self.name()))
4400
4451
class cmd_pack(Command):
4401
"""Compress the data within a repository."""
4452
__doc__ = """Compress the data within a repository.
4454
This operation compresses the data within a bazaar repository. As
4455
bazaar supports automatic packing of repository, this operation is
4456
normally not required to be done manually.
4458
During the pack operation, bazaar takes a backup of existing repository
4459
data, i.e. pack files. This backup is eventually removed by bazaar
4460
automatically when it is safe to do so. To save disk space by removing
4461
the backed up pack files, the --clean-obsolete-packs option may be
4464
Warning: If you use --clean-obsolete-packs and your machine crashes
4465
during or immediately after repacking, you may be left with a state
4466
where the deletion has been written to disk but the new packs have not
4467
been. In this case the repository may be unusable.
4403
4470
_see_also = ['repositories']
4404
4471
takes_args = ['branch_or_repo?']
4473
Option('clean-obsolete-packs', 'Delete obsolete packs to save disk space.'),
4406
def run(self, branch_or_repo='.'):
4476
def run(self, branch_or_repo='.', clean_obsolete_packs=False):
4407
4477
dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4409
4479
branch = dir.open_branch()
4410
4480
repository = branch.repository
4411
4481
except errors.NotBranchError:
4412
4482
repository = dir.open_repository()
4483
repository.pack(clean_obsolete_packs=clean_obsolete_packs)
4416
4486
class cmd_plugins(Command):
4417
"""List the installed plugins.
4487
__doc__ = """List the installed plugins.
4419
4489
This command displays the list of installed plugins including
4420
4490
version of plugin and a short description of each.
4493
4563
class cmd_annotate(Command):
4494
"""Show the origin of each line in a file.
4564
__doc__ = """Show the origin of each line in a file.
4496
4566
This prints out the given file with an annotation on the left side
4497
4567
indicating which revision, author and date introduced the change.
4612
4682
class cmd_bind(Command):
4613
"""Convert the current branch into a checkout of the supplied branch.
4683
__doc__ = """Convert the current branch into a checkout of the supplied branch.
4684
If no branch is supplied, rebind to the last bound location.
4615
4686
Once converted into a checkout, commits must succeed on the master branch
4616
4687
before they will be applied to the local branch.
4652
4723
class cmd_unbind(Command):
4653
"""Convert the current checkout into a regular branch.
4724
__doc__ = """Convert the current checkout into a regular branch.
4655
4726
After unbinding, the local branch is considered independent and subsequent
4656
4727
commits will be local only.
4669
4740
class cmd_uncommit(Command):
4670
"""Remove the last committed revision.
4741
__doc__ = """Remove the last committed revision.
4672
4743
--verbose will print out what is being removed.
4673
4744
--dry-run will go through all the motions, but not actually
4777
4848
class cmd_break_lock(Command):
4778
"""Break a dead lock on a repository, branch or working directory.
4849
__doc__ = """Break a dead lock on a repository, branch or working directory.
4780
4851
CAUTION: Locks should only be broken when you are sure that the process
4781
4852
holding the lock has been stopped.
4928
4999
class cmd_split(Command):
4929
"""Split a subdirectory of a tree into a separate tree.
5000
__doc__ = """Split a subdirectory of a tree into a separate tree.
4931
5002
This command will produce a target tree in a format that supports
4932
5003
rich roots, like 'rich-root' or 'rich-root-pack'. These formats cannot be
4954
5025
class cmd_merge_directive(Command):
4955
"""Generate a merge directive for auto-merge tools.
5026
__doc__ = """Generate a merge directive for auto-merge tools.
4957
5028
A directive requests a merge to be performed, and also provides all the
4958
5029
information necessary to do so. This means it must either include a
5243
5314
class cmd_tag(Command):
5244
"""Create, remove or modify a tag naming a revision.
5315
__doc__ = """Create, remove or modify a tag naming a revision.
5246
5317
Tags give human-meaningful names to revisions. Commands that take a -r
5247
5318
(--revision) option can be given -rtag:X, where X is any previously
5256
5327
To rename a tag (change the name but keep it on the same revsion), run ``bzr
5257
5328
tag new-name -r tag:old-name`` and then ``bzr tag --delete oldname``.
5330
If no tag name is specified it will be determined through the
5331
'automatic_tag_name' hook. This can e.g. be used to automatically tag
5332
upstream releases by reading configure.ac. See ``bzr help hooks`` for
5260
5336
_see_also = ['commit', 'tags']
5261
takes_args = ['tag_name']
5337
takes_args = ['tag_name?']
5262
5338
takes_options = [
5263
5339
Option('delete',
5264
5340
help='Delete this tag rather than placing it.',
5295
5373
revision_id = revision[0].as_revision_id(branch)
5297
5375
revision_id = branch.last_revision()
5376
if tag_name is None:
5377
tag_name = branch.automatic_tag_name(revision_id)
5378
if tag_name is None:
5379
raise errors.BzrCommandError(
5380
"Please specify a tag name.")
5298
5381
if (not force) and branch.tags.has_tag(tag_name):
5299
5382
raise errors.TagAlreadyExists(tag_name)
5300
5383
branch.tags.set_tag(tag_name, revision_id)
5469
5552
class cmd_switch(Command):
5470
"""Set the branch of a checkout and update.
5553
__doc__ = """Set the branch of a checkout and update.
5472
5555
For lightweight checkouts, this changes the branch being referenced.
5473
5556
For heavyweight checkouts, this checks that there are no local commits
5736
5819
self.outf.write(" <no hooks installed>\n")
5822
class cmd_remove_branch(Command):
5823
__doc__ = """Remove a branch.
5825
This will remove the branch from the specified location but
5826
will keep any working tree or repository in place.
5830
Remove the branch at repo/trunk::
5832
bzr remove-branch repo/trunk
5836
takes_args = ["location?"]
5838
aliases = ["rmbranch"]
5840
def run(self, location=None):
5841
if location is None:
5843
branch = Branch.open_containing(location)[0]
5844
branch.bzrdir.destroy_branch()
5739
5847
class cmd_shelve(Command):
5740
"""Temporarily set aside some changes from the current tree.
5848
__doc__ = """Temporarily set aside some changes from the current tree.
5742
5850
Shelve allows you to temporarily put changes you've made "on the shelf",
5743
5851
ie. out of the way, until a later time when you can bring them back from
5814
5922
class cmd_unshelve(Command):
5815
"""Restore shelved changes.
5923
__doc__ = """Restore shelved changes.
5817
5925
By default, the most recently shelved changes are restored. However if you
5818
5926
specify a shelf by id those changes will be restored instead. This works
5846
5954
class cmd_clean_tree(Command):
5847
"""Remove unwanted files from working tree.
5955
__doc__ = """Remove unwanted files from working tree.
5849
5957
By default, only unknown files, not ignored files, are deleted. Versioned
5850
5958
files are never deleted.
5880
5988
class cmd_reference(Command):
5881
"""list, view and set branch locations for nested trees.
5989
__doc__ = """list, view and set branch locations for nested trees.
5883
5991
If no arguments are provided, lists the branch locations for nested trees.
5884
5992
If one argument is provided, display the branch location for that tree.
5924
6032
self.outf.write('%s %s\n' % (path, location))
5927
# these get imported and then picked up by the scan for cmd_*
5928
# TODO: Some more consistent way to split command definitions across files;
5929
# we do need to load at least some information about them to know of
5930
# aliases. ideally we would avoid loading the implementation until the
5931
# details were needed.
5932
from bzrlib.cmd_version_info import cmd_version_info
5933
from bzrlib.conflicts import cmd_resolve, cmd_conflicts, restore
5934
from bzrlib.bundle.commands import (
5937
from bzrlib.foreign import cmd_dpush
5938
from bzrlib.sign_my_commits import cmd_sign_my_commits
6035
def _register_lazy_builtins():
6036
# register lazy builtins from other modules; called at startup and should
6037
# be only called once.
6038
for (name, aliases, module_name) in [
6039
('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6040
('cmd_dpush', [], 'bzrlib.foreign'),
6041
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6042
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6043
('cmd_conflicts', [], 'bzrlib.conflicts'),
6044
('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6046
builtin_command_registry.register_lazy(name, aliases, module_name)