346
357
summary, then a complete description of the command. A grammar
347
358
description will be inserted.
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
361
Other accepted names for this command.
364
List of argument forms, marked with whether they are optional,
369
['to_location', 'from_branch?', 'file*']
371
'to_location' is required
372
'from_branch' is optional
373
'file' can be specified 0 or more times
376
List of options that may be given for this command. These can
377
be either strings, referring to globally-defined options,
378
or option objects. Retrieve through options().
381
If true, this command isn't advertised. This is typically
365
382
for commands intended for expert users.
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.
385
Command objects will get a 'outf' attribute, which has been
386
setup to properly handle encoding of unicode strings.
387
encoding_type determines what will happen when characters cannot
389
strict - abort if we cannot decode
390
replace - put in a bogus character (typically '?')
391
exact - do not encode sys.stdout
393
NOTE: by default on Windows, sys.stdout is opened as a text
394
stream, therefore LF line-endings are converted to CRLF.
395
When a command uses encoding_type = 'exact', then
396
sys.stdout is forced to be a binary stream, and line-endings
382
400
A string indicating the real name under which this command was
383
invoked, before expansion of aliases.
401
invoked, before expansion of aliases.
384
402
(This may be None if the command was constructed and run in-process.)
386
404
:cvar hooks: An instance of CommandHooks.
388
:cvar __doc__: The help shown by 'bzr help command' for this command.
406
:ivar __doc__: The help shown by 'bzr help command' for this command.
389
407
This is set by assigning explicitly to __doc__ so that -OO can
393
__doc__ = "My help goes here"
411
__doc__ = "My help goes here"
397
415
takes_options = []
398
416
encoding_type = 'strict'
399
417
invoked_as = None
462
492
usage help (e.g. Purpose, Usage, Options) with a
463
493
message explaining how to obtain full help.
466
i18n.install() # Install i18n only for get_help_text for now.
467
495
doc = self.help()
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.")
497
doc = "No help for this command."
478
499
# Extract the summary (purpose) and sections out from the text
479
500
purpose,sections,order = self._get_help_parts(doc)
498
519
# XXX: optparse implicitly rewraps the help, and not always perfectly,
499
520
# so we get <https://bugs.launchpad.net/bzr/+bug/249908>. -- mbp
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:
522
options = option.get_optparser(self.options()).format_option_help()
523
# XXX: According to the spec, ReST option lists actually don't support
524
# options like --1.9 so that causes syntax errors (in Sphinx at least).
525
# As that pattern always appears in the commands that break, we trap
526
# on that and then format that block of 'format' options as a literal
528
if not plain and options.find(' --1.9 ') != -1:
510
529
options = options.replace(' format:\n', ' format::\n\n', 1)
511
530
if options.startswith('Options:'):
512
result += gettext(':Options:%s') % (options[len('options:'):],)
531
result += ':' + options
532
elif options.startswith('options:'):
533
# Python 2.4 version of optparse
534
result += ':Options:' + options[len('options:'):]
514
536
result += options
520
542
if sections.has_key(None):
521
543
text = sections.pop(None)
522
544
text = '\n '.join(text.splitlines())
523
result += gettext(':Description:\n %s\n\n') % (text,)
545
result += ':%s:\n %s\n\n' % ('Description',text)
525
547
# Add the custom sections (e.g. Examples). Note that there's no need
526
548
# to indent these as they must be indented already in the source.
528
550
for label in order:
529
if label in sections:
530
result += ':%s:\n%s\n' % (label, sections[label])
551
if sections.has_key(label):
552
result += ':%s:\n%s\n' % (label,sections[label])
533
result += (gettext("See bzr help %s for more details and examples.\n\n")
555
result += ("See bzr help %s for more details and examples.\n\n"
536
558
# Add the aliases, source (plug-in) and see also links, if any
538
result += gettext(':Aliases: ')
560
result += ':Aliases: '
539
561
result += ', '.join(self.aliases) + '\n'
540
562
plugin_name = self.plugin_name()
541
563
if plugin_name is not None:
542
result += gettext(':From: plugin "%s"\n') % plugin_name
564
result += ':From: plugin "%s"\n' % plugin_name
543
565
see_also = self.get_see_also(additional_see_also)
545
567
if not plain and see_also_as_links:
551
573
see_also_links.append(item)
553
575
# Use a Sphinx link for this entry
554
link_text = gettext(":doc:`{0} <{1}-help>`").format(
576
link_text = ":doc:`%s <%s-help>`" % (item, item)
556
577
see_also_links.append(link_text)
557
578
see_also = see_also_links
558
result += gettext(':See also: %s') % ', '.join(see_also) + '\n'
579
result += ':See also: '
580
result += ', '.join(see_also) + '\n'
560
582
# If this will be rendered as plain text, convert it
642
664
def run_argv_aliases(self, argv, alias_argv=None):
643
665
"""Parse the command line and run with extra aliases in alias_argv."""
644
666
args, opts = parse_args(self, argv, alias_argv)
647
668
# Process the standard options
648
669
if 'help' in opts: # e.g. bzr add --help
649
self.outf.write(self.get_help_text())
670
sys.stdout.write(self.get_help_text())
651
672
if 'usage' in opts: # e.g. bzr add --usage
652
self.outf.write(self.get_help_text(verbose=False))
673
sys.stdout.write(self.get_help_text(verbose=False))
654
675
trace.set_verbosity_level(option._verbosity_level)
655
676
if 'verbose' in self.supported_std_options:
691
715
class_run = self.run
692
716
def run(*args, **kwargs):
693
for hook in Command.hooks['pre_command']:
695
717
self._operation = cleanup.OperationWithCleanups(class_run)
697
719
return self._operation.run_simple(*args, **kwargs)
699
721
del self._operation
700
for hook in Command.hooks['post_command']:
724
@deprecated_method(deprecated_in((2, 2, 0)))
725
def run_direct(self, *args, **kwargs):
726
"""Deprecated thunk from bzrlib 2.1."""
727
return self.run(*args, **kwargs)
705
730
"""Actually run the command.
847
857
argdict[argname + '_list'] = None
848
858
elif ap[-1] == '+':
850
raise errors.BzrCommandError(gettext(
851
"command {0!r} needs one or more {1}").format(
852
cmd, argname.upper()))
860
raise errors.BzrCommandError("command %r needs one or more %s"
861
% (cmd, argname.upper()))
854
863
argdict[argname + '_list'] = args[:]
856
865
elif ap[-1] == '$': # all but one
857
866
if len(args) < 2:
858
raise errors.BzrCommandError(
859
gettext("command {0!r} needs one or more {1}").format(
860
cmd, argname.upper()))
867
raise errors.BzrCommandError("command %r needs one or more %s"
868
% (cmd, argname.upper()))
861
869
argdict[argname + '_list'] = args[:-1]
864
872
# just a plain arg
867
raise errors.BzrCommandError(
868
gettext("command {0!r} requires argument {1}").format(
869
cmd, argname.upper()))
875
raise errors.BzrCommandError("command %r requires argument %s"
876
% (cmd, argname.upper()))
871
878
argdict[argname] = args.pop(0)
874
raise errors.BzrCommandError( gettext(
875
"extra argument to command {0}: {1}").format(
881
raise errors.BzrCommandError("extra argument to command %s: %s"
935
941
exitcode = trace.report_exception(exc_info, sys.stderr)
936
942
if os.environ.get('BZR_PDB'):
937
943
print '**** entering debugger'
939
pdb.post_mortem(exc_info[2])
946
if sys.version_info[:2] < (2, 6):
948
# pdb.post_mortem(tb)
949
# but because pdb.post_mortem gives bad results for tracebacks
950
# from inside generators, we do it manually.
951
# (http://bugs.python.org/issue4150, fixed in Python 2.6)
953
# Setup pdb on the traceback
956
p.setup(tb.tb_frame, tb)
957
# Point the debugger at the deepest frame of the stack
958
p.curindex = len(p.stack) - 1
959
p.curframe = p.stack[p.curindex][0]
960
# Start the pdb prompt.
961
p.print_stack_entry(p.stack[p.curindex])
943
969
def apply_lsprofiled(filename, the_callable, *args, **kwargs):
944
970
from bzrlib.lsprof import profile
945
ret, stats = profile(exception_to_return_code, the_callable,
971
ret, stats = profile(exception_to_return_code, the_callable, *args, **kwargs)
948
973
if filename is None:
951
976
stats.save(filename)
952
trace.note(gettext('Profile data written to "%s".'), filename)
977
trace.note('Profile data written to "%s".', filename)
981
@deprecated_function(deprecated_in((2, 2, 0)))
982
def shlex_split_unicode(unsplit):
983
return cmdline.split(unsplit)
956
986
def get_alias(cmd, config=None):
957
987
"""Return an expanded alias, or None if no alias exists.
1264
1276
class Provider(object):
1265
"""Generic class to be overriden by plugins"""
1277
'''Generic class to be overriden by plugins'''
1267
1279
def plugin_for_command(self, cmd_name):
1268
"""Takes a command and returns the information for that plugin
1280
'''Takes a command and returns the information for that plugin
1270
1282
:return: A dictionary with all the available information
1271
for the requested plugin
1283
for the requested plugin
1273
1285
raise NotImplementedError
1276
1288
class ProvidersRegistry(registry.Registry):
1277
"""This registry exists to allow other providers to exist"""
1289
'''This registry exists to allow other providers to exist'''
1279
1291
def __iter__(self):
1280
1292
for key, provider in self.iteritems():