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
500
504
if (working.has_changes()):
501
505
raise errors.UncommittedChanges(working)
503
working_path = working.bzrdir.root_transport.base
504
branch_path = working.branch.bzrdir.root_transport.base
505
if working_path != branch_path:
507
if working.user_url != working.branch.user_url:
506
508
raise errors.BzrCommandError("You cannot remove the working tree"
507
509
" from a lightweight checkout")
985
987
tree_to = WorkingTree.open_containing(directory)[0]
986
988
branch_to = tree_to.branch
990
self.add_cleanup(tree_to.unlock)
987
991
except errors.NoWorkingTree:
989
993
branch_to = Branch.open_containing(directory)[0]
994
branch_to.lock_write()
995
self.add_cleanup(branch_to.unlock)
991
997
if local and not branch_to.get_bound_location():
992
998
raise errors.LocalRequiresBoundBranch()
1024
1030
branch_from = Branch.open(location,
1025
1031
possible_transports=possible_transports)
1032
branch_from.lock_read()
1033
self.add_cleanup(branch_from.unlock)
1027
1035
if branch_to.get_parent() is None or remember:
1028
1036
branch_to.set_parent(branch_from.base)
1030
if branch_from is not branch_to:
1031
branch_from.lock_read()
1032
self.add_cleanup(branch_from.unlock)
1033
1038
if revision is not None:
1034
1039
revision_id = revision.as_revision_id(branch_from)
1036
branch_to.lock_write()
1037
self.add_cleanup(branch_to.unlock)
1038
1041
if tree_to is not None:
1039
1042
view_info = _get_view_info_for_change_reporter(tree_to)
1040
1043
change_reporter = delta._ChangeReporter(
1122
1125
# Get the source branch
1123
1126
(tree, br_from,
1124
1127
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1126
strict = br_from.get_config().get_user_option_as_bool('push_strict')
1127
if strict is None: strict = True # default value
1128
1128
# Get the tip's revision_id
1129
1129
revision = _get_one_revision('push', revision)
1130
1130
if revision is not None:
1131
1131
revision_id = revision.in_history(br_from).rev_id
1133
1133
revision_id = None
1134
if strict and tree is not None and revision_id is None:
1135
if (tree.has_changes()):
1136
raise errors.UncommittedChanges(
1137
tree, more='Use --no-strict to force the push.')
1138
if tree.last_revision() != tree.branch.last_revision():
1139
# The tree has lost sync with its branch, there is little
1140
# chance that the user is aware of it but he can still force
1141
# the push with --no-strict
1142
raise errors.OutOfDateTree(
1143
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.')
1145
1139
# Get the stacked_on branch, if any
1146
1140
if stacked_on is not None:
1147
1141
stacked_on = urlutils.normalize_url(stacked_on)
1181
1175
class cmd_branch(Command):
1182
"""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.
1184
1178
If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
1185
1179
be used. In other words, "branch ../foo/bar" will attempt to create ./bar.
1294
1288
class cmd_checkout(Command):
1295
"""Create a new checkout of an existing branch.
1289
__doc__ = """Create a new checkout of an existing branch.
1297
1291
If BRANCH_LOCATION is omitted, checkout will reconstitute a working tree for
1298
1292
the branch found in '.'. This is useful if you have removed the working tree
1395
1389
class cmd_update(Command):
1396
"""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.
1398
1392
This will perform a merge into the working tree, and may generate
1399
1393
conflicts. If you have any local changes, you will still
1428
1422
branch_location = tree.branch.base
1429
1423
self.add_cleanup(tree.unlock)
1430
1424
# get rid of the final '/' and be ready for display
1431
branch_location = urlutils.unescape_for_display(branch_location[:-1],
1425
branch_location = urlutils.unescape_for_display(
1426
branch_location.rstrip('/'),
1433
1428
existing_pending_merges = tree.get_parent_ids()[1:]
1434
1429
if master is None:
1444
1439
revision_id = branch.last_revision()
1445
1440
if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1446
revno = branch.revision_id_to_revno(revision_id)
1447
note("Tree is up to date at revision %d of branch %s" %
1448
(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))
1450
1445
view_info = _get_view_info_for_change_reporter(tree)
1451
1446
change_reporter = delta._ChangeReporter(
1463
1458
"bzr update --revision only works"
1464
1459
" for a revision in the branch history"
1465
1460
% (e.revision))
1466
revno = tree.branch.revision_id_to_revno(
1461
revno = tree.branch.revision_id_to_dotted_revno(
1467
1462
_mod_revision.ensure_null(tree.last_revision()))
1468
note('Updated to revision %d of branch %s' %
1469
(revno, branch_location))
1470
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:
1471
1467
note('Your local commits will now show as pending merges with '
1472
1468
"'bzr status', and can be committed with 'bzr commit'.")
1473
1469
if conflicts != 0:
1479
1475
class cmd_info(Command):
1480
"""Show information about a working tree, branch or repository.
1476
__doc__ = """Show information about a working tree, branch or repository.
1482
1478
This command will show all known locations and formats associated to the
1483
1479
tree, branch or repository.
1577
1573
class cmd_file_id(Command):
1578
"""Print file_id of a particular file or directory.
1574
__doc__ = """Print file_id of a particular file or directory.
1580
1576
The file_id is assigned when the file is first added and remains the
1581
1577
same through all revisions where the file exists, even when it is
1599
1595
class cmd_file_path(Command):
1600
"""Print path of file_ids to a file or directory.
1596
__doc__ = """Print path of file_ids to a file or directory.
1602
1598
This prints one line for each directory down to the target,
1603
1599
starting at the branch root.
1665
1661
class cmd_ancestry(Command):
1666
"""List all revisions merged into this branch."""
1662
__doc__ = """List all revisions merged into this branch."""
1668
1664
_see_also = ['log', 'revision-history']
1669
1665
takes_args = ['location?']
1799
1795
class cmd_init_repository(Command):
1800
"""Create a shared repository for branches to share storage space.
1796
__doc__ = """Create a shared repository for branches to share storage space.
1802
1798
New branches created under the repository directory will store their
1803
1799
revisions in the repository, not in the branch directory. For branches
1859
1855
class cmd_diff(Command):
1860
"""Show differences in the working tree, between revisions or branches.
1856
__doc__ = """Show differences in the working tree, between revisions or branches.
1862
1858
If no arguments are given, all changes for the current tree are listed.
1863
1859
If files are given, only the changes in those files are listed.
1949
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'),
1953
1953
aliases = ['di', 'dif']
1954
1954
encoding_type = 'exact'
1956
1956
@display_command
1957
1957
def run(self, revision=None, file_list=None, diff_options=None,
1958
prefix=None, old=None, new=None, using=None):
1959
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,
1961
1962
if (prefix is None) or (prefix == '0'):
1962
1963
# diff -p0 format
1976
1977
raise errors.BzrCommandError('bzr diff --revision takes exactly'
1977
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 '
1979
1984
(old_tree, new_tree,
1980
1985
old_branch, new_branch,
1981
specific_files, extra_trees) = get_trees_and_branches_to_diff(
1982
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)
1983
1988
return show_diff_trees(old_tree, new_tree, sys.stdout,
1984
1989
specific_files=specific_files,
1985
1990
external_diff_options=diff_options,
1986
1991
old_label=old_label, new_label=new_label,
1987
extra_trees=extra_trees, using=using)
1992
extra_trees=extra_trees, using=using,
1990
1996
class cmd_deleted(Command):
1991
"""List files deleted in the working tree.
1997
__doc__ = """List files deleted in the working tree.
1993
1999
# TODO: Show files deleted since a previous revision, or
1994
2000
# between two revisions.
2293
2299
help='Show changes made in each revision as a patch.'),
2294
2300
Option('include-merges',
2295
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)'
2297
2307
encoding_type = 'replace'
2310
2320
show_diff=False,
2311
include_merges=False):
2321
include_merges=False,
2322
exclude_common_ancestry=False,
2312
2324
from bzrlib.log import (
2314
2326
make_log_request_dict,
2315
2327
_get_info_for_log_files,
2317
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')
2318
2334
if include_merges:
2319
2335
if levels is None:
2413
2429
direction=direction, specific_fileids=file_ids,
2414
2430
start_revision=rev1, end_revision=rev2, limit=limit,
2415
2431
message_search=message, delta_type=delta_type,
2416
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,
2417
2435
Logger(b, rqst).show(lf)
2643
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.
2646
2670
Patterns prefixed with '!' are exceptions to ignore patterns and take
2647
2671
precedence over regular ignores. Such exceptions are used to specify
2648
2672
files that should be versioned which would otherwise be ignored.
2689
2713
_see_also = ['status', 'ignored', 'patterns']
2690
2714
takes_args = ['name_pattern*']
2691
2715
takes_options = [
2692
Option('old-default-rules',
2693
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.')
2696
def run(self, name_pattern_list=None, old_default_rules=None):
2720
def run(self, name_pattern_list=None, default_rules=None):
2697
2721
from bzrlib import ignores
2698
if old_default_rules is not None:
2699
# dump the rules and exit
2700
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:
2701
2725
self.outf.write("%s\n" % pattern)
2703
2727
if not name_pattern_list:
2704
2728
raise errors.BzrCommandError("ignore requires at least one "
2705
"NAME_PATTERN or --old-default-rules")
2729
"NAME_PATTERN or --default-rules.")
2706
2730
name_pattern_list = [globbing.normalize_pattern(p)
2707
2731
for p in name_pattern_list]
2708
2732
for name_pattern in name_pattern_list:
3049
3073
"the master branch until a normal commit "
3050
3074
"is performed."
3076
Option('show-diff', short_name='p',
3053
3077
help='When no message is supplied, show the diff along'
3054
3078
' with the status summary in the message editor.'),
3135
3159
'(use --file "%(f)s" to take commit message from that file)'
3136
3160
% { 'f': message })
3137
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")
3139
3169
def get_message(commit_obj):
3140
3170
"""Callback to get commit message"""
3141
my_message = message
3142
if my_message is not None and '\r' in my_message:
3143
my_message = my_message.replace('\r\n', '\n')
3144
my_message = my_message.replace('\r', '\n')
3145
if my_message is None and not file:
3146
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,
3147
3180
selected_list, diff=show_diff,
3148
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
3149
3187
start_message = generate_commit_message_template(commit_obj)
3150
my_message = edit_commit_message_encoded(t,
3188
my_message = edit_commit_message_encoded(text,
3151
3189
start_message=start_message)
3152
3190
if my_message is None:
3153
3191
raise errors.BzrCommandError("please specify a commit"
3154
3192
" message with either --message or --file")
3155
elif my_message and file:
3156
raise errors.BzrCommandError(
3157
"please specify either --message or --file")
3159
my_message = codecs.open(file, 'rt',
3160
osutils.get_user_encoding()).read()
3161
3193
if my_message == "":
3162
3194
raise errors.BzrCommandError("empty commit message specified")
3163
3195
return my_message
3175
3207
timezone=offset,
3176
3208
exclude=safe_relpath_files(tree, exclude))
3177
3209
except PointlessCommit:
3178
# FIXME: This should really happen before the file is read in;
3179
# perhaps prepare the commit; get the message; then actually commit
3180
3210
raise errors.BzrCommandError("No changes to commit."
3181
3211
" Use --unchanged to commit anyhow.")
3182
3212
except ConflictsInTree:
3197
3227
class cmd_check(Command):
3198
"""Validate working tree structure, branch consistency and repository history.
3228
__doc__ = """Validate working tree structure, branch consistency and repository history.
3200
3230
This command checks various invariants about branch and repository storage
3201
3231
to detect data corruption or bzr bugs.
3435
3465
class cmd_selftest(Command):
3436
"""Run internal test suite.
3466
__doc__ = """Run internal test suite.
3438
3468
If arguments are given, they are regular expressions that say which tests
3439
3469
should run. Tests matching any expression are run, and other tests are
3580
3610
raise errors.BzrCommandError("subunit not available. subunit "
3581
3611
"needs to be installed to use --subunit.")
3582
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)
3584
3619
self.additional_selftest_args.setdefault(
3585
3620
'suite_decorators', []).append(parallel)
3645
3680
class cmd_find_merge_base(Command):
3646
"""Find and print a base revision for merging two branches."""
3681
__doc__ = """Find and print a base revision for merging two branches."""
3647
3682
# TODO: Options to specify revisions on either side, as if
3648
3683
# merging only part of the history.
3649
3684
takes_args = ['branch', 'other']
3671
3706
class cmd_merge(Command):
3672
"""Perform a three-way merge.
3707
__doc__ = """Perform a three-way merge.
3674
3709
The source of the merge can be specified either in the form of a branch,
3675
3710
or in the form of a path to a file containing a merge directive generated
4062
4097
def run(self, file_list=None, merge_type=None, show_base=False,
4063
4098
reprocess=False):
4099
from bzrlib.conflicts import restore
4064
4100
if merge_type is None:
4065
4101
merge_type = _mod_merge.Merge3Merger
4066
4102
tree, file_list = tree_files(file_list)
4126
4162
class cmd_revert(Command):
4127
"""Revert files to a previous revision.
4163
__doc__ = """Revert files to a previous revision.
4129
4165
Giving a list of files will revert only those files. Otherwise, all files
4130
4166
will be reverted. If the revision is not specified with '--revision', the
4181
4217
def run(self, revision=None, no_backup=False, file_list=None,
4182
4218
forget_merges=None):
4183
4219
tree, file_list = tree_files(file_list)
4220
tree.lock_tree_write()
4185
4221
self.add_cleanup(tree.unlock)
4186
4222
if forget_merges:
4187
4223
tree.set_parent_ids(tree.get_parent_ids()[:1])
4338
4377
remote_branch = Branch.open(other_branch)
4339
4378
if remote_branch.base == local_branch.base:
4340
4379
remote_branch = local_branch
4381
remote_branch.lock_read()
4382
self.add_cleanup(remote_branch.unlock)
4342
local_branch.lock_read()
4343
self.add_cleanup(local_branch.unlock)
4344
4384
local_revid_range = _revision_range_to_revid_range(
4345
4385
_get_revision_range(my_revision, local_branch,
4348
remote_branch.lock_read()
4349
self.add_cleanup(remote_branch.unlock)
4350
4388
remote_revid_range = _revision_range_to_revid_range(
4351
4389
_get_revision_range(revision,
4352
4390
remote_branch, self.name()))
4413
4451
class cmd_pack(Command):
4414
"""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.
4416
4470
_see_also = ['repositories']
4417
4471
takes_args = ['branch_or_repo?']
4473
Option('clean-obsolete-packs', 'Delete obsolete packs to save disk space.'),
4419
def run(self, branch_or_repo='.'):
4476
def run(self, branch_or_repo='.', clean_obsolete_packs=False):
4420
4477
dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4422
4479
branch = dir.open_branch()
4423
4480
repository = branch.repository
4424
4481
except errors.NotBranchError:
4425
4482
repository = dir.open_repository()
4483
repository.pack(clean_obsolete_packs=clean_obsolete_packs)
4429
4486
class cmd_plugins(Command):
4430
"""List the installed plugins.
4487
__doc__ = """List the installed plugins.
4432
4489
This command displays the list of installed plugins including
4433
4490
version of plugin and a short description of each.
4506
4563
class cmd_annotate(Command):
4507
"""Show the origin of each line in a file.
4564
__doc__ = """Show the origin of each line in a file.
4509
4566
This prints out the given file with an annotation on the left side
4510
4567
indicating which revision, author and date introduced the change.
4625
4682
class cmd_bind(Command):
4626
"""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.
4628
4686
Once converted into a checkout, commits must succeed on the master branch
4629
4687
before they will be applied to the local branch.
4665
4723
class cmd_unbind(Command):
4666
"""Convert the current checkout into a regular branch.
4724
__doc__ = """Convert the current checkout into a regular branch.
4668
4726
After unbinding, the local branch is considered independent and subsequent
4669
4727
commits will be local only.
4682
4740
class cmd_uncommit(Command):
4683
"""Remove the last committed revision.
4741
__doc__ = """Remove the last committed revision.
4685
4743
--verbose will print out what is being removed.
4686
4744
--dry-run will go through all the motions, but not actually
4790
4848
class cmd_break_lock(Command):
4791
"""Break a dead lock on a repository, branch or working directory.
4849
__doc__ = """Break a dead lock on a repository, branch or working directory.
4793
4851
CAUTION: Locks should only be broken when you are sure that the process
4794
4852
holding the lock has been stopped.
4941
4999
class cmd_split(Command):
4942
"""Split a subdirectory of a tree into a separate tree.
5000
__doc__ = """Split a subdirectory of a tree into a separate tree.
4944
5002
This command will produce a target tree in a format that supports
4945
5003
rich roots, like 'rich-root' or 'rich-root-pack'. These formats cannot be
4967
5025
class cmd_merge_directive(Command):
4968
"""Generate a merge directive for auto-merge tools.
5026
__doc__ = """Generate a merge directive for auto-merge tools.
4970
5028
A directive requests a merge to be performed, and also provides all the
4971
5029
information necessary to do so. This means it must either include a
5256
5314
class cmd_tag(Command):
5257
"""Create, remove or modify a tag naming a revision.
5315
__doc__ = """Create, remove or modify a tag naming a revision.
5259
5317
Tags give human-meaningful names to revisions. Commands that take a -r
5260
5318
(--revision) option can be given -rtag:X, where X is any previously
5494
5552
class cmd_switch(Command):
5495
"""Set the branch of a checkout and update.
5553
__doc__ = """Set the branch of a checkout and update.
5497
5555
For lightweight checkouts, this changes the branch being referenced.
5498
5556
For heavyweight checkouts, this checks that there are no local commits
5789
5847
class cmd_shelve(Command):
5790
"""Temporarily set aside some changes from the current tree.
5848
__doc__ = """Temporarily set aside some changes from the current tree.
5792
5850
Shelve allows you to temporarily put changes you've made "on the shelf",
5793
5851
ie. out of the way, until a later time when you can bring them back from
5864
5922
class cmd_unshelve(Command):
5865
"""Restore shelved changes.
5923
__doc__ = """Restore shelved changes.
5867
5925
By default, the most recently shelved changes are restored. However if you
5868
5926
specify a shelf by id those changes will be restored instead. This works
5896
5954
class cmd_clean_tree(Command):
5897
"""Remove unwanted files from working tree.
5955
__doc__ = """Remove unwanted files from working tree.
5899
5957
By default, only unknown files, not ignored files, are deleted. Versioned
5900
5958
files are never deleted.
5930
5988
class cmd_reference(Command):
5931
"""list, view and set branch locations for nested trees.
5989
__doc__ = """list, view and set branch locations for nested trees.
5933
5991
If no arguments are provided, lists the branch locations for nested trees.
5934
5992
If one argument is provided, display the branch location for that tree.
5974
6032
self.outf.write('%s %s\n' % (path, location))
5977
from bzrlib.cmd_version_info import cmd_version_info
5978
from bzrlib.conflicts import cmd_resolve, cmd_conflicts, restore
5979
from bzrlib.foreign import cmd_dpush
5980
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)