diff options
author | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-08-22 14:49:51 +0100 |
---|---|---|
committer | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-08-22 14:49:51 +0100 |
commit | a498da43c7fdb9f24b73680c02a4a3588cc62d9a (patch) | |
tree | daf8119dae1749b5165b68033a1b23a7375ce9ce /doc/gendoc.py | |
download | mercurial-tarball-a498da43c7fdb9f24b73680c02a4a3588cc62d9a.tar.gz |
Tarball conversion
Diffstat (limited to 'doc/gendoc.py')
-rw-r--r-- | doc/gendoc.py | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/doc/gendoc.py b/doc/gendoc.py new file mode 100644 index 0000000..ab8e9b6 --- /dev/null +++ b/doc/gendoc.py @@ -0,0 +1,168 @@ +import os, sys, textwrap +# import from the live mercurial repo +sys.path.insert(0, "..") +# fall back to pure modules if required C extensions are not available +sys.path.append(os.path.join('..', 'mercurial', 'pure')) +from mercurial import demandimport; demandimport.enable() +from mercurial import encoding +from mercurial.commands import table, globalopts +from mercurial.i18n import _ +from mercurial.help import helptable +from mercurial import extensions +from mercurial import util + +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: + desc = docstr[i + 2:] + else: + desc = shortdesc + + desc = textwrap.dedent(desc) + + return (shortdesc, desc) + +def get_opts(opts): + for opt in opts: + if len(opt) == 5: + shortopt, longopt, default, desc, optlabel = opt + else: + shortopt, longopt, default, desc = opt + allopts = [] + if shortopt: + allopts.append("-%s" % shortopt) + if longopt: + allopts.append("--%s" % longopt) + desc += default and _(" (default: %s)") % default or "" + yield (", ".join(allopts), desc) + +def get_cmd(cmd, cmdtable): + d = {} + attr = cmdtable[cmd] + cmds = cmd.lstrip("^").split("|") + + d['cmd'] = cmds[0] + d['aliases'] = cmd.split("|")[1:] + d['desc'] = get_desc(attr[0].__doc__) + d['opts'] = list(get_opts(attr[1])) + + s = 'hg ' + cmds[0] + if len(attr) > 2: + if not attr[2].startswith('hg'): + s += ' ' + attr[2] + else: + s = attr[2] + d['synopsis'] = s.strip() + + return d + +def section(ui, s): + ui.write("%s\n%s\n\n" % (s, "\"" * encoding.colwidth(s))) + +def subsection(ui, s): + ui.write("%s\n%s\n\n" % (s, '=' * encoding.colwidth(s))) + +def subsubsection(ui, s): + ui.write("%s\n%s\n\n" % (s, "-" * encoding.colwidth(s))) + +def subsubsubsection(ui, s): + ui.write("%s\n%s\n\n" % (s, "." * encoding.colwidth(s))) + + +def show_doc(ui): + # print options + section(ui, _("Options")) + for optstr, desc in get_opts(globalopts): + ui.write("%s\n %s\n\n" % (optstr, desc)) + + # print cmds + section(ui, _("Commands")) + commandprinter(ui, table, subsection) + + # print topics + for names, sec, doc in helptable: + if names[0] == "config": + # The config help topic is included in the hgrc.5 man + # page. + continue + for name in names: + ui.write(".. _%s:\n" % name) + ui.write("\n") + section(ui, sec) + if util.safehasattr(doc, '__call__'): + doc = doc() + ui.write(doc) + ui.write("\n") + + section(ui, _("Extensions")) + ui.write(_("This section contains help for extensions that are " + "distributed together with Mercurial. Help for other " + "extensions is available in the help system.")) + ui.write("\n\n" + ".. contents::\n" + " :class: htmlonly\n" + " :local:\n" + " :depth: 1\n\n") + + for extensionname in sorted(allextensionnames()): + mod = extensions.load(None, extensionname, None) + subsection(ui, extensionname) + ui.write("%s\n\n" % mod.__doc__) + cmdtable = getattr(mod, 'cmdtable', None) + if cmdtable: + subsubsection(ui, _('Commands')) + commandprinter(ui, cmdtable, subsubsubsection) + +def commandprinter(ui, cmdtable, sectionfunc): + h = {} + for c, attr in cmdtable.items(): + f = c.split("|")[0] + f = f.lstrip("^") + h[f] = c + cmds = h.keys() + cmds.sort() + + for f in cmds: + if f.startswith("debug"): + continue + d = get_cmd(h[f], cmdtable) + sectionfunc(ui, d['cmd']) + # synopsis + ui.write("::\n\n") + synopsislines = d['synopsis'].splitlines() + for line in synopsislines: + # some commands (such as rebase) have a multi-line + # synopsis + ui.write(" %s\n" % line) + ui.write('\n') + # 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]) + ui.write(_("Options:\n\n")) + for optstr, desc in opt_output: + if desc: + s = "%-*s %s" % (opts_len, optstr, desc) + else: + s = optstr + ui.write("%s\n" % s) + ui.write("\n") + # aliases + if d['aliases']: + ui.write(_(" aliases: %s\n\n") % " ".join(d['aliases'])) + + +def allextensionnames(): + return extensions.enabled().keys() + extensions.disabled().keys() + +if __name__ == "__main__": + show_doc(sys.stdout) |