349
358
summary, then a complete description of the command. A grammar
350
359
description will be inserted.
352
:cvar aliases: Other accepted names for this command.
354
:cvar takes_args: List of argument forms, marked with whether they are
355
optional, repeated, etc. Examples::
357
['to_location', 'from_branch?', 'file*']
359
* 'to_location' is required
360
* 'from_branch' is optional
361
* 'file' can be specified 0 or more times
363
:cvar takes_options: List of options that may be given for this command.
364
These can be either strings, referring to globally-defined options, or
365
option objects. Retrieve through options().
367
:cvar hidden: If true, this command isn't advertised. This is typically
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
368
383
for commands intended for expert users.
370
:cvar encoding_type: Command objects will get a 'outf' attribute, which has
371
been setup to properly handle encoding of unicode strings.
372
encoding_type determines what will happen when characters cannot be
375
* strict - abort if we cannot decode
376
* replace - put in a bogus character (typically '?')
377
* exact - do not encode sys.stdout
379
NOTE: by default on Windows, sys.stdout is opened as a text stream,
380
therefore LF line-endings are converted to CRLF. When a command uses
381
encoding_type = 'exact', then sys.stdout is forced to be a binary
382
stream, and line-endings will not mangled.
385
A string indicating the real name under which this command was
386
invoked, before expansion of aliases.
387
(This may be None if the command was constructed and run in-process.)
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
389
400
:cvar hooks: An instance of CommandHooks.
391
:cvar __doc__: The help shown by 'bzr help command' for this command.
401
:ivar __doc__: The help shown by 'bzr help command' for this command.
392
402
This is set by assigning explicitly to __doc__ so that -OO can
396
__doc__ = "My help goes here"
406
__doc__ = "My help goes here"
400
410
takes_options = []
401
411
encoding_type = 'strict'
465
486
usage help (e.g. Purpose, Usage, Options) with a
466
487
message explaining how to obtain full help.
469
i18n.install() # Install i18n only for get_help_text for now.
470
489
doc = self.help()
472
# Note: If self.gettext() translates ':Usage:\n', the section will
473
# be shown after "Description" section and we don't want to
474
# translate the usage string.
475
# Though, bzr export-pot don't exports :Usage: section and it must
477
doc = self.gettext(doc)
479
doc = gettext("No help for this command.")
491
doc = "No help for this command."
481
493
# Extract the summary (purpose) and sections out from the text
482
494
purpose,sections,order = self._get_help_parts(doc)
501
513
# XXX: optparse implicitly rewraps the help, and not always perfectly,
502
514
# so we get <https://bugs.launchpad.net/bzr/+bug/249908>. -- mbp
504
parser = option.get_optparser(self.options())
505
options = parser.format_option_help()
506
# FIXME: According to the spec, ReST option lists actually don't
507
# support options like --1.14 so that causes syntax errors (in Sphinx
508
# at least). As that pattern always appears in the commands that
509
# break, we trap on that and then format that block of 'format' options
510
# as a literal block. We use the most recent format still listed so we
511
# don't have to do that too often -- vila 20110514
512
if not plain and options.find(' --1.14 ') != -1:
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:
513
523
options = options.replace(' format:\n', ' format::\n\n', 1)
514
524
if options.startswith('Options:'):
515
result += gettext(':Options:%s') % (options[len('options:'):],)
525
result += ':' + options
526
elif options.startswith('options:'):
527
# Python 2.4 version of optparse
528
result += ':Options:' + options[len('options:'):]
517
530
result += options
523
536
if sections.has_key(None):
524
537
text = sections.pop(None)
525
538
text = '\n '.join(text.splitlines())
526
result += gettext(':Description:\n %s\n\n') % (text,)
539
result += ':%s:\n %s\n\n' % ('Description',text)
528
541
# Add the custom sections (e.g. Examples). Note that there's no need
529
542
# to indent these as they must be indented already in the source.
531
544
for label in order:
532
if label in sections:
533
result += ':%s:\n%s\n' % (label, sections[label])
545
if sections.has_key(label):
546
result += ':%s:\n%s\n' % (label,sections[label])
536
result += (gettext("See bzr help %s for more details and examples.\n\n")
549
result += ("See bzr help %s for more details and examples.\n\n"
539
552
# Add the aliases, source (plug-in) and see also links, if any
541
result += gettext(':Aliases: ')
554
result += ':Aliases: '
542
555
result += ', '.join(self.aliases) + '\n'
543
556
plugin_name = self.plugin_name()
544
557
if plugin_name is not None:
545
result += gettext(':From: plugin "%s"\n') % plugin_name
558
result += ':From: plugin "%s"\n' % plugin_name
546
559
see_also = self.get_see_also(additional_see_also)
548
561
if not plain and see_also_as_links:
554
567
see_also_links.append(item)
556
569
# Use a Sphinx link for this entry
557
link_text = gettext(":doc:`{0} <{1}-help>`").format(
570
link_text = ":doc:`%s <%s-help>`" % (item, item)
559
571
see_also_links.append(link_text)
560
572
see_also = see_also_links
561
result += gettext(':See also: %s') % ', '.join(see_also) + '\n'
573
result += ':See also: '
574
result += ', '.join(see_also) + '\n'
563
576
# If this will be rendered as plain text, convert it
645
658
def run_argv_aliases(self, argv, alias_argv=None):
646
659
"""Parse the command line and run with extra aliases in alias_argv."""
647
660
args, opts = parse_args(self, argv, alias_argv)
650
662
# Process the standard options
651
663
if 'help' in opts: # e.g. bzr add --help
652
self.outf.write(self.get_help_text())
664
sys.stdout.write(self.get_help_text())
654
666
if 'usage' in opts: # e.g. bzr add --usage
655
self.outf.write(self.get_help_text(verbose=False))
667
sys.stdout.write(self.get_help_text(verbose=False))
657
669
trace.set_verbosity_level(option._verbosity_level)
658
670
if 'verbose' in self.supported_std_options:
768
775
These are all empty initially, because by default nothing should get
771
Hooks.__init__(self, "bzrlib.commands", "Command.hooks")
772
self.add_hook('extend_command',
779
self.create_hook(HookPoint('extend_command',
773
780
"Called after creating a command object to allow modifications "
774
781
"such as adding or removing options, docs etc. Called with the "
775
"new bzrlib.commands.Command object.", (1, 13))
776
self.add_hook('get_command',
782
"new bzrlib.commands.Command object.", (1, 13), None))
783
self.create_hook(HookPoint('get_command',
777
784
"Called when creating a single command. Called with "
778
785
"(cmd_or_None, command_name). get_command should either return "
779
786
"the cmd_or_None parameter, or a replacement Command object that "
780
787
"should be used for the command. Note that the Command.hooks "
781
788
"hooks are core infrastructure. Many users will prefer to use "
782
789
"bzrlib.commands.register_command or plugin_cmds.register_lazy.",
784
self.add_hook('get_missing_command',
791
self.create_hook(HookPoint('get_missing_command',
785
792
"Called when creating a single command if no command could be "
786
793
"found. Called with (command_name). get_missing_command should "
787
794
"either return None, or a Command object to be used for the "
789
self.add_hook('list_commands',
795
"command.", (1, 17), None))
796
self.create_hook(HookPoint('list_commands',
790
797
"Called when enumerating commands. Called with a set of "
791
798
"cmd_name strings for all the commands found so far. This set "
792
799
" is safe to mutate - e.g. to remove a command. "
793
800
"list_commands should return the updated set of command names.",
796
803
Command.hooks = CommandHooks()
840
847
argdict[argname + '_list'] = None
841
848
elif ap[-1] == '+':
843
raise errors.BzrCommandError(gettext(
844
"command {0!r} needs one or more {1}").format(
845
cmd, argname.upper()))
850
raise errors.BzrCommandError("command %r needs one or more %s"
851
% (cmd, argname.upper()))
847
853
argdict[argname + '_list'] = args[:]
849
855
elif ap[-1] == '$': # all but one
850
856
if len(args) < 2:
851
raise errors.BzrCommandError(
852
gettext("command {0!r} needs one or more {1}").format(
853
cmd, argname.upper()))
857
raise errors.BzrCommandError("command %r needs one or more %s"
858
% (cmd, argname.upper()))
854
859
argdict[argname + '_list'] = args[:-1]
857
862
# just a plain arg
860
raise errors.BzrCommandError(
861
gettext("command {0!r} requires argument {1}").format(
862
cmd, argname.upper()))
865
raise errors.BzrCommandError("command %r requires argument %s"
866
% (cmd, argname.upper()))
864
868
argdict[argname] = args.pop(0)
867
raise errors.BzrCommandError( gettext(
868
"extra argument to command {0}: {1}").format(
871
raise errors.BzrCommandError("extra argument to command %s: %s"
956
959
def apply_lsprofiled(filename, the_callable, *args, **kwargs):
957
960
from bzrlib.lsprof import profile
958
ret, stats = profile(exception_to_return_code, the_callable,
961
ret, stats = profile(exception_to_return_code, the_callable, *args, **kwargs)
961
963
if filename is None:
964
966
stats.save(filename)
965
trace.note(gettext('Profile data written to "%s".'), filename)
967
trace.note('Profile data written to "%s".', filename)
971
@deprecated_function(deprecated_in((2, 2, 0)))
972
def shlex_split_unicode(unsplit):
973
return cmdline.split(unsplit)
969
976
def get_alias(cmd, config=None):
970
977
"""Return an expanded alias, or None if no alias exists.
1263
1265
class Provider(object):
1264
"""Generic class to be overriden by plugins"""
1266
'''Generic class to be overriden by plugins'''
1266
1268
def plugin_for_command(self, cmd_name):
1267
"""Takes a command and returns the information for that plugin
1269
'''Takes a command and returns the information for that plugin
1269
1271
:return: A dictionary with all the available information
1270
for the requested plugin
1272
for the requested plugin
1272
1274
raise NotImplementedError
1275
1277
class ProvidersRegistry(registry.Registry):
1276
"""This registry exists to allow other providers to exist"""
1278
'''This registry exists to allow other providers to exist'''
1278
1280
def __iter__(self):
1279
1281
for key, provider in self.iteritems():