##// END OF EJS Templates
setup: print subprocess stderr if there is any...
setup: print subprocess stderr if there is any I just spent 1.5 days trying to debug a failing buildbot because setup.py was silently dropping the errors that were being printed by in-place hg.

File last commit:

r17837:b623e323 default
r17926:65a46635 default
Show More
help.py
208 lines | 7.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, _
Augie Fackler
help: introduce topicmatch for finding topics matching a keyword
r16710 import itertools, sys, os
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
Cédric Duval
help: adding a new help topic about extensions...
r8863
Matt Mackall
extensions: drop maxlength from enabled and disabled...
r14316 def listexts(header, exts, indent=1):
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()):
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)
rst.extend(listexts(_('enabled extensions:'), extensions.enabled()))
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
Olav Reinert
help: move some helper functions to help.py
r16781 def optrst(options, verbose):
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
if _("DEPRECATED") in desc and not verbose:
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))
rst = minirst.maketable(data, 1)
if multioccur:
Olav Reinert
minirst: generate tables as a list of joined lines
r16815 rst.append(_("\n[+] marked option can be specified multiple times\n"))
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:
if (sum(map(lowercontains, names))
or lowercontains(header)
or lowercontains(doc())):
results['topics'].append((names[0], header))
import commands # avoid cycle
for cmd, entry in commands.table.iteritems():
if cmd.startswith('debug'):
continue
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(
extensions.enabled().iteritems(),
extensions.disabled().iteritems()):
# extensions.load ignores the UI argument
mod = extensions.load(None, name, '')
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():
Augie Fackler
windows: check util.mainfrozen() instead of ad-hoc checks everywhere
r14941 if util.mainfrozen():
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 module = sys.executable
else:
module = __file__
base = os.path.dirname(module)
Dirkjan Ochtman
help: add a topic on git diffs (issue1352)
r7293
Martin Geisler
help: move help topics from mercurial/help.py to help/*.txt...
r9539 for dir in ('.', '..'):
docdir = os.path.join(base, dir, 'help')
if os.path.isdir(docdir):
break
Alexander Solovyov
help: add a topic about some of the templating features
r7677
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)