##// END OF EJS Templates
cleanup: migrate from re.escape to stringutil.reescape...
cleanup: migrate from re.escape to stringutil.reescape This has consistent behavior on Python 2.7, 3.6, and 3.7 and has the benefit of probably being a little faster. Test output changes are largely because / used to be pointlessly escaped. Differential Revision: https://phab.mercurial-scm.org/D3842

File last commit:

r32336:ff874d34 default
r38494:67dc32d4 @56 default
Show More
gendoc.py
228 lines | 6.6 KiB | text/x-python | PythonLexer
timeless
doc: add execute bit and fix shbang line for gendoc.py
r27496 #!/usr/bin/env python
Takumi IINO
gendoc: dispatch print document content by commandline arguments...
r19425 """usage: %s DOC ...
where DOC is the name of a document
"""
Pulkit Goyal
py3: make gendoc use absolute_import...
r28966 from __future__ import absolute_import
import os
import sys
import textwrap
Gregory Szorc
doc: make gendoc.py module import policy aware...
r27330
# This script is executed during installs and may not have C extensions
# available. Relax C module requirements.
os.environ['HGMODULEPOLICY'] = 'allow'
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 # import from the live mercurial repo
sys.path.insert(0, "..")
Matt Mackall
gendoc: use demandimport
r5209 from mercurial import demandimport; demandimport.enable()
Yuya Nishihara
gendoc: make sure locale path is set before loading any modules...
r32336 # Load util so that the locale path is set by i18n.setdatapath() before
# calling _().
from mercurial import util
util.datapath
Pulkit Goyal
py3: make gendoc use absolute_import...
r28966 from mercurial import (
commands,
extensions,
help,
minirst,
ui as uimod,
)
from mercurial.i18n import (
gettext,
_,
)
table = commands.table
globalopts = commands.globalopts
helptable = help.helptable
loaddoc = help.loaddoc
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814
def get_desc(docstr):
if not docstr:
return "", ""
# sanitize
docstr = docstr.strip("\n")
docstr = docstr.rstrip()
shortdesc = docstr.splitlines()[0].strip()
i = docstr.find("\n")
if i != -1:
Matt Mackall
many, many trivial check-code fixups
r10282 desc = docstr[i + 2:]
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 else:
Erik Zielke
gendoc: dedent documentation from docstrings...
r12780 desc = shortdesc
desc = textwrap.dedent(desc)
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 return (shortdesc, desc)
def get_opts(opts):
FUJIWARA Katsunori
help: show value requirement and multiple occurrence of options...
r11321 for opt in opts:
if len(opt) == 5:
shortopt, longopt, default, desc, optlabel = opt
else:
shortopt, longopt, default, desc = opt
FUJIWARA Katsunori
doc: show details of command options in pages generated by docutils...
r20081 optlabel = _("VALUE")
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 allopts = []
if shortopt:
allopts.append("-%s" % shortopt)
if longopt:
allopts.append("--%s" % longopt)
FUJIWARA Katsunori
doc: show details of command options in pages generated by docutils...
r20081 if isinstance(default, list):
allopts[-1] += " <%s[+]>" % optlabel
elif (default is not None) and not isinstance(default, bool):
allopts[-1] += " <%s>" % optlabel
Simon Heimberg
doc: gendoc.py creates valid output for option descriptions with newlines...
r20655 if '\n' in desc:
# only remove line breaks and indentation
desc = ' '.join(l.lstrip() for l in desc.split('\n'))
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 desc += default and _(" (default: %s)") % default or ""
Thomas Arendsen Hein
coding style: fix yield used as a function
r13077 yield (", ".join(allopts), desc)
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814
Erik Zielke
gendoc: refactor get_cmd...
r12756 def get_cmd(cmd, cmdtable):
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 d = {}
Erik Zielke
gendoc: refactor get_cmd...
r12756 attr = cmdtable[cmd]
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 cmds = cmd.lstrip("^").split("|")
d['cmd'] = cmds[0]
d['aliases'] = cmd.split("|")[1:]
Takumi IINO
gendoc: make commnd __doc__ and extension __doc__ as translatable...
r19231 d['desc'] = get_desc(gettext(attr[0].__doc__))
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 d['opts'] = list(get_opts(attr[1]))
Matt Mackall
doc: handle shortened command synopses
r7376
s = 'hg ' + cmds[0]
if len(attr) > 2:
if not attr[2].startswith('hg'):
Ori Avtalion
gendoc: add missing space in command synopsis
r8546 s += ' ' + attr[2]
Matt Mackall
doc: handle shortened command synopses
r7376 else:
s = attr[2]
Martin Geisler
gendoc: fix synopsis...
r9622 d['synopsis'] = s.strip()
Matt Mackall
doc: handle shortened command synopses
r7376
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 return d
Takumi IINO
gendoc: rename to showdoc from show_doc...
r19423 def showdoc(ui):
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 # print options
Dan Villiom Podlaski Christiansen
help: use a full header for topic titles...
r18748 ui.write(minirst.section(_("Options")))
FUJIWARA Katsunori
doc: show details of command options in pages generated by docutils...
r20081 multioccur = False
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 for optstr, desc in get_opts(globalopts):
Martin Geisler
gendoc: re-add indentation to global option table...
r12812 ui.write("%s\n %s\n\n" % (optstr, desc))
FUJIWARA Katsunori
doc: show details of command options in pages generated by docutils...
r20081 if optstr.endswith("[+]>"):
multioccur = True
if multioccur:
ui.write(_("\n[+] marked option can be specified multiple times\n"))
ui.write("\n")
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814
# print cmds
Dan Villiom Podlaski Christiansen
help: use a full header for topic titles...
r18748 ui.write(minirst.section(_("Commands")))
commandprinter(ui, table, minirst.subsection)
Erik Zielke
gendoc: refactor get_cmd...
r12756
Takumi IINO
gendoc: extract print help topics into a dedicated function...
r19233 # print help topics
# The config help topic is included in the hgrc.5 man page.
helpprinter(ui, helptable, minirst.section, exclude=['config'])
Erik Zielke
gendoc: refactor get_cmd...
r12756
Dan Villiom Podlaski Christiansen
help: use a full header for topic titles...
r18748 ui.write(minirst.section(_("Extensions")))
Brodie Rao
cleanup: eradicate long lines
r16683 ui.write(_("This section contains help for extensions that are "
"distributed together with Mercurial. Help for other "
"extensions is available in the help system."))
FUJIWARA Katsunori
check-code: detect "missing _() in ui message" more exactly...
r29397 ui.write(("\n\n"
Erik Zielke
gendoc: automatically create help for default extensions....
r12781 ".. contents::\n"
" :class: htmlonly\n"
" :local:\n"
FUJIWARA Katsunori
check-code: detect "missing _() in ui message" more exactly...
r29397 " :depth: 1\n\n"))
Erik Zielke
gendoc: automatically create help for default extensions....
r12781
for extensionname in sorted(allextensionnames()):
Jun Wu
mercurial: pass ui to extensions.load (issue5007)...
r27660 mod = extensions.load(ui, extensionname, None)
Dan Villiom Podlaski Christiansen
help: use a full header for topic titles...
r18748 ui.write(minirst.subsection(extensionname))
Takumi IINO
gendoc: make commnd __doc__ and extension __doc__ as translatable...
r19231 ui.write("%s\n\n" % gettext(mod.__doc__))
Erik Zielke
gendoc: automatically create help for default extensions....
r12781 cmdtable = getattr(mod, 'cmdtable', None)
if cmdtable:
Dan Villiom Podlaski Christiansen
help: use a full header for topic titles...
r18748 ui.write(minirst.subsubsection(_('Commands')))
commandprinter(ui, cmdtable, minirst.subsubsubsection)
Erik Zielke
gendoc: automatically create help for default extensions....
r12781
Takumi IINO
gendoc: add showtopic...
r19424 def showtopic(ui, topic):
extrahelptable = [
(["common"], '', loaddoc('common')),
(["hg.1"], '', loaddoc('hg.1')),
Sean Farley
hg-ssh: copy doc string to man page...
r29090 (["hg-ssh.8"], '', loaddoc('hg-ssh.8')),
Takumi IINO
gendoc: add showtopic...
r19424 (["hgignore.5"], '', loaddoc('hgignore.5')),
(["hgrc.5"], '', loaddoc('hgrc.5')),
(["hgignore.5.gendoc"], '', loaddoc('hgignore')),
(["hgrc.5.gendoc"], '', loaddoc('config')),
]
helpprinter(ui, helptable + extrahelptable, None, include=[topic])
Takumi IINO
gendoc: extract print help topics into a dedicated function...
r19233 def helpprinter(ui, helptable, sectionfunc, include=[], exclude=[]):
for names, sec, doc in helptable:
if exclude and names[0] in exclude:
continue
if include and names[0] not in include:
continue
for name in names:
ui.write(".. _%s:\n" % name)
ui.write("\n")
if sectionfunc:
ui.write(sectionfunc(sec))
Augie Fackler
gendoc: restore use of callable() since it was readded in Python 3.2
r21793 if callable(doc):
Yuya Nishihara
help: pass around ui to doc loader (API)...
r26413 doc = doc(ui)
Takumi IINO
gendoc: extract print help topics into a dedicated function...
r19233 ui.write(doc)
ui.write("\n")
Erik Zielke
gendoc: automatically create help for default extensions....
r12781 def commandprinter(ui, cmdtable, sectionfunc):
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 h = {}
Erik Zielke
gendoc: refactor get_cmd...
r12756 for c, attr in cmdtable.items():
Christian Ebert
gendoc: fix indentation
r6488 f = c.split("|")[0]
f = f.lstrip("^")
h[f] = c
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 cmds = h.keys()
cmds.sort()
for f in cmds:
Matt Mackall
many, many trivial check-code fixups
r10282 if f.startswith("debug"):
continue
Erik Zielke
gendoc: refactor get_cmd...
r12756 d = get_cmd(h[f], cmdtable)
Dan Villiom Podlaski Christiansen
help: use a full header for topic titles...
r18748 ui.write(sectionfunc(d['cmd']))
FUJIWARA Katsunori
doc: show short description of each commands in generated documents...
r20689 # short description
ui.write(d['desc'][0])
Christian Ebert
gendoc: fix indentation
r6488 # synopsis
Martin Geisler
gendoc: support multi-line synopses
r12813 ui.write("::\n\n")
synopsislines = d['synopsis'].splitlines()
for line in synopsislines:
# some commands (such as rebase) have a multi-line
# synopsis
Martin Geisler
gendoc: do not strip 'hg ' from synopsis...
r12814 ui.write(" %s\n" % line)
Martin Geisler
gendoc: support multi-line synopses
r12813 ui.write('\n')
Christian Ebert
gendoc: fix indentation
r6488 # description
ui.write("%s\n\n" % d['desc'][1])
# options
opt_output = list(d['opts'])
if opt_output:
opts_len = max([len(line[0]) for line in opt_output])
Javi Merino
doc: Capitalize the "options" header of mercurial commands
r13345 ui.write(_("Options:\n\n"))
FUJIWARA Katsunori
doc: show details of command options in pages generated by docutils...
r20081 multioccur = False
Christian Ebert
gendoc: fix indentation
r6488 for optstr, desc in opt_output:
if desc:
s = "%-*s %s" % (opts_len, optstr, desc)
else:
s = optstr
Erik Zielke
gendoc: dedent documentation from docstrings...
r12780 ui.write("%s\n" % s)
FUJIWARA Katsunori
doc: show details of command options in pages generated by docutils...
r20081 if optstr.endswith("[+]>"):
multioccur = True
if multioccur:
ui.write(_("\n[+] marked option can be specified"
" multiple times\n"))
Christian Ebert
gendoc: fix indentation
r6488 ui.write("\n")
# aliases
if d['aliases']:
ui.write(_(" aliases: %s\n\n") % " ".join(d['aliases']))
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814
Matt Mackall
Generate docs for help topics
r3797
Erik Zielke
gendoc: automatically create help for default extensions....
r12781 def allextensionnames():
Matt Mackall
extensions: drop maxlength from enabled and disabled...
r14316 return extensions.enabled().keys() + extensions.disabled().keys()
Erik Zielke
gendoc: automatically create help for default extensions....
r12781
Benoit Boissinot
generate hg manpage from commands.py docstring...
r1814 if __name__ == "__main__":
Takumi IINO
gendoc: dispatch print document content by commandline arguments...
r19425 doc = 'hg.1.gendoc'
if len(sys.argv) > 1:
doc = sys.argv[1]
Yuya Nishihara
ui: factor out ui.load() to create a ui without loading configs (API)...
r30559 ui = uimod.ui.load()
Takumi IINO
gendoc: dispatch print document content by commandline arguments...
r19425 if doc == 'hg.1.gendoc':
Yuya Nishihara
gendoc: use real ui in place of stdout...
r26412 showdoc(ui)
Takumi IINO
gendoc: dispatch print document content by commandline arguments...
r19425 else:
Yuya Nishihara
gendoc: use real ui in place of stdout...
r26412 showtopic(ui, sys.argv[1])