1
# Copyright (C) 2005-2010 Canonical Ltd
1
# Copyright (C) 2006, 2008 Canonical Ltd
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
103
101
registry.Registry.register(self, k_unsquished, cmd,
104
102
override_existing=decorate, info=info)
106
trace.warning('Two plugins defined the same command: %r' % k)
107
trace.warning('Not loading the one in %r' %
108
sys.modules[cmd.__module__])
109
trace.warning('Previously this command was registered from %r' %
110
sys.modules[previous.__module__])
104
trace.log_error('Two plugins defined the same command: %r' % k)
105
trace.log_error('Not loading the one in %r' %
106
sys.modules[cmd.__module__])
107
trace.log_error('Previously this command was registered from %r' %
108
sys.modules[previous.__module__])
113
111
def register_lazy(self, command_name, aliases, module_name):
185
183
return plugin_cmds.keys()
186
@deprecated_function(deprecated_in((1, 17, 0)))
187
def get_all_cmds(plugins_override=False):
188
"""Return canonical name and class for most commands.
190
NB: This does not return all commands since the introduction of
191
command hooks, and returning the class is not sufficient to
192
get correctly setup commands, which is why it is deprecated.
194
Use 'all_command_names' + 'get_cmd_object' instead.
196
d = _builtin_commands()
198
d.update(plugin_cmds.iteritems())
199
for k, v in d.iteritems():
188
203
def get_cmd_object(cmd_name, plugins_override=True):
189
204
"""Return the command object for a command.
367
382
warn("No help message set for %r" % self)
368
383
# List of standard options directly supported
369
384
self.supported_std_options = []
370
self._operation = cleanup.OperationWithCleanups(self.run)
372
def add_cleanup(self, cleanup_func, *args, **kwargs):
373
"""Register a function to call after self.run returns or raises.
375
Functions will be called in LIFO order.
377
self._operation.add_cleanup(cleanup_func, *args, **kwargs)
379
def cleanup_now(self):
380
"""Execute and empty pending cleanup functions immediately.
382
After cleanup_now all registered cleanups are forgotten. add_cleanup
383
may be called again after cleanup_now; these cleanups will be called
384
after self.run returns or raises (or when cleanup_now is next called).
386
This is useful for releasing expensive or contentious resources (such
387
as write locks) before doing further work that does not require those
388
resources (such as writing results to self.outf).
390
self._operation.cleanup_now()
392
@deprecated_method(deprecated_in((2, 1, 0)))
393
386
def _maybe_expand_globs(self, file_list):
394
387
"""Glob expand file_list if the platform does not do that itself.
396
Not used anymore, now that the bzr command-line parser globs on
399
389
:return: A possibly empty list of unicode paths.
401
391
Introduced in bzrlib 0.18.
395
if sys.platform == 'win32':
396
file_list = win32utils.glob_expand(file_list)
397
return list(file_list)
405
399
def _usage(self):
406
400
"""Return single-line grammar for this command.
515
509
# so don't create a real link
516
510
see_also_links.append(item)
518
# Use a Sphinx link for this entry
519
link_text = ":doc:`%s <%s-help>`" % (item, item)
520
see_also_links.append(link_text)
512
# Use a reST link for this entry
513
see_also_links.append("`%s`_" % (item,))
521
514
see_also = see_also_links
522
515
result += ':See also: '
523
516
result += ', '.join(see_also) + '\n'
602
595
def _setup_outf(self):
603
596
"""Return a file linked to stdout, which has proper encoding."""
604
self.outf = ui.ui_factory.make_output_stream(
605
encoding_type=self.encoding_type)
597
# Originally I was using self.stdout, but that looks
598
# *way* too much like sys.stdout
599
if self.encoding_type == 'exact':
600
# force sys.stdout to be binary stream on win32
601
if sys.platform == 'win32':
602
fileno = getattr(sys.stdout, 'fileno', None)
605
msvcrt.setmode(fileno(), os.O_BINARY)
606
self.outf = sys.stdout
609
output_encoding = osutils.get_terminal_encoding()
611
self.outf = codecs.getwriter(output_encoding)(sys.stdout,
612
errors=self.encoding_type)
613
# For whatever reason codecs.getwriter() does not advertise its encoding
614
# it just returns the encoding of the wrapped file, which is completely
615
# bogus. So set the attribute, so we can find the correct encoding later.
616
self.outf.encoding = output_encoding
607
618
def run_argv_aliases(self, argv, alias_argv=None):
608
619
"""Parse the command line and run with extra aliases in alias_argv."""
621
warn("Passing None for [] is deprecated from bzrlib 0.10",
622
DeprecationWarning, stacklevel=2)
609
624
args, opts = parse_args(self, argv, alias_argv)
611
626
# Process the standard options
637
652
self._setup_outf()
639
return self.run_direct(**all_cmd_args)
641
def run_direct(self, *args, **kwargs):
642
"""Call run directly with objects (without parsing an argv list)."""
643
return self._operation.run_simple(*args, **kwargs)
654
return self.run(**all_cmd_args)
646
657
"""Actually run the command.
930
941
Generate line coverage report in the specified directory.
933
Specify the number of processes that can be run concurrently (selftest).
935
trace.mutter("bazaar version: " + bzrlib.__version__)
936
943
argv = list(argv)
937
944
trace.mutter("bzr arguments: %r", argv)
1031
1035
ret = apply_coveraged(opt_coverage_dir, run, *run_argv)
1033
1037
ret = run(*run_argv)
1038
if 'memory' in debug.debug_flags:
1039
trace.debug_memory('Process status after command:', short=False)
1034
1040
return ret or 0
1036
1042
# reset, in case we may do other commands later within the same
1037
1043
# process. Commands that want to execute sub-commands must propagate
1038
1044
# --verbose in their own way.
1039
if 'memory' in debug.debug_flags:
1040
trace.debug_memory('Process status after command:', short=False)
1041
1045
option._verbosity_level = saved_verbosity_level
1077
1081
"bzr plugin-provider-db check")
1081
def _specified_or_unicode_argv(argv):
1082
# For internal or testing use, argv can be passed. Otherwise, get it from
1083
# the process arguments in a unicode-safe way.
1084
def main(argv=None):
1085
"""Main entry point of command-line interface.
1087
:param argv: list of unicode command-line arguments similar to sys.argv.
1088
argv[0] is script name usually, it will be ignored.
1089
Don't pass here sys.argv because this list contains plain strings
1090
and not unicode; pass None instead.
1092
:return: exit code of bzr command.
1095
bzrlib.ui.ui_factory = bzrlib.ui.make_ui_for_terminal(
1096
sys.stdin, sys.stdout, sys.stderr)
1098
# Is this a final release version? If so, we should suppress warnings
1099
if bzrlib.version_info[3] == 'final':
1100
suppress_deprecation_warnings(override=True)
1084
1101
if argv is None:
1085
return osutils.get_unicode_argv()
1102
argv = osutils.get_unicode_argv()
1094
1111
new_argv.append(a.decode('ascii'))
1095
1112
except UnicodeDecodeError:
1096
1113
raise errors.BzrError("argv should be list of unicode strings.")
1100
def main(argv=None):
1101
"""Main entry point of command-line interface.
1103
Typically `bzrlib.initialize` should be called first.
1105
:param argv: list of unicode command-line arguments similar to sys.argv.
1106
argv[0] is script name usually, it will be ignored.
1107
Don't pass here sys.argv because this list contains plain strings
1108
and not unicode; pass None instead.
1110
:return: exit code of bzr command.
1112
argv = _specified_or_unicode_argv(argv)
1113
1115
ret = run_bzr_catch_errors(argv)
1114
bzrlib.ui.ui_factory.log_transport_activity(
1115
display=('bytes' in debug.debug_flags))
1116
1116
trace.mutter("return code %d", ret)
1123
1123
This function assumed that that UI layer is setup, that symbol deprecations
1124
1124
are already applied, and that unicode decoding has already been performed on argv.
1126
# done here so that they're covered for every test run
1127
1126
install_bzr_command_hooks()
1128
1127
return exception_to_return_code(run_bzr, argv)
1134
1133
This is used for the test suite, and might be useful for other programs
1135
1134
that want to wrap the commandline interface.
1137
# done here so that they're covered for every test run
1138
1136
install_bzr_command_hooks()
1140
1138
return run_bzr(argv)