##// END OF EJS Templates
py3: byteify sys.argv in gendoc.py
Matt Harbison -
r41059:c0865f3d default
parent child Browse files
Show More
@@ -1,239 +1,240 b''
1 1 #!/usr/bin/env python
2 2 """usage: %s DOC ...
3 3
4 4 where DOC is the name of a document
5 5 """
6 6
7 7 from __future__ import absolute_import
8 8
9 9 import os
10 10 import sys
11 11 import textwrap
12 12
13 13 try:
14 14 import msvcrt
15 15 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
16 16 msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
17 17 except ImportError:
18 18 pass
19 19
20 20 # This script is executed during installs and may not have C extensions
21 21 # available. Relax C module requirements.
22 22 os.environ[r'HGMODULEPOLICY'] = r'allow'
23 23 # import from the live mercurial repo
24 24 sys.path.insert(0, r"..")
25 25 from mercurial import demandimport; demandimport.enable()
26 26 # Load util so that the locale path is set by i18n.setdatapath() before
27 27 # calling _().
28 28 from mercurial import util
29 29 util.datapath
30 30 from mercurial import (
31 31 commands,
32 encoding,
32 33 extensions,
33 34 help,
34 35 minirst,
35 36 pycompat,
36 37 ui as uimod,
37 38 )
38 39 from mercurial.i18n import (
39 40 gettext,
40 41 _,
41 42 )
42 43
43 44 table = commands.table
44 45 globalopts = commands.globalopts
45 46 helptable = help.helptable
46 47 loaddoc = help.loaddoc
47 48
48 49 def get_desc(docstr):
49 50 if not docstr:
50 51 return b"", b""
51 52 # sanitize
52 53 docstr = docstr.strip(b"\n")
53 54 docstr = docstr.rstrip()
54 55 shortdesc = docstr.splitlines()[0].strip()
55 56
56 57 i = docstr.find(b"\n")
57 58 if i != -1:
58 59 desc = docstr[i + 2:]
59 60 else:
60 61 desc = shortdesc
61 62
62 63 desc = textwrap.dedent(desc.decode('latin1')).encode('latin1')
63 64
64 65 return (shortdesc, desc)
65 66
66 67 def get_opts(opts):
67 68 for opt in opts:
68 69 if len(opt) == 5:
69 70 shortopt, longopt, default, desc, optlabel = opt
70 71 else:
71 72 shortopt, longopt, default, desc = opt
72 73 optlabel = _(b"VALUE")
73 74 allopts = []
74 75 if shortopt:
75 76 allopts.append(b"-%s" % shortopt)
76 77 if longopt:
77 78 allopts.append(b"--%s" % longopt)
78 79 if isinstance(default, list):
79 80 allopts[-1] += b" <%s[+]>" % optlabel
80 81 elif (default is not None) and not isinstance(default, bool):
81 82 allopts[-1] += b" <%s>" % optlabel
82 83 if b'\n' in desc:
83 84 # only remove line breaks and indentation
84 85 desc = b' '.join(l.lstrip() for l in desc.split(b'\n'))
85 86 desc += default and _(b" (default: %s)") % bytes(default) or b""
86 87 yield (b", ".join(allopts), desc)
87 88
88 89 def get_cmd(cmd, cmdtable):
89 90 d = {}
90 91 attr = cmdtable[cmd]
91 92 cmds = cmd.lstrip(b"^").split(b"|")
92 93
93 94 d[b'cmd'] = cmds[0]
94 95 d[b'aliases'] = cmd.split(b"|")[1:]
95 96 d[b'desc'] = get_desc(gettext(pycompat.getdoc(attr[0])))
96 97 d[b'opts'] = list(get_opts(attr[1]))
97 98
98 99 s = b'hg ' + cmds[0]
99 100 if len(attr) > 2:
100 101 if not attr[2].startswith(b'hg'):
101 102 s += b' ' + attr[2]
102 103 else:
103 104 s = attr[2]
104 105 d[b'synopsis'] = s.strip()
105 106
106 107 return d
107 108
108 109 def showdoc(ui):
109 110 # print options
110 111 ui.write(minirst.section(_(b"Options")))
111 112 multioccur = False
112 113 for optstr, desc in get_opts(globalopts):
113 114 ui.write(b"%s\n %s\n\n" % (optstr, desc))
114 115 if optstr.endswith(b"[+]>"):
115 116 multioccur = True
116 117 if multioccur:
117 118 ui.write(_(b"\n[+] marked option can be specified multiple times\n"))
118 119 ui.write(b"\n")
119 120
120 121 # print cmds
121 122 ui.write(minirst.section(_(b"Commands")))
122 123 commandprinter(ui, table, minirst.subsection)
123 124
124 125 # print help topics
125 126 # The config help topic is included in the hgrc.5 man page.
126 127 helpprinter(ui, helptable, minirst.section, exclude=[b'config'])
127 128
128 129 ui.write(minirst.section(_(b"Extensions")))
129 130 ui.write(_(b"This section contains help for extensions that are "
130 131 b"distributed together with Mercurial. Help for other "
131 132 b"extensions is available in the help system."))
132 133 ui.write((b"\n\n"
133 134 b".. contents::\n"
134 135 b" :class: htmlonly\n"
135 136 b" :local:\n"
136 137 b" :depth: 1\n\n"))
137 138
138 139 for extensionname in sorted(allextensionnames()):
139 140 mod = extensions.load(ui, extensionname, None)
140 141 ui.write(minirst.subsection(extensionname))
141 142 ui.write(b"%s\n\n" % gettext(pycompat.getdoc(mod)))
142 143 cmdtable = getattr(mod, 'cmdtable', None)
143 144 if cmdtable:
144 145 ui.write(minirst.subsubsection(_(b'Commands')))
145 146 commandprinter(ui, cmdtable, minirst.subsubsubsection)
146 147
147 148 def showtopic(ui, topic):
148 149 extrahelptable = [
149 150 ([b"common"], b'', loaddoc(b'common'), help.TOPIC_CATEGORY_MISC),
150 151 ([b"hg.1"], b'', loaddoc(b'hg.1'), help.TOPIC_CATEGORY_CONFIG),
151 152 ([b"hg-ssh.8"], b'', loaddoc(b'hg-ssh.8'), help.TOPIC_CATEGORY_CONFIG),
152 153 ([b"hgignore.5"], b'', loaddoc(b'hgignore.5'),
153 154 help.TOPIC_CATEGORY_CONFIG),
154 155 ([b"hgrc.5"], b'', loaddoc(b'hgrc.5'), help.TOPIC_CATEGORY_CONFIG),
155 156 ([b"hgignore.5.gendoc"], b'', loaddoc(b'hgignore'),
156 157 help.TOPIC_CATEGORY_CONFIG),
157 158 ([b"hgrc.5.gendoc"], b'', loaddoc(b'config'),
158 159 help.TOPIC_CATEGORY_CONFIG),
159 160 ]
160 161 helpprinter(ui, helptable + extrahelptable, None, include=[topic])
161 162
162 163 def helpprinter(ui, helptable, sectionfunc, include=[], exclude=[]):
163 164 for h in helptable:
164 165 names, sec, doc = h[0:3]
165 166 if exclude and names[0] in exclude:
166 167 continue
167 168 if include and names[0] not in include:
168 169 continue
169 170 for name in names:
170 171 ui.write(b".. _%s:\n" % name)
171 172 ui.write(b"\n")
172 173 if sectionfunc:
173 174 ui.write(sectionfunc(sec))
174 175 if callable(doc):
175 176 doc = doc(ui)
176 177 ui.write(doc)
177 178 ui.write(b"\n")
178 179
179 180 def commandprinter(ui, cmdtable, sectionfunc):
180 181 h = {}
181 182 for c, attr in cmdtable.items():
182 183 f = c.split(b"|")[0]
183 184 f = f.lstrip(b"^")
184 185 h[f] = c
185 186 cmds = h.keys()
186 187
187 188 for f in sorted(cmds):
188 189 if f.startswith(b"debug"):
189 190 continue
190 191 d = get_cmd(h[f], cmdtable)
191 192 ui.write(sectionfunc(d[b'cmd']))
192 193 # short description
193 194 ui.write(d[b'desc'][0])
194 195 # synopsis
195 196 ui.write(b"::\n\n")
196 197 synopsislines = d[b'synopsis'].splitlines()
197 198 for line in synopsislines:
198 199 # some commands (such as rebase) have a multi-line
199 200 # synopsis
200 201 ui.write(b" %s\n" % line)
201 202 ui.write(b'\n')
202 203 # description
203 204 ui.write(b"%s\n\n" % d[b'desc'][1])
204 205 # options
205 206 opt_output = list(d[b'opts'])
206 207 if opt_output:
207 208 opts_len = max([len(line[0]) for line in opt_output])
208 209 ui.write(_(b"Options:\n\n"))
209 210 multioccur = False
210 211 for optstr, desc in opt_output:
211 212 if desc:
212 213 s = b"%-*s %s" % (opts_len, optstr, desc)
213 214 else:
214 215 s = optstr
215 216 ui.write(b"%s\n" % s)
216 217 if optstr.endswith(b"[+]>"):
217 218 multioccur = True
218 219 if multioccur:
219 220 ui.write(_(b"\n[+] marked option can be specified"
220 221 b" multiple times\n"))
221 222 ui.write(b"\n")
222 223 # aliases
223 224 if d[b'aliases']:
224 225 ui.write(_(b" aliases: %s\n\n") % b" ".join(d[b'aliases']))
225 226
226 227
227 228 def allextensionnames():
228 229 return set(extensions.enabled().keys()) | set(extensions.disabled().keys())
229 230
230 231 if __name__ == "__main__":
231 232 doc = b'hg.1.gendoc'
232 233 if len(sys.argv) > 1:
233 doc = sys.argv[1]
234 doc = encoding.strtolocal(sys.argv[1])
234 235
235 236 ui = uimod.ui.load()
236 237 if doc == b'hg.1.gendoc':
237 238 showdoc(ui)
238 239 else:
239 240 showtopic(ui, sys.argv[1])
General Comments 0
You need to be logged in to leave comments. Login now