##// END OF EJS Templates
check-seclevel: set module load policy to Python only...
Gregory Szorc -
r27221:ab776610 default
parent child Browse files
Show More
@@ -1,165 +1,164 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 #
2 #
3 # checkseclevel - checking section title levels in each online help document
3 # checkseclevel - checking section title levels in each online help document
4
4
5 import sys, os
5 import sys, os
6 import optparse
6 import optparse
7
7
8 # import from the live mercurial repo
8 # import from the live mercurial repo
9 os.environ['HGMODULEPOLICY'] = 'py'
9 sys.path.insert(0, "..")
10 sys.path.insert(0, "..")
10 # fall back to pure modules if required C extensions are not available
11 sys.path.append(os.path.join('..', 'mercurial', 'pure'))
12 from mercurial import demandimport; demandimport.enable()
11 from mercurial import demandimport; demandimport.enable()
13 from mercurial.commands import table
12 from mercurial.commands import table
14 from mercurial.help import helptable
13 from mercurial.help import helptable
15 from mercurial import extensions
14 from mercurial import extensions
16 from mercurial import minirst
15 from mercurial import minirst
17 from mercurial import ui as uimod
16 from mercurial import ui as uimod
18
17
19 level2mark = ['"', '=', '-', '.', '#']
18 level2mark = ['"', '=', '-', '.', '#']
20 reservedmarks = ['"']
19 reservedmarks = ['"']
21
20
22 mark2level = {}
21 mark2level = {}
23 for m, l in zip(level2mark, xrange(len(level2mark))):
22 for m, l in zip(level2mark, xrange(len(level2mark))):
24 if m not in reservedmarks:
23 if m not in reservedmarks:
25 mark2level[m] = l
24 mark2level[m] = l
26
25
27 initlevel_topic = 0
26 initlevel_topic = 0
28 initlevel_cmd = 1
27 initlevel_cmd = 1
29 initlevel_ext = 1
28 initlevel_ext = 1
30 initlevel_ext_cmd = 3
29 initlevel_ext_cmd = 3
31
30
32 def showavailables(ui, initlevel):
31 def showavailables(ui, initlevel):
33 ui.warn((' available marks and order of them in this help: %s\n') %
32 ui.warn((' available marks and order of them in this help: %s\n') %
34 (', '.join(['%r' % (m * 4) for m in level2mark[initlevel + 1:]])))
33 (', '.join(['%r' % (m * 4) for m in level2mark[initlevel + 1:]])))
35
34
36 def checkseclevel(ui, doc, name, initlevel):
35 def checkseclevel(ui, doc, name, initlevel):
37 ui.note(('checking "%s"\n') % name)
36 ui.note(('checking "%s"\n') % name)
38 blocks, pruned = minirst.parse(doc, 0, ['verbose'])
37 blocks, pruned = minirst.parse(doc, 0, ['verbose'])
39 errorcnt = 0
38 errorcnt = 0
40 curlevel = initlevel
39 curlevel = initlevel
41 for block in blocks:
40 for block in blocks:
42 if block['type'] != 'section':
41 if block['type'] != 'section':
43 continue
42 continue
44 mark = block['underline']
43 mark = block['underline']
45 title = block['lines'][0]
44 title = block['lines'][0]
46 if (mark not in mark2level) or (mark2level[mark] <= initlevel):
45 if (mark not in mark2level) or (mark2level[mark] <= initlevel):
47 ui.warn(('invalid section mark %r for "%s" of %s\n') %
46 ui.warn(('invalid section mark %r for "%s" of %s\n') %
48 (mark * 4, title, name))
47 (mark * 4, title, name))
49 showavailables(ui, initlevel)
48 showavailables(ui, initlevel)
50 errorcnt += 1
49 errorcnt += 1
51 continue
50 continue
52 nextlevel = mark2level[mark]
51 nextlevel = mark2level[mark]
53 if curlevel < nextlevel and curlevel + 1 != nextlevel:
52 if curlevel < nextlevel and curlevel + 1 != nextlevel:
54 ui.warn(('gap of section level at "%s" of %s\n') %
53 ui.warn(('gap of section level at "%s" of %s\n') %
55 (title, name))
54 (title, name))
56 showavailables(ui, initlevel)
55 showavailables(ui, initlevel)
57 errorcnt += 1
56 errorcnt += 1
58 continue
57 continue
59 ui.note(('appropriate section level for "%s %s"\n') %
58 ui.note(('appropriate section level for "%s %s"\n') %
60 (mark * (nextlevel * 2), title))
59 (mark * (nextlevel * 2), title))
61 curlevel = nextlevel
60 curlevel = nextlevel
62
61
63 return errorcnt
62 return errorcnt
64
63
65 def checkcmdtable(ui, cmdtable, namefmt, initlevel):
64 def checkcmdtable(ui, cmdtable, namefmt, initlevel):
66 errorcnt = 0
65 errorcnt = 0
67 for k, entry in cmdtable.items():
66 for k, entry in cmdtable.items():
68 name = k.split("|")[0].lstrip("^")
67 name = k.split("|")[0].lstrip("^")
69 if not entry[0].__doc__:
68 if not entry[0].__doc__:
70 ui.note(('skip checking %s: no help document\n') %
69 ui.note(('skip checking %s: no help document\n') %
71 (namefmt % name))
70 (namefmt % name))
72 continue
71 continue
73 errorcnt += checkseclevel(ui, entry[0].__doc__,
72 errorcnt += checkseclevel(ui, entry[0].__doc__,
74 namefmt % name,
73 namefmt % name,
75 initlevel)
74 initlevel)
76 return errorcnt
75 return errorcnt
77
76
78 def checkhghelps(ui):
77 def checkhghelps(ui):
79 errorcnt = 0
78 errorcnt = 0
80 for names, sec, doc in helptable:
79 for names, sec, doc in helptable:
81 if callable(doc):
80 if callable(doc):
82 doc = doc(ui)
81 doc = doc(ui)
83 errorcnt += checkseclevel(ui, doc,
82 errorcnt += checkseclevel(ui, doc,
84 '%s help topic' % names[0],
83 '%s help topic' % names[0],
85 initlevel_topic)
84 initlevel_topic)
86
85
87 errorcnt += checkcmdtable(ui, table, '%s command', initlevel_cmd)
86 errorcnt += checkcmdtable(ui, table, '%s command', initlevel_cmd)
88
87
89 for name in sorted(extensions.enabled().keys() +
88 for name in sorted(extensions.enabled().keys() +
90 extensions.disabled().keys()):
89 extensions.disabled().keys()):
91 mod = extensions.load(None, name, None)
90 mod = extensions.load(None, name, None)
92 if not mod.__doc__:
91 if not mod.__doc__:
93 ui.note(('skip checking %s extension: no help document\n') % name)
92 ui.note(('skip checking %s extension: no help document\n') % name)
94 continue
93 continue
95 errorcnt += checkseclevel(ui, mod.__doc__,
94 errorcnt += checkseclevel(ui, mod.__doc__,
96 '%s extension' % name,
95 '%s extension' % name,
97 initlevel_ext)
96 initlevel_ext)
98
97
99 cmdtable = getattr(mod, 'cmdtable', None)
98 cmdtable = getattr(mod, 'cmdtable', None)
100 if cmdtable:
99 if cmdtable:
101 errorcnt += checkcmdtable(ui, cmdtable,
100 errorcnt += checkcmdtable(ui, cmdtable,
102 '%s command of ' + name + ' extension',
101 '%s command of ' + name + ' extension',
103 initlevel_ext_cmd)
102 initlevel_ext_cmd)
104 return errorcnt
103 return errorcnt
105
104
106 def checkfile(ui, filename, initlevel):
105 def checkfile(ui, filename, initlevel):
107 if filename == '-':
106 if filename == '-':
108 filename = 'stdin'
107 filename = 'stdin'
109 doc = sys.stdin.read()
108 doc = sys.stdin.read()
110 else:
109 else:
111 fp = open(filename)
110 fp = open(filename)
112 try:
111 try:
113 doc = fp.read()
112 doc = fp.read()
114 finally:
113 finally:
115 fp.close()
114 fp.close()
116
115
117 ui.note(('checking input from %s with initlevel %d\n') %
116 ui.note(('checking input from %s with initlevel %d\n') %
118 (filename, initlevel))
117 (filename, initlevel))
119 return checkseclevel(ui, doc, 'input from %s' % filename, initlevel)
118 return checkseclevel(ui, doc, 'input from %s' % filename, initlevel)
120
119
121 def main():
120 def main():
122 optparser = optparse.OptionParser("""%prog [options]
121 optparser = optparse.OptionParser("""%prog [options]
123
122
124 This checks all help documents of Mercurial (topics, commands,
123 This checks all help documents of Mercurial (topics, commands,
125 extensions and commands of them), if no file is specified by --file
124 extensions and commands of them), if no file is specified by --file
126 option.
125 option.
127 """)
126 """)
128 optparser.add_option("-v", "--verbose",
127 optparser.add_option("-v", "--verbose",
129 help="enable additional output",
128 help="enable additional output",
130 action="store_true")
129 action="store_true")
131 optparser.add_option("-f", "--file",
130 optparser.add_option("-f", "--file",
132 help="filename to read in (or '-' for stdin)",
131 help="filename to read in (or '-' for stdin)",
133 action="store", default="")
132 action="store", default="")
134
133
135 optparser.add_option("-t", "--topic",
134 optparser.add_option("-t", "--topic",
136 help="parse file as help topic",
135 help="parse file as help topic",
137 action="store_const", dest="initlevel", const=0)
136 action="store_const", dest="initlevel", const=0)
138 optparser.add_option("-c", "--command",
137 optparser.add_option("-c", "--command",
139 help="parse file as help of core command",
138 help="parse file as help of core command",
140 action="store_const", dest="initlevel", const=1)
139 action="store_const", dest="initlevel", const=1)
141 optparser.add_option("-e", "--extension",
140 optparser.add_option("-e", "--extension",
142 help="parse file as help of extension",
141 help="parse file as help of extension",
143 action="store_const", dest="initlevel", const=1)
142 action="store_const", dest="initlevel", const=1)
144 optparser.add_option("-C", "--extension-command",
143 optparser.add_option("-C", "--extension-command",
145 help="parse file as help of extension command",
144 help="parse file as help of extension command",
146 action="store_const", dest="initlevel", const=3)
145 action="store_const", dest="initlevel", const=3)
147
146
148 optparser.add_option("-l", "--initlevel",
147 optparser.add_option("-l", "--initlevel",
149 help="set initial section level manually",
148 help="set initial section level manually",
150 action="store", type="int", default=0)
149 action="store", type="int", default=0)
151
150
152 (options, args) = optparser.parse_args()
151 (options, args) = optparser.parse_args()
153
152
154 ui = uimod.ui()
153 ui = uimod.ui()
155 ui.setconfig('ui', 'verbose', options.verbose, '--verbose')
154 ui.setconfig('ui', 'verbose', options.verbose, '--verbose')
156
155
157 if options.file:
156 if options.file:
158 if checkfile(ui, options.file, options.initlevel):
157 if checkfile(ui, options.file, options.initlevel):
159 sys.exit(1)
158 sys.exit(1)
160 else:
159 else:
161 if checkhghelps(ui):
160 if checkhghelps(ui):
162 sys.exit(1)
161 sys.exit(1)
163
162
164 if __name__ == "__main__":
163 if __name__ == "__main__":
165 main()
164 main()
General Comments 0
You need to be logged in to leave comments. Login now