##// END OF EJS Templates
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)...
hgwebdir: use web.prefix when creating url breadcrumbs (issue3790) The web.prefix setting was being ignored when creating the index URL breadcrumbs. We only need to fix hgwebdir and not hgweb because hgweb gets the complete URL request, including the prefix, while hgwebdir gets a "subdir" which does not include the prefix. This fix is slightly different of what was suggested on the bug tracker. In there it was suggested to hide the prefix itself from the breadcrumb. I think that would be a better solution, but it would require changing all the index templates and passing the prefix to the template engine, which may be too big a change for stable during the freeze. For now this fixes the problem, and the fix could be improved during the next cycle.

File last commit:

r17837:b623e323 default
r18515:bf8bbbf4 stable
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)