##// END OF EJS Templates
help: scripting help topic...
help: scripting help topic There are a lot of non-human consumers of Mercurial. And the challenges and considerations for machines consuming Mercurial is significantly different from what humans face. I think there are enough special considerations around how machines consume Mercurial that a dedicated help topic is warranted. I concede the audience for this topic is probably small compared to the general audience. However, lots of normal Mercurial users do things like create one-off shell scripts for common workflows that I think this is useful enough to be in the install (as opposed to, say, a wiki page - which most users will likely never find). This text is by no means perfect. But you have to start somewhere. I think I did cover the important parts, though.

File last commit:

r25881:9de44351 stable
r25881:9de44351 stable
Show More
help.py
519 lines | 18.6 KiB | text/x-python | PythonLexer
Matt Mackall
Add basic support for help topics and a dates topic
r3795 # help.py - help data for mercurial
#
# Copyright 2006 Matt Mackall <mpm@selenic.com>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Matt Mackall
Add basic support for help topics and a dates topic
r3795
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 from i18n import gettext, _
Gregory Szorc
help: teach topic symbols how to dedent...
r24098 import itertools, os, textwrap
Augie Fackler
cleanup: move stdlib imports to their own import statement...
r20034 import error
FUJIWARA Katsunori
filemerge: create detail of internal merge tools from documentation string...
r16126 import extensions, revset, fileset, templatekw, templatefilters, filemerge
Gregory Szorc
help: populate template functions via docstrings...
r24587 import templater
Olav Reinert
help: move some helper functions to help.py
r16781 import encoding, util, minirst
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 import cmdutil
Gregory Szorc
help: add web commands to help documentation...
r24080 import hgweb.webcommands as webcommands
Cédric Duval
help: adding a new help topic about extensions...
r8863
Augie Fackler
help: exclude deprecated extensions in the disabled part of 'help extensions'
r20582 def listexts(header, exts, indent=1, showdeprecated=False):
Cédric Duval
help: more improvements for the extensions topic...
r8879 '''return a text listing of the given extensions'''
Olav Reinert
help: format extension lists using RST...
r16852 rst = []
if exts:
rst.append('\n%s\n\n' % header)
for name, desc in sorted(exts.iteritems()):
Augie Fackler
help: exclude deprecated extensions in the disabled part of 'help extensions'
r20582 if '(DEPRECATED)' in desc and not showdeprecated:
continue
Olav Reinert
help: format extension lists using RST...
r16852 rst.append('%s:%s: %s\n' % (' ' * indent, name, desc))
return rst
Cédric Duval
help: refactor extensions listing, and show enabled ones in the dedicated topic
r8864
Cédric Duval
help: more improvements for the extensions topic...
r8879 def extshelp():
Olav Reinert
help: format extension lists using RST...
r16852 rst = loaddoc('extensions')().splitlines(True)
Augie Fackler
help: exclude deprecated extensions in the disabled part of 'help extensions'
r20582 rst.extend(listexts(
_('enabled extensions:'), extensions.enabled(), showdeprecated=True))
Olav Reinert
help: format extension lists using RST...
r16852 rst.extend(listexts(_('disabled extensions:'), extensions.disabled()))
doc = ''.join(rst)
Cédric Duval
help: adding a new help topic about extensions...
r8863 return doc
Martin Geisler
i18n: mark help strings for translation...
r7013
Matt Mackall
help: roll option list header into option formatter
r22116 def optrst(header, options, verbose):
Olav Reinert
help: move some helper functions to help.py
r16781 data = []
multioccur = False
for option in options:
if len(option) == 5:
shortopt, longopt, default, desc, optlabel = option
else:
shortopt, longopt, default, desc = option
optlabel = _("VALUE") # default label
Siddharth Agarwal
help: also hide options marked EXPERIMENTAL...
r24871 if not verbose and ("DEPRECATED" in desc or _("DEPRECATED") in desc or
"EXPERIMENTAL" in desc or
_("EXPERIMENTAL") in desc):
Olav Reinert
help: move some helper functions to help.py
r16781 continue
so = ''
if shortopt:
so = '-' + shortopt
lo = '--' + longopt
if default:
desc += _(" (default: %s)") % default
if isinstance(default, list):
lo += " %s [+]" % optlabel
multioccur = True
elif (default is not None) and not isinstance(default, bool):
lo += " %s" % optlabel
data.append((so, lo, desc))
Matt Mackall
help: fold repeatable option message into option table header...
r22117 if multioccur:
header += (_(" ([+] can be repeated)"))
Olav Reinert
help: move some helper functions to help.py
r16781
Matt Mackall
help: roll option list header into option formatter
r22116 rst = ['\n%s:\n\n' % header]
rst.extend(minirst.maketable(data, 1))
Olav Reinert
help: move some helper functions to help.py
r16781
Olav Reinert
minirst: generate tables as a list of joined lines
r16815 return ''.join(rst)
Olav Reinert
help: move some helper functions to help.py
r16781
FUJIWARA Katsunori
help: indicate help omitting if help document is not fully displayed...
r17837 def indicateomitted(rst, omitted, notomitted=None):
rst.append('\n\n.. container:: omitted\n\n %s\n\n' % omitted)
if notomitted:
rst.append('\n\n.. container:: notomitted\n\n %s\n\n' % notomitted)
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 def topicmatch(kw):
"""Return help topics matching kw.
Returns {'section': [(name, summary), ...], ...} where section is
one of topics, commands, extensions, or extensioncommands.
"""
kw = encoding.lower(kw)
def lowercontains(container):
Nikolaj Sjujskij
help: fix search with `-k` option in non-ASCII locales...
r16845 return kw in encoding.lower(container) # translated in helptable
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 results = {'topics': [],
'commands': [],
'extensions': [],
'extensioncommands': [],
}
for names, header, doc in helptable:
Gregory Szorc
help: only call doc() when it is callable...
r22322 # Old extensions may use a str as doc.
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 if (sum(map(lowercontains, names))
or lowercontains(header)
Gregory Szorc
help: only call doc() when it is callable...
r22322 or (callable(doc) and lowercontains(doc()))):
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 results['topics'].append((names[0], header))
import commands # avoid cycle
for cmd, entry in commands.table.iteritems():
if len(entry) == 3:
summary = entry[2]
else:
summary = ''
Nikolaj Sjujskij
help: fix search with `-k` option in non-ASCII locales...
r16845 # translate docs *before* searching there
docs = _(getattr(entry[0], '__doc__', None)) or ''
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 if kw in cmd or lowercontains(summary) or lowercontains(docs):
Nikolaj Sjujskij
help: fix search with `-k` option in non-ASCII locales...
r16845 doclines = docs.splitlines()
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 if doclines:
summary = doclines[0]
cmdname = cmd.split('|')[0].lstrip('^')
results['commands'].append((cmdname, summary))
for name, docs in itertools.chain(
FUJIWARA Katsunori
help: use full name of extensions to look up them for keyword search...
r19769 extensions.enabled(False).iteritems(),
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 extensions.disabled().iteritems()):
# extensions.load ignores the UI argument
mod = extensions.load(None, name, '')
FUJIWARA Katsunori
help: use full name of extensions to look up them for keyword search...
r19769 name = name.split('.')[-1]
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 if lowercontains(name) or lowercontains(docs):
Nikolaj Sjujskij
help: fix search with `-k` option in non-ASCII locales...
r16845 # extension docs are already translated
results['extensions'].append((name, docs.splitlines()[0]))
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 for cmd, entry in getattr(mod, 'cmdtable', {}).iteritems():
Augie Fackler
help: add --keyword (-k) for searching help
r16711 if kw in cmd or (len(entry) > 2 and lowercontains(entry[2])):
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 cmdname = cmd.split('|')[0].lstrip('^')
Olav Reinert
help: fix extension commands help in keyword search...
r16942 if entry[0].__doc__:
cmddoc = gettext(entry[0].__doc__).splitlines()[0]
Thomas Arendsen Hein
help: fix 'hg help -k' matching an extension without docs...
r16884 else:
cmddoc = _('(no help text available)')
results['extensioncommands'].append((cmdname, cmddoc))
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 return results
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 def loaddoc(topic):
"""Return a delayed loader for help/topic.txt."""
Matt Mackall
move environment topic
r3798
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 def loader():
Mads Kiilerich
help: don't search randomly for help data - trust util.datapath...
r22637 docdir = os.path.join(util.datapath, 'help')
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 path = os.path.join(docdir, topic + ".txt")
Dan Villiom Podlaski Christiansen
prevent transient leaks of file handle by using new helper functions...
r14168 doc = gettext(util.readfile(path))
Patrick Mezard
help: add topic rewriting hooks...
r12820 for rewriter in helphooks.get(topic, []):
doc = rewriter(topic, doc)
return doc
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 return loader
Alexander Solovyov
help: add a topic about some of the templating features
r7677
Yun Lee
help: sort help topics to make the output more readable (issue2751)
r13888 helptable = sorted([
Martin Geisler
help: make "hg help hgrc" an alias for "hg help config"
r12145 (["config", "hgrc"], _("Configuration Files"), loaddoc('config')),
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 (["dates"], _("Date Formats"), loaddoc('dates')),
(["patterns"], _("File Name Patterns"), loaddoc('patterns')),
Matt Mackall
many, many trivial check-code fixups
r10282 (['environment', 'env'], _('Environment Variables'),
loaddoc('environment')),
Mads Kiilerich
help: use the first topic name from helptable, not the longest alias...
r17322 (['revisions', 'revs'], _('Specifying Single Revisions'),
Matt Mackall
many, many trivial check-code fixups
r10282 loaddoc('revisions')),
Mads Kiilerich
help: use the first topic name from helptable, not the longest alias...
r17322 (['multirevs', 'mrevs'], _('Specifying Multiple Revisions'),
Matt Mackall
many, many trivial check-code fixups
r10282 loaddoc('multirevs')),
Mads Kiilerich
help: use the first topic name from helptable, not the longest alias...
r17322 (['revsets', 'revset'], _("Specifying Revision Sets"), loaddoc('revsets')),
(['filesets', 'fileset'], _("Specifying File Sets"), loaddoc('filesets')),
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 (['diffs'], _('Diff Formats'), loaddoc('diffs')),
Mads Kiilerich
help: add 'mergetools' alias for the 'merge-tools' help topic...
r17323 (['merge-tools', 'mergetools'], _('Merge Tools'), loaddoc('merge-tools')),
A. S. Budden
help: add reference to template help (issue3413)...
r16568 (['templating', 'templates', 'template', 'style'], _('Template Usage'),
Matt Mackall
many, many trivial check-code fixups
r10282 loaddoc('templates')),
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 (['urls'], _('URL Paths'), loaddoc('urls')),
Martin Geisler
help: consistently use title capitalization for help topics
r16547 (["extensions"], _("Using Additional Features"), extshelp),
Mads Kiilerich
help: use the first topic name from helptable, not the longest alias...
r17322 (["subrepos", "subrepo"], _("Subrepositories"), loaddoc('subrepos')),
Mads Kiilerich
help: fix helptable indentation
r17321 (["hgweb"], _("Configuring hgweb"), loaddoc('hgweb')),
(["glossary"], _("Glossary"), loaddoc('glossary')),
(["hgignore", "ignore"], _("Syntax for Mercurial Ignore Files"),
loaddoc('hgignore')),
(["phases"], _("Working with Phases"), loaddoc('phases')),
Gregory Szorc
help: scripting help topic...
r25881 (['scripting'], _('Using Mercurial from scripts and automation'),
loaddoc('scripting')),
Yun Lee
help: sort help topics to make the output more readable (issue2751)
r13888 ])
Patrick Mezard
help: add topic rewriting hooks...
r12820
# Map topics to lists of callable taking the current topic help and
# returning the updated version
Matt Mackall
help: consolidate topic hooks in help.py...
r14318 helphooks = {}
Patrick Mezard
help: add topic rewriting hooks...
r12820
def addtopichook(topic, rewriter):
helphooks.setdefault(topic, []).append(rewriter)
Patrick Mezard
help: extract items doc generation function
r13593
Gregory Szorc
help: teach topic symbols how to dedent...
r24098 def makeitemsdoc(topic, doc, marker, items, dedent=False):
Patrick Mezard
help: extract items doc generation function
r13593 """Extract docstring from the items key to function mapping, build a
.single documentation block and use it to overwrite the marker in doc
"""
entries = []
for name in sorted(items):
text = (items[name].__doc__ or '').rstrip()
if not text:
continue
text = gettext(text)
Gregory Szorc
help: teach topic symbols how to dedent...
r24098 if dedent:
text = textwrap.dedent(text)
Patrick Mezard
help: extract items doc generation function
r13593 lines = text.splitlines()
"Yann E. MORIN"
help: strip doctest from dochelp...
r16250 doclines = [(lines[0])]
for l in lines[1:]:
# Stop once we find some Python doctest
if l.strip().startswith('>>>'):
break
Gregory Szorc
help: teach topic symbols how to dedent...
r24098 if dedent:
doclines.append(l.rstrip())
else:
doclines.append(' ' + l.strip())
"Yann E. MORIN"
help: strip doctest from dochelp...
r16250 entries.append('\n'.join(doclines))
Patrick Mezard
help: extract items doc generation function
r13593 entries = '\n\n'.join(entries)
return doc.replace(marker, entries)
Matt Mackall
help: consolidate topic hooks in help.py...
r14318
Gregory Szorc
help: teach topic symbols how to dedent...
r24098 def addtopicsymbols(topic, marker, symbols, dedent=False):
Matt Mackall
help: consolidate topic hooks in help.py...
r14318 def add(topic, doc):
Gregory Szorc
help: teach topic symbols how to dedent...
r24098 return makeitemsdoc(topic, doc, marker, symbols, dedent=dedent)
Matt Mackall
help: consolidate topic hooks in help.py...
r14318 addtopichook(topic, add)
Matt Mackall
fileset: add a help topic...
r14686 addtopicsymbols('filesets', '.. predicatesmarker', fileset.symbols)
Gregory Szorc
help.merge-tools: do not double document merge tools...
r24099 addtopicsymbols('merge-tools', '.. internaltoolsmarker',
filemerge.internalsdoc)
Matt Mackall
help: consolidate topic hooks in help.py...
r14318 addtopicsymbols('revsets', '.. predicatesmarker', revset.symbols)
epriestley
templatekw/help: document the {parents} keyword...
r17187 addtopicsymbols('templates', '.. keywordsmarker', templatekw.dockeywords)
Matt Mackall
help: consolidate topic hooks in help.py...
r14318 addtopicsymbols('templates', '.. filtersmarker', templatefilters.filters)
Gregory Szorc
help: populate template functions via docstrings...
r24587 addtopicsymbols('templates', '.. functionsmarker', templater.funcs)
Gregory Szorc
help: teach topic symbols how to dedent...
r24098 addtopicsymbols('hgweb', '.. webcommandsmarker', webcommands.commands,
dedent=True)
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746
def help_(ui, name, unknowncmd=False, full=True, **opts):
'''
Generate the help for 'name' as unformatted restructured text. If
'name' is None, describe the commands available.
'''
import commands # avoid cycle
def helpcmd(name):
try:
aliases, entry = cmdutil.findcmd(name, commands.table,
strict=unknowncmd)
Gregory Szorc
global: mass rewrite to use modern exception syntax...
r25660 except error.AmbiguousCommand as inst:
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 # py3k fix: except vars can't be used outside the scope of the
# except block, nor can be used inside a lambda. python issue4617
prefix = inst.args[0]
select = lambda c: c.lstrip('^').startswith(prefix)
rst = helplist(select)
return rst
rst = []
# check if it's an invalid alias and display its error if it is
Yuya Nishihara
alias: keep error message in "badalias" so that help can see it...
r22160 if getattr(entry[0], 'badalias', None):
Yuya Nishihara
help: provide help of bad alias without executing aliascmd()...
r22162 rst.append(entry[0].badalias + '\n')
if entry[0].unknowncmd:
try:
rst.extend(helpextcmd(entry[0].cmdname))
except error.UnknownCommand:
pass
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 return rst
# synopsis
if len(entry) > 2:
if entry[2].startswith('hg'):
rst.append("%s\n" % entry[2])
else:
rst.append('hg %s %s\n' % (aliases[0], entry[2]))
else:
rst.append('hg %s\n' % aliases[0])
# aliases
if full and not ui.quiet and len(aliases) > 1:
rst.append(_("\naliases: %s\n") % ', '.join(aliases[1:]))
rst.append('\n')
# description
doc = gettext(entry[0].__doc__)
if not doc:
doc = _("(no help text available)")
if util.safehasattr(entry[0], 'definition'): # aliased command
if entry[0].definition.startswith('!'): # shell alias
doc = _('shell alias for::\n\n %s') % entry[0].definition[1:]
else:
doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
doc = doc.splitlines(True)
if ui.quiet or not full:
rst.append(doc[0])
else:
rst.extend(doc)
rst.append('\n')
# check if this command shadows a non-trivial (multi-line)
# extension help text
try:
mod = extensions.find(name)
doc = gettext(mod.__doc__) or ''
if '\n' in doc.strip():
Matt Mackall
help: normalize extension shadow hint
r22112 msg = _('(use "hg help -e %s" to show help for '
'the %s extension)') % (name, name)
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 rst.append('\n%s\n' % msg)
except KeyError:
pass
# options
if not ui.quiet and entry[1]:
Matt Mackall
help: roll option list header into option formatter
r22116 rst.append(optrst(_("options"), entry[1], ui.verbose))
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746
if ui.verbose:
Matt Mackall
help: roll option list header into option formatter
r22116 rst.append(optrst(_("global options"),
commands.globalopts, ui.verbose))
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746
if not ui.verbose:
if not full:
Matt Mackall
help: improve command summary hint...
r22111 rst.append(_('\n(use "hg %s -h" to show more help)\n')
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 % name)
elif not ui.quiet:
Matt Mackall
help: tweak --verbose command help hint...
r22110 rst.append(_('\n(some details hidden, use --verbose '
'to show complete help)'))
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746
return rst
def helplist(select=None):
# list of commands
if name == "shortlist":
header = _('basic commands:\n\n')
Mads Kiilerich
help: let 'hg help debug' show the list of secret debug commands...
r20822 elif name == "debug":
header = _('debug commands (internal and unsupported):\n\n')
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 else:
header = _('list of commands:\n\n')
h = {}
cmds = {}
for c, e in commands.table.iteritems():
f = c.split("|", 1)[0]
if select and not select(f):
continue
if (not select and name != 'shortlist' and
e[0].__module__ != commands.__name__):
continue
if name == "shortlist" and not f.startswith("^"):
continue
f = f.lstrip("^")
Mads Kiilerich
help: let 'hg help debug' show the list of secret debug commands...
r20822 if not ui.debugflag and f.startswith("debug") and name != "debug":
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 continue
doc = e[0].__doc__
if doc and 'DEPRECATED' in doc and not ui.verbose:
continue
doc = gettext(doc)
if not doc:
doc = _("(no help text available)")
h[f] = doc.splitlines()[0].rstrip()
cmds[f] = c.lstrip("^")
rst = []
if not h:
if not ui.quiet:
rst.append(_('no commands defined\n'))
return rst
if not ui.quiet:
rst.append(header)
fns = sorted(h)
for f in fns:
if ui.verbose:
commacmds = cmds[f].replace("|",", ")
rst.append(" :%s: %s\n" % (commacmds, h[f]))
else:
rst.append(' :%s: %s\n' % (f, h[f]))
if not name:
exts = listexts(_('enabled extensions:'), extensions.enabled())
if exts:
rst.append('\n')
rst.extend(exts)
rst.append(_("\nadditional help topics:\n\n"))
topics = []
for names, header, doc in helptable:
topics.append((names[0], header))
for t, desc in topics:
rst.append(" :%s: %s\n" % (t, desc))
Matt Mackall
help: refactor helplist optlist mess...
r22115 if ui.quiet:
pass
elif ui.verbose:
Matt Mackall
help: roll option list header into option formatter
r22116 rst.append('\n%s\n' % optrst(_("global options"),
commands.globalopts, ui.verbose))
Matt Mackall
help: refactor helplist optlist mess...
r22115 if name == 'shortlist':
Matt Mackall
help: normalize helplist hints
r22118 rst.append(_('\n(use "hg help" for the full list '
'of commands)\n'))
Matt Mackall
help: refactor helplist optlist mess...
r22115 else:
if name == 'shortlist':
Matt Mackall
help: normalize helplist hints
r22118 rst.append(_('\n(use "hg help" for the full list of commands '
'or "hg -v" for details)\n'))
Matt Mackall
help: refactor helplist optlist mess...
r22115 elif name and not full:
Matt Mackall
help: normalize helplist hints
r22118 rst.append(_('\n(use "hg help %s" to show the full help '
'text)\n') % name)
Chingis Dugarzhapov
help: suggest '-v -e' to get built-in aliases for extensions (issue4461)...
r23624 elif name and cmds and name in cmds.keys():
rst.append(_('\n(use "hg help -v -e %s" to show built-in '
'aliases and global options)\n') % name)
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 else:
Matt Mackall
help: normalize helplist hints
r22118 rst.append(_('\n(use "hg help -v%s" to show built-in aliases '
'and global options)\n')
% (name and " " + name or ""))
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 return rst
def helptopic(name):
for names, header, doc in helptable:
if name in names:
break
else:
raise error.UnknownCommand(name)
Dan Villiom Podlaski Christiansen
help: use a full header for topic titles...
r18748 rst = [minirst.section(header)]
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 # description
if not doc:
rst.append(" %s\n" % _("(no help text available)"))
Augie Fackler
help: restore use of callable() since it was readded in Python 3.2
r21796 if callable(doc):
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 rst += [" %s\n" % l for l in doc().splitlines()]
if not ui.verbose:
Matt Mackall
help: normalize topic and extension verbose hints
r22114 omitted = _('(some details hidden, use --verbose'
' to show complete help)')
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 indicateomitted(rst, omitted)
try:
cmdutil.findcmd(name, commands.table)
rst.append(_('\nuse "hg help -c %s" to see help for '
'the %s command\n') % (name, name))
except error.UnknownCommand:
pass
return rst
def helpext(name):
try:
mod = extensions.find(name)
doc = gettext(mod.__doc__) or _('no help text available')
except KeyError:
mod = None
doc = extensions.disabledext(name)
if not doc:
raise error.UnknownCommand(name)
if '\n' not in doc:
head, tail = doc, ""
else:
head, tail = doc.split('\n', 1)
rst = [_('%s extension - %s\n\n') % (name.split('.')[-1], head)]
if tail:
rst.extend(tail.splitlines(True))
rst.append('\n')
if not ui.verbose:
Matt Mackall
help: normalize topic and extension verbose hints
r22114 omitted = _('(some details hidden, use --verbose'
' to show complete help)')
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 indicateomitted(rst, omitted)
if mod:
try:
ct = mod.cmdtable
except AttributeError:
ct = {}
modcmds = set([c.split('|', 1)[0] for c in ct])
rst.extend(helplist(modcmds.__contains__))
else:
Matt Mackall
help: normalize hint about enabling extensions
r22113 rst.append(_('(use "hg help extensions" for information on enabling'
' extensions)\n'))
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 return rst
def helpextcmd(name):
cmd, ext, mod = extensions.disabledcmd(ui, name,
ui.configbool('ui', 'strict'))
doc = gettext(mod.__doc__).splitlines()[0]
rst = listexts(_("'%s' is provided by the following "
"extension:") % cmd, {ext: doc}, indent=4)
rst.append('\n')
Matt Mackall
help: normalize hint about enabling extensions
r22113 rst.append(_('(use "hg help extensions" for information on enabling '
'extensions)\n'))
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 return rst
rst = []
kw = opts.get('keyword')
if kw:
matches = topicmatch(kw)
for t, title in (('topics', _('Topics')),
('commands', _('Commands')),
('extensions', _('Extensions')),
('extensioncommands', _('Extension Commands'))):
if matches[t]:
rst.append('%s:\n\n' % title)
rst.extend(minirst.maketable(sorted(matches[t]), 1))
rst.append('\n')
Pierre-Yves David
help: provide a more helpful message when no keyword are matched...
r21288 if not rst:
msg = _('no matches')
hint = _('try "hg help" for a list of topics')
raise util.Abort(msg, hint=hint)
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 elif name and name != 'shortlist':
if unknowncmd:
queries = (helpextcmd,)
elif opts.get('extension'):
queries = (helpext,)
elif opts.get('command'):
queries = (helpcmd,)
else:
queries = (helptopic, helpcmd, helpext, helpextcmd)
for f in queries:
try:
rst = f(name)
break
Pierre-Yves David
help: suggest keyword search when no topic is found...
r21289 except error.UnknownCommand:
pass
else:
if unknowncmd:
raise error.UnknownCommand(name)
else:
msg = _('no such help topic: %s') % name
hint = _('try "hg help --keyword %s"') % name
raise util.Abort(msg, hint=hint)
Dan Villiom Podlaski Christiansen
help: move the majority of the help command to the help module...
r18746 else:
# program name
if not ui.quiet:
rst = [_("Mercurial Distributed SCM\n"), '\n']
rst.extend(helplist())
return ''.join(rst)