summaryrefslogtreecommitdiff
path: root/doc/gendoc.py
diff options
context:
space:
mode:
authorLorry <lorry@roadtrain.codethink.co.uk>2012-08-22 14:49:51 +0100
committerLorry <lorry@roadtrain.codethink.co.uk>2012-08-22 14:49:51 +0100
commita498da43c7fdb9f24b73680c02a4a3588cc62d9a (patch)
treedaf8119dae1749b5165b68033a1b23a7375ce9ce /doc/gendoc.py
downloadmercurial-tarball-a498da43c7fdb9f24b73680c02a4a3588cc62d9a.tar.gz
Tarball conversion
Diffstat (limited to 'doc/gendoc.py')
-rw-r--r--doc/gendoc.py168
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)