##// END OF EJS Templates
doc: gendoc.py creates valid output for option descriptions with newlines...
Simon Heimberg -
r20655:37f3be9d default
parent child Browse files
Show More
@@ -1,200 +1,203 b''
1 1 """usage: %s DOC ...
2 2
3 3 where DOC is the name of a document
4 4 """
5 5
6 6 import os, sys, textwrap
7 7 # import from the live mercurial repo
8 8 sys.path.insert(0, "..")
9 9 # fall back to pure modules if required C extensions are not available
10 10 sys.path.append(os.path.join('..', 'mercurial', 'pure'))
11 11 from mercurial import demandimport; demandimport.enable()
12 12 from mercurial import minirst
13 13 from mercurial.commands import table, globalopts
14 14 from mercurial.i18n import gettext, _
15 15 from mercurial.help import helptable, loaddoc
16 16 from mercurial import extensions
17 17 from mercurial import util
18 18
19 19 def get_desc(docstr):
20 20 if not docstr:
21 21 return "", ""
22 22 # sanitize
23 23 docstr = docstr.strip("\n")
24 24 docstr = docstr.rstrip()
25 25 shortdesc = docstr.splitlines()[0].strip()
26 26
27 27 i = docstr.find("\n")
28 28 if i != -1:
29 29 desc = docstr[i + 2:]
30 30 else:
31 31 desc = shortdesc
32 32
33 33 desc = textwrap.dedent(desc)
34 34
35 35 return (shortdesc, desc)
36 36
37 37 def get_opts(opts):
38 38 for opt in opts:
39 39 if len(opt) == 5:
40 40 shortopt, longopt, default, desc, optlabel = opt
41 41 else:
42 42 shortopt, longopt, default, desc = opt
43 43 optlabel = _("VALUE")
44 44 allopts = []
45 45 if shortopt:
46 46 allopts.append("-%s" % shortopt)
47 47 if longopt:
48 48 allopts.append("--%s" % longopt)
49 49 if isinstance(default, list):
50 50 allopts[-1] += " <%s[+]>" % optlabel
51 51 elif (default is not None) and not isinstance(default, bool):
52 52 allopts[-1] += " <%s>" % optlabel
53 if '\n' in desc:
54 # only remove line breaks and indentation
55 desc = ' '.join(l.lstrip() for l in desc.split('\n'))
53 56 desc += default and _(" (default: %s)") % default or ""
54 57 yield (", ".join(allopts), desc)
55 58
56 59 def get_cmd(cmd, cmdtable):
57 60 d = {}
58 61 attr = cmdtable[cmd]
59 62 cmds = cmd.lstrip("^").split("|")
60 63
61 64 d['cmd'] = cmds[0]
62 65 d['aliases'] = cmd.split("|")[1:]
63 66 d['desc'] = get_desc(gettext(attr[0].__doc__))
64 67 d['opts'] = list(get_opts(attr[1]))
65 68
66 69 s = 'hg ' + cmds[0]
67 70 if len(attr) > 2:
68 71 if not attr[2].startswith('hg'):
69 72 s += ' ' + attr[2]
70 73 else:
71 74 s = attr[2]
72 75 d['synopsis'] = s.strip()
73 76
74 77 return d
75 78
76 79 def showdoc(ui):
77 80 # print options
78 81 ui.write(minirst.section(_("Options")))
79 82 multioccur = False
80 83 for optstr, desc in get_opts(globalopts):
81 84 ui.write("%s\n %s\n\n" % (optstr, desc))
82 85 if optstr.endswith("[+]>"):
83 86 multioccur = True
84 87 if multioccur:
85 88 ui.write(_("\n[+] marked option can be specified multiple times\n"))
86 89 ui.write("\n")
87 90
88 91 # print cmds
89 92 ui.write(minirst.section(_("Commands")))
90 93 commandprinter(ui, table, minirst.subsection)
91 94
92 95 # print help topics
93 96 # The config help topic is included in the hgrc.5 man page.
94 97 helpprinter(ui, helptable, minirst.section, exclude=['config'])
95 98
96 99 ui.write(minirst.section(_("Extensions")))
97 100 ui.write(_("This section contains help for extensions that are "
98 101 "distributed together with Mercurial. Help for other "
99 102 "extensions is available in the help system."))
100 103 ui.write("\n\n"
101 104 ".. contents::\n"
102 105 " :class: htmlonly\n"
103 106 " :local:\n"
104 107 " :depth: 1\n\n")
105 108
106 109 for extensionname in sorted(allextensionnames()):
107 110 mod = extensions.load(None, extensionname, None)
108 111 ui.write(minirst.subsection(extensionname))
109 112 ui.write("%s\n\n" % gettext(mod.__doc__))
110 113 cmdtable = getattr(mod, 'cmdtable', None)
111 114 if cmdtable:
112 115 ui.write(minirst.subsubsection(_('Commands')))
113 116 commandprinter(ui, cmdtable, minirst.subsubsubsection)
114 117
115 118 def showtopic(ui, topic):
116 119 extrahelptable = [
117 120 (["common"], '', loaddoc('common')),
118 121 (["hg.1"], '', loaddoc('hg.1')),
119 122 (["hgignore.5"], '', loaddoc('hgignore.5')),
120 123 (["hgrc.5"], '', loaddoc('hgrc.5')),
121 124 (["hgignore.5.gendoc"], '', loaddoc('hgignore')),
122 125 (["hgrc.5.gendoc"], '', loaddoc('config')),
123 126 ]
124 127 helpprinter(ui, helptable + extrahelptable, None, include=[topic])
125 128
126 129 def helpprinter(ui, helptable, sectionfunc, include=[], exclude=[]):
127 130 for names, sec, doc in helptable:
128 131 if exclude and names[0] in exclude:
129 132 continue
130 133 if include and names[0] not in include:
131 134 continue
132 135 for name in names:
133 136 ui.write(".. _%s:\n" % name)
134 137 ui.write("\n")
135 138 if sectionfunc:
136 139 ui.write(sectionfunc(sec))
137 140 if util.safehasattr(doc, '__call__'):
138 141 doc = doc()
139 142 ui.write(doc)
140 143 ui.write("\n")
141 144
142 145 def commandprinter(ui, cmdtable, sectionfunc):
143 146 h = {}
144 147 for c, attr in cmdtable.items():
145 148 f = c.split("|")[0]
146 149 f = f.lstrip("^")
147 150 h[f] = c
148 151 cmds = h.keys()
149 152 cmds.sort()
150 153
151 154 for f in cmds:
152 155 if f.startswith("debug"):
153 156 continue
154 157 d = get_cmd(h[f], cmdtable)
155 158 ui.write(sectionfunc(d['cmd']))
156 159 # synopsis
157 160 ui.write("::\n\n")
158 161 synopsislines = d['synopsis'].splitlines()
159 162 for line in synopsislines:
160 163 # some commands (such as rebase) have a multi-line
161 164 # synopsis
162 165 ui.write(" %s\n" % line)
163 166 ui.write('\n')
164 167 # description
165 168 ui.write("%s\n\n" % d['desc'][1])
166 169 # options
167 170 opt_output = list(d['opts'])
168 171 if opt_output:
169 172 opts_len = max([len(line[0]) for line in opt_output])
170 173 ui.write(_("Options:\n\n"))
171 174 multioccur = False
172 175 for optstr, desc in opt_output:
173 176 if desc:
174 177 s = "%-*s %s" % (opts_len, optstr, desc)
175 178 else:
176 179 s = optstr
177 180 ui.write("%s\n" % s)
178 181 if optstr.endswith("[+]>"):
179 182 multioccur = True
180 183 if multioccur:
181 184 ui.write(_("\n[+] marked option can be specified"
182 185 " multiple times\n"))
183 186 ui.write("\n")
184 187 # aliases
185 188 if d['aliases']:
186 189 ui.write(_(" aliases: %s\n\n") % " ".join(d['aliases']))
187 190
188 191
189 192 def allextensionnames():
190 193 return extensions.enabled().keys() + extensions.disabled().keys()
191 194
192 195 if __name__ == "__main__":
193 196 doc = 'hg.1.gendoc'
194 197 if len(sys.argv) > 1:
195 198 doc = sys.argv[1]
196 199
197 200 if doc == 'hg.1.gendoc':
198 201 showdoc(sys.stdout)
199 202 else:
200 203 showtopic(sys.stdout, sys.argv[1])
General Comments 0
You need to be logged in to leave comments. Login now