277
def get_help_text(self, additional_see_also=None):
279
def get_help_text(self, additional_see_also=None, plain=True,
280
see_also_as_links=False):
278
281
"""Return a text string with help for this command.
280
283
:param additional_see_also: Additional help topics to be
281
284
cross-referenced.
285
:param plain: if False, raw help (reStructuredText) is
286
returned instead of plain text.
287
:param see_also_as_links: if True, convert items in 'See also'
288
list to internal links (used by bzr_man rstx generator)
283
290
doc = self.help()
285
292
raise NotImplementedError("sorry, no detailed help yet for %r" % self.name())
294
# Extract the summary (purpose) and sections out from the text
295
purpose,sections = self._get_help_parts(doc)
297
# If a custom usage section was provided, use it
298
if sections.has_key('Usage'):
299
usage = sections.pop('Usage')
301
usage = self._usage()
303
# The header is the purpose and usage
288
result += 'usage: %s\n' % self._usage()
305
result += ':Purpose: %s\n' % purpose
306
if usage.find('\n') >= 0:
307
result += ':Usage:\n%s\n' % usage
309
result += ':Usage: %s\n' % usage
313
options = option.get_optparser(self.options()).format_option_help()
314
if options.startswith('Options:'):
315
result += ':' + options
316
elif options.startswith('options:'):
317
# Python 2.4 version of optparse
318
result += ':Options:' + options[len('options:'):]
323
# Add the description, indenting it 2 spaces
324
# to match the indentation of the options
325
if sections.has_key(None):
326
text = sections.pop(None)
327
text = '\n '.join(text.splitlines())
328
result += ':%s:\n %s\n\n' % ('Description',text)
330
# Add the custom sections (e.g. Examples). Note that there's no need
331
# to indent these as they must be indented already in the source.
333
labels = sorted(sections.keys())
335
result += ':%s:\n%s\n\n' % (label,sections[label])
337
# Add the aliases, source (plug-in) and see also links, if any
291
result += 'aliases: '
339
result += ':Aliases: '
292
340
result += ', '.join(self.aliases) + '\n'
296
341
plugin_name = self.plugin_name()
297
342
if plugin_name is not None:
298
result += '(From plugin "%s")' % plugin_name
302
if result[-1] != '\n':
305
result += option.get_optparser(self.options()).format_option_help()
343
result += ':From: plugin "%s"\n' % plugin_name
306
344
see_also = self.get_see_also(additional_see_also)
308
result += '\nSee also: '
309
result += ', '.join(see_also)
346
if not plain and see_also_as_links:
348
for item in see_also:
350
# topics doesn't have an independent section
351
# so don't create a real link
352
see_also_links.append(item)
354
# Use a reST link for this entry
355
see_also_links.append("`%s`_" % (item,))
356
see_also = see_also_links
357
result += ':See also: '
358
result += ', '.join(see_also) + '\n'
360
# If this will be rendered as plan text, convert it
362
import bzrlib.help_topics
363
result = bzrlib.help_topics.help_as_plain_text(result)
367
def _get_help_parts(text):
368
"""Split help text into a summary and named sections.
370
:return: (summary,sections) where summary is the top line and
371
sections is a dictionary of the rest indexed by section name.
372
A section starts with a heading line of the form ":xxx:".
373
Indented text on following lines is the section value.
374
All text found outside a named section is assigned to the
375
default section which is given the key of None.
377
def save_section(sections, label, section):
379
if sections.has_key(label):
380
sections[label] += '\n' + section
382
sections[label] = section
384
lines = text.rstrip().splitlines()
385
summary = lines.pop(0)
387
label,section = None,''
389
if line.startswith(':') and line.endswith(':') and len(line) > 2:
390
save_section(sections, label, section)
391
label,section = line[1:-1],''
392
elif label != None and len(line) > 1 and not line[0].isspace():
393
save_section(sections, label, section)
394
label,section = None,line
397
section += '\n' + line
400
save_section(sections, label, section)
401
return summary, sections
313
403
def get_help_topic(self):
314
404
"""Return the commands help topic - its name."""
315
405
return self.name()
317
407
def get_see_also(self, additional_terms=None):
318
"""Return a list of help topics that are related to this ommand.
408
"""Return a list of help topics that are related to this command.
320
410
The list is derived from the content of the _see_also attribute. Any
321
411
duplicates are removed and the result is in lexical order.
372
463
DeprecationWarning, stacklevel=2)
374
465
args, opts = parse_args(self, argv, alias_argv)
467
# Process the standard options
375
468
if 'help' in opts: # e.g. bzr add --help
376
469
sys.stdout.write(self.get_help_text())
471
trace.set_verbosity_level(option._verbosity_level)
472
if 'verbose' in self.supported_std_options:
473
opts['verbose'] = trace.is_verbose()
474
elif opts.has_key('verbose'):
476
if 'quiet' in self.supported_std_options:
477
opts['quiet'] = trace.is_quiet()
478
elif opts.has_key('quiet'):
378
481
# mix arguments and options into one dictionary
379
482
cmdargs = _match_argform(self.name(), self.takes_args, args)