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