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