28
29
from bzrlib.lazy_import import lazy_import
29
30
lazy_import(globals(), """
33
from warnings import warn
36
35
from bzrlib import (
49
from bzrlib.hooks import HookPoint, Hooks
49
from bzrlib.hooks import Hooks
50
from bzrlib.i18n import gettext
50
51
# Compatibility - Option used to be in commands.
51
52
from bzrlib.option import Option
52
53
from bzrlib.plugin import disable_plugins, load_plugins
53
54
from bzrlib import registry
54
from bzrlib.symbol_versioning import (
61
57
class CommandInfo(object):
358
346
summary, then a complete description of the command. A grammar
359
347
description will be inserted.
362
Other accepted names for this command.
365
List of argument forms, marked with whether they are optional,
370
['to_location', 'from_branch?', 'file*']
372
'to_location' is required
373
'from_branch' is optional
374
'file' can be specified 0 or more times
377
List of options that may be given for this command. These can
378
be either strings, referring to globally-defined options,
379
or option objects. Retrieve through options().
382
If true, this command isn't advertised. This is typically
349
:cvar aliases: Other accepted names for this command.
351
:cvar takes_args: List of argument forms, marked with whether they are
352
optional, repeated, etc. Examples::
354
['to_location', 'from_branch?', 'file*']
356
* 'to_location' is required
357
* 'from_branch' is optional
358
* 'file' can be specified 0 or more times
360
:cvar takes_options: List of options that may be given for this command.
361
These can be either strings, referring to globally-defined options, or
362
option objects. Retrieve through options().
364
:cvar hidden: If true, this command isn't advertised. This is typically
383
365
for commands intended for expert users.
386
Command objects will get a 'outf' attribute, which has been
387
setup to properly handle encoding of unicode strings.
388
encoding_type determines what will happen when characters cannot
390
strict - abort if we cannot decode
391
replace - put in a bogus character (typically '?')
392
exact - do not encode sys.stdout
394
NOTE: by default on Windows, sys.stdout is opened as a text
395
stream, therefore LF line-endings are converted to CRLF.
396
When a command uses encoding_type = 'exact', then
397
sys.stdout is forced to be a binary stream, and line-endings
367
:cvar encoding_type: Command objects will get a 'outf' attribute, which has
368
been setup to properly handle encoding of unicode strings.
369
encoding_type determines what will happen when characters cannot be
372
* strict - abort if we cannot decode
373
* replace - put in a bogus character (typically '?')
374
* exact - do not encode sys.stdout
376
NOTE: by default on Windows, sys.stdout is opened as a text stream,
377
therefore LF line-endings are converted to CRLF. When a command uses
378
encoding_type = 'exact', then sys.stdout is forced to be a binary
379
stream, and line-endings will not mangled.
382
A string indicating the real name under which this command was
383
invoked, before expansion of aliases.
384
(This may be None if the command was constructed and run in-process.)
400
386
:cvar hooks: An instance of CommandHooks.
401
:ivar __doc__: The help shown by 'bzr help command' for this command.
388
:cvar __doc__: The help shown by 'bzr help command' for this command.
402
389
This is set by assigning explicitly to __doc__ so that -OO can
406
__doc__ = "My help goes here"
393
__doc__ = "My help goes here"
410
397
takes_options = []
411
398
encoding_type = 'strict'
486
462
usage help (e.g. Purpose, Usage, Options) with a
487
463
message explaining how to obtain full help.
466
i18n.install() # Install i18n only for get_help_text for now.
489
467
doc = self.help()
491
doc = "No help for this command."
469
# Note: If self.gettext() translates ':Usage:\n', the section will
470
# be shown after "Description" section and we don't want to
471
# translate the usage string.
472
# Though, bzr export-pot don't exports :Usage: section and it must
474
doc = self.gettext(doc)
476
doc = gettext("No help for this command.")
493
478
# Extract the summary (purpose) and sections out from the text
494
479
purpose,sections,order = self._get_help_parts(doc)
513
498
# XXX: optparse implicitly rewraps the help, and not always perfectly,
514
499
# so we get <https://bugs.launchpad.net/bzr/+bug/249908>. -- mbp
516
options = option.get_optparser(self.options()).format_option_help()
517
# XXX: According to the spec, ReST option lists actually don't support
518
# options like --1.9 so that causes syntax errors (in Sphinx at least).
519
# As that pattern always appears in the commands that break, we trap
520
# on that and then format that block of 'format' options as a literal
522
if not plain and options.find(' --1.9 ') != -1:
501
parser = option.get_optparser(self.options())
502
options = parser.format_option_help()
503
# FIXME: According to the spec, ReST option lists actually don't
504
# support options like --1.14 so that causes syntax errors (in Sphinx
505
# at least). As that pattern always appears in the commands that
506
# break, we trap on that and then format that block of 'format' options
507
# as a literal block. We use the most recent format still listed so we
508
# don't have to do that too often -- vila 20110514
509
if not plain and options.find(' --1.14 ') != -1:
523
510
options = options.replace(' format:\n', ' format::\n\n', 1)
524
511
if options.startswith('Options:'):
525
result += ':' + options
526
elif options.startswith('options:'):
527
# Python 2.4 version of optparse
528
result += ':Options:' + options[len('options:'):]
512
result += gettext(':Options:%s') % (options[len('options:'):],)
530
514
result += options
536
520
if sections.has_key(None):
537
521
text = sections.pop(None)
538
522
text = '\n '.join(text.splitlines())
539
result += ':%s:\n %s\n\n' % ('Description',text)
523
result += gettext(':Description:\n %s\n\n') % (text,)
541
525
# Add the custom sections (e.g. Examples). Note that there's no need
542
526
# to indent these as they must be indented already in the source.
544
528
for label in order:
545
if sections.has_key(label):
546
result += ':%s:\n%s\n' % (label,sections[label])
529
if label in sections:
530
result += ':%s:\n%s\n' % (label, sections[label])
549
result += ("See bzr help %s for more details and examples.\n\n"
533
result += (gettext("See bzr help %s for more details and examples.\n\n")
552
536
# Add the aliases, source (plug-in) and see also links, if any
554
result += ':Aliases: '
538
result += gettext(':Aliases: ')
555
539
result += ', '.join(self.aliases) + '\n'
556
540
plugin_name = self.plugin_name()
557
541
if plugin_name is not None:
558
result += ':From: plugin "%s"\n' % plugin_name
542
result += gettext(':From: plugin "%s"\n') % plugin_name
559
543
see_also = self.get_see_also(additional_see_also)
561
545
if not plain and see_also_as_links:
567
551
see_also_links.append(item)
569
553
# Use a Sphinx link for this entry
570
link_text = ":doc:`%s <%s-help>`" % (item, item)
554
link_text = gettext(":doc:`{0} <{1}-help>`").format(
571
556
see_also_links.append(link_text)
572
557
see_also = see_also_links
573
result += ':See also: '
574
result += ', '.join(see_also) + '\n'
558
result += gettext(':See also: %s') % ', '.join(see_also) + '\n'
576
560
# If this will be rendered as plain text, convert it
658
642
def run_argv_aliases(self, argv, alias_argv=None):
659
643
"""Parse the command line and run with extra aliases in alias_argv."""
660
644
args, opts = parse_args(self, argv, alias_argv)
662
647
# Process the standard options
663
648
if 'help' in opts: # e.g. bzr add --help
664
sys.stdout.write(self.get_help_text())
649
self.outf.write(self.get_help_text())
666
651
if 'usage' in opts: # e.g. bzr add --usage
667
sys.stdout.write(self.get_help_text(verbose=False))
652
self.outf.write(self.get_help_text(verbose=False))
669
654
trace.set_verbosity_level(option._verbosity_level)
670
655
if 'verbose' in self.supported_std_options:
685
669
all_cmd_args = cmdargs.copy()
686
670
all_cmd_args.update(cmdopts)
690
return self.run(**all_cmd_args)
673
return self.run(**all_cmd_args)
675
# reset it, so that other commands run in the same process won't
676
# inherit state. Before we reset it, log any activity, so that it
677
# gets properly tracked.
678
ui.ui_factory.log_transport_activity(
679
display=('bytes' in debug.debug_flags))
680
trace.set_verbosity_level(0)
692
682
def _setup_run(self):
693
683
"""Wrap the defined run method on self with a cleanup.
701
691
class_run = self.run
702
692
def run(*args, **kwargs):
693
for hook in Command.hooks['pre_command']:
703
695
self._operation = cleanup.OperationWithCleanups(class_run)
705
697
return self._operation.run_simple(*args, **kwargs)
707
699
del self._operation
700
for hook in Command.hooks['post_command']:
710
@deprecated_method(deprecated_in((2, 2, 0)))
711
def run_direct(self, *args, **kwargs):
712
"""Deprecated thunk from bzrlib 2.1."""
713
return self.run(*args, **kwargs)
716
705
"""Actually run the command.
767
768
These are all empty initially, because by default nothing should get
771
self.create_hook(HookPoint('extend_command',
771
Hooks.__init__(self, "bzrlib.commands", "Command.hooks")
772
self.add_hook('extend_command',
772
773
"Called after creating a command object to allow modifications "
773
774
"such as adding or removing options, docs etc. Called with the "
774
"new bzrlib.commands.Command object.", (1, 13), None))
775
self.create_hook(HookPoint('get_command',
775
"new bzrlib.commands.Command object.", (1, 13))
776
self.add_hook('get_command',
776
777
"Called when creating a single command. Called with "
777
778
"(cmd_or_None, command_name). get_command should either return "
778
779
"the cmd_or_None parameter, or a replacement Command object that "
779
780
"should be used for the command. Note that the Command.hooks "
780
781
"hooks are core infrastructure. Many users will prefer to use "
781
782
"bzrlib.commands.register_command or plugin_cmds.register_lazy.",
783
self.create_hook(HookPoint('get_missing_command',
784
self.add_hook('get_missing_command',
784
785
"Called when creating a single command if no command could be "
785
786
"found. Called with (command_name). get_missing_command should "
786
787
"either return None, or a Command object to be used for the "
787
"command.", (1, 17), None))
788
self.create_hook(HookPoint('list_commands',
789
self.add_hook('list_commands',
789
790
"Called when enumerating commands. Called with a set of "
790
791
"cmd_name strings for all the commands found so far. This set "
791
792
" is safe to mutate - e.g. to remove a command. "
792
793
"list_commands should return the updated set of command names.",
795
self.add_hook('pre_command',
796
"Called prior to executing a command. Called with the command "
798
self.add_hook('post_command',
799
"Called after executing a command. Called with the command "
795
802
Command.hooks = CommandHooks()
813
options, args = parser.parse_args(args)
820
# for python 2.5 and later, optparse raises this exception if a non-ascii
821
# option name is given. See http://bugs.python.org/issue2931
823
options, args = parser.parse_args(args)
824
except UnicodeEncodeError,e:
825
raise errors.BzrCommandError(
826
gettext('Only ASCII permitted in option names'))
814
828
opts = dict([(k, v) for k, v in options.__dict__.iteritems() if
815
829
v is not option.OptionParser.DEFAULT_VALUE])
816
830
return args, opts
833
847
argdict[argname + '_list'] = None
834
848
elif ap[-1] == '+':
836
raise errors.BzrCommandError("command %r needs one or more %s"
837
% (cmd, argname.upper()))
850
raise errors.BzrCommandError(gettext(
851
"command {0!r} needs one or more {1}").format(
852
cmd, argname.upper()))
839
854
argdict[argname + '_list'] = args[:]
841
856
elif ap[-1] == '$': # all but one
842
857
if len(args) < 2:
843
raise errors.BzrCommandError("command %r needs one or more %s"
844
% (cmd, argname.upper()))
858
raise errors.BzrCommandError(
859
gettext("command {0!r} needs one or more {1}").format(
860
cmd, argname.upper()))
845
861
argdict[argname + '_list'] = args[:-1]
848
864
# just a plain arg
851
raise errors.BzrCommandError("command %r requires argument %s"
852
% (cmd, argname.upper()))
867
raise errors.BzrCommandError(
868
gettext("command {0!r} requires argument {1}").format(
869
cmd, argname.upper()))
854
871
argdict[argname] = args.pop(0)
857
raise errors.BzrCommandError("extra argument to command %s: %s"
874
raise errors.BzrCommandError( gettext(
875
"extra argument to command {0}: {1}").format(
917
935
exitcode = trace.report_exception(exc_info, sys.stderr)
918
936
if os.environ.get('BZR_PDB'):
919
937
print '**** entering debugger'
922
if sys.version_info[:2] < (2, 6):
924
# pdb.post_mortem(tb)
925
# but because pdb.post_mortem gives bad results for tracebacks
926
# from inside generators, we do it manually.
927
# (http://bugs.python.org/issue4150, fixed in Python 2.6)
929
# Setup pdb on the traceback
932
p.setup(tb.tb_frame, tb)
933
# Point the debugger at the deepest frame of the stack
934
p.curindex = len(p.stack) - 1
935
p.curframe = p.stack[p.curindex][0]
936
# Start the pdb prompt.
937
p.print_stack_entry(p.stack[p.curindex])
939
pdb.post_mortem(exc_info[2])
945
943
def apply_lsprofiled(filename, the_callable, *args, **kwargs):
946
944
from bzrlib.lsprof import profile
947
ret, stats = profile(exception_to_return_code, the_callable, *args, **kwargs)
945
ret, stats = profile(exception_to_return_code, the_callable,
949
948
if filename is None:
952
951
stats.save(filename)
953
trace.note('Profile data written to "%s".', filename)
952
trace.note(gettext('Profile data written to "%s".'), filename)
957
@deprecated_function(deprecated_in((2, 2, 0)))
958
def shlex_split_unicode(unsplit):
959
return cmdline.split(unsplit)
962
956
def get_alias(cmd, config=None):
963
957
"""Return an expanded alias, or None if no alias exists.
1059
1056
pass # already handled in startup script Bug #588277
1060
1057
elif a.startswith('-D'):
1061
1058
debug.debug_flags.add(a[2:])
1059
elif a.startswith('-O'):
1060
override_config.append(a[2:])
1063
1062
argv_copy.append(a)
1065
if bzrlib.global_state is None:
1066
# FIXME: Workaround for users that imported bzrlib but didn't call
1067
# bzrlib.initialize -- vila 2012-01-19
1068
cmdline_overrides = config.CommandLineStore()
1070
cmdline_overrides = bzrlib.global_state.cmdline_overrides
1071
cmdline_overrides._from_cmdline(override_config)
1066
1073
debug.set_debug_flags_from_config()
1068
1075
if not opt_no_plugins:
1253
1264
class Provider(object):
1254
'''Generic class to be overriden by plugins'''
1265
"""Generic class to be overriden by plugins"""
1256
1267
def plugin_for_command(self, cmd_name):
1257
'''Takes a command and returns the information for that plugin
1268
"""Takes a command and returns the information for that plugin
1259
1270
:return: A dictionary with all the available information
1260
for the requested plugin
1271
for the requested plugin
1262
1273
raise NotImplementedError
1265
1276
class ProvidersRegistry(registry.Registry):
1266
'''This registry exists to allow other providers to exist'''
1277
"""This registry exists to allow other providers to exist"""
1268
1279
def __iter__(self):
1269
1280
for key, provider in self.iteritems():