1
# Copyright (C) 2006, 2008, 2009 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
104
101
registry.Registry.register(self, k_unsquished, cmd,
105
102
override_existing=decorate, info=info)
107
trace.warning('Two plugins defined the same command: %r' % k)
108
trace.warning('Not loading the one in %r' %
109
sys.modules[cmd.__module__])
110
trace.warning('Previously this command was registered from %r' %
111
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__])
114
111
def register_lazy(self, command_name, aliases, module_name):
385
382
warn("No help message set for %r" % self)
386
383
# List of standard options directly supported
387
384
self.supported_std_options = []
388
self._operation = cleanup.OperationWithCleanups(self.run)
390
def add_cleanup(self, cleanup_func, *args, **kwargs):
391
"""Register a function to call after self.run returns or raises.
393
Functions will be called in LIFO order.
395
self._operation.add_cleanup(cleanup_func, *args, **kwargs)
397
def cleanup_now(self):
398
"""Execute and empty pending cleanup functions immediately.
400
After cleanup_now all registered cleanups are forgotten. add_cleanup
401
may be called again after cleanup_now; these cleanups will be called
402
after self.run returns or raises (or when cleanup_now is next called).
404
This is useful for releasing expensive or contentious resources (such
405
as write locks) before doing further work that does not require those
406
resources (such as writing results to self.outf).
408
self._operation.cleanup_now()
410
@deprecated_method(deprecated_in((2, 1, 0)))
411
386
def _maybe_expand_globs(self, file_list):
412
387
"""Glob expand file_list if the platform does not do that itself.
414
Not used anymore, now that the bzr command-line parser globs on
417
389
:return: A possibly empty list of unicode paths.
419
391
Introduced in bzrlib 0.18.
395
if sys.platform == 'win32':
396
file_list = win32utils.glob_expand(file_list)
397
return list(file_list)
423
399
def _usage(self):
424
400
"""Return single-line grammar for this command.
481
457
# so we get <https://bugs.launchpad.net/bzr/+bug/249908>. -- mbp
483
459
options = option.get_optparser(self.options()).format_option_help()
484
# XXX: According to the spec, ReST option lists actually don't support
485
# options like --1.9 so that causes syntax errors (in Sphinx at least).
486
# As that pattern always appears in the commands that break, we trap
487
# on that and then format that block of 'format' options as a literal
489
if not plain and options.find(' --1.9 ') != -1:
490
options = options.replace(' format:\n', ' format::\n\n', 1)
491
460
if options.startswith('Options:'):
492
461
result += ':' + options
493
462
elif options.startswith('options:'):
533
502
# so don't create a real link
534
503
see_also_links.append(item)
536
# Use a Sphinx link for this entry
537
link_text = ":doc:`%s <%s-help>`" % (item, item)
538
see_also_links.append(link_text)
505
# Use a reST link for this entry
506
see_also_links.append("`%s`_" % (item,))
539
507
see_also = see_also_links
540
508
result += ':See also: '
541
509
result += ', '.join(see_also) + '\n'
620
588
def _setup_outf(self):
621
589
"""Return a file linked to stdout, which has proper encoding."""
622
self.outf = ui.ui_factory.make_output_stream(
623
encoding_type=self.encoding_type)
590
# Originally I was using self.stdout, but that looks
591
# *way* too much like sys.stdout
592
if self.encoding_type == 'exact':
593
# force sys.stdout to be binary stream on win32
594
if sys.platform == 'win32':
595
fileno = getattr(sys.stdout, 'fileno', None)
598
msvcrt.setmode(fileno(), os.O_BINARY)
599
self.outf = sys.stdout
602
output_encoding = osutils.get_terminal_encoding()
604
self.outf = codecs.getwriter(output_encoding)(sys.stdout,
605
errors=self.encoding_type)
606
# For whatever reason codecs.getwriter() does not advertise its encoding
607
# it just returns the encoding of the wrapped file, which is completely
608
# bogus. So set the attribute, so we can find the correct encoding later.
609
self.outf.encoding = output_encoding
625
611
def run_argv_aliases(self, argv, alias_argv=None):
626
612
"""Parse the command line and run with extra aliases in alias_argv."""
659
645
self._setup_outf()
661
return self.run_direct(**all_cmd_args)
663
def run_direct(self, *args, **kwargs):
664
"""Call run directly with objects (without parsing an argv list)."""
665
return self._operation.run_simple(*args, **kwargs)
647
return self.run(**all_cmd_args)
668
650
"""Actually run the command.
952
934
Generate line coverage report in the specified directory.
955
Specify the number of processes that can be run concurrently (selftest).
957
trace.mutter("bazaar version: " + bzrlib.__version__)
958
936
argv = list(argv)
959
937
trace.mutter("bzr arguments: %r", argv)
1053
1028
ret = apply_coveraged(opt_coverage_dir, run, *run_argv)
1055
1030
ret = run(*run_argv)
1031
if 'memory' in debug.debug_flags:
1032
trace.debug_memory('Process status after command:', short=False)
1056
1033
return ret or 0
1058
1035
# reset, in case we may do other commands later within the same
1059
1036
# process. Commands that want to execute sub-commands must propagate
1060
1037
# --verbose in their own way.
1061
if 'memory' in debug.debug_flags:
1062
trace.debug_memory('Process status after command:', short=False)
1063
1038
option._verbosity_level = saved_verbosity_level
1116
1091
# Is this a final release version? If so, we should suppress warnings
1117
1092
if bzrlib.version_info[3] == 'final':
1118
suppress_deprecation_warnings(override=True)
1093
suppress_deprecation_warnings(override=False)
1119
1094
if argv is None:
1120
1095
argv = osutils.get_unicode_argv()
1131
1106
raise errors.BzrError("argv should be list of unicode strings.")
1132
1107
argv = new_argv
1133
1108
ret = run_bzr_catch_errors(argv)
1134
bzrlib.ui.ui_factory.log_transport_activity(
1135
display=('bytes' in debug.debug_flags))
1136
1109
trace.mutter("return code %d", ret)
1137
osutils.report_extension_load_failures()