##// END OF EJS Templates
setdiscovery: avoid calling any sample building if the undecided set is small...
setdiscovery: avoid calling any sample building if the undecided set is small If the length of undecided is smaller than the sample size, we can just request information for all of them. This conditional was previously handled by '_setupsample'. But '_setupsample' is in my opinion a problematic function with blurry semantics. Having this conditional explicitly earlier makes the code more explicit and moves us closer to removing this '_setupsample' function.

File last commit:

r23624:861ddedf default
r23808:07d0f59e default
Show More
help.py
504 lines | 17.9 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, _
Mads Kiilerich
util: introduce datapath for getting the location of supporting data files...
r22633 import itertools, os
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
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
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
Simon Heimberg
help: filter out deprecated options with untranslated descriptions...
r20743 if not verbose and ("DEPRECATED" in desc or _("DEPRECATED") 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')),
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
def makeitemsdoc(topic, doc, marker, items):
"""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)
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
doclines.append(' ' + l.strip())
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
def addtopicsymbols(topic, marker, symbols):
def add(topic, doc):
return makeitemsdoc(topic, doc, marker, symbols)
addtopichook(topic, add)
Matt Mackall
fileset: add a help topic...
r14686 addtopicsymbols('filesets', '.. predicatesmarker', fileset.symbols)
FUJIWARA Katsunori
filemerge: create detail of internal merge tools from documentation string...
r16126 addtopicsymbols('merge-tools', '.. internaltoolsmarker', filemerge.internals)
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)
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)
except error.AmbiguousCommand, inst:
# 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)