diff options
author | Jani Nikula <jani.nikula@intel.com> | 2016-10-19 06:44:37 -0400 |
---|---|---|
committer | Jonathan Corbet <corbet@lwn.net> | 2016-10-19 18:02:00 -0400 |
commit | 58af04dff742b6b49fae3de585bdea8c77b62ddc (patch) | |
tree | dac1d08694368cfa10c1e4ac4fe5ca2ac214ebf4 /Documentation/sphinx/kerneldoc.py | |
parent | 1001354ca34179f3db924eb66672442a173147dc (diff) |
Documentation/sphinx: rename kernel-doc.py to kerneldoc.py
Python module names should not have hyphens per [PEP 8]. Drop the hyphen
from kernel-doc.py. The extension directive remains unchanged.
[PEP 8] https://www.python.org/dev/peps/pep-0008/#package-and-module-names
Reported-by: Markus Heiser <markus.heiser@darmarit.de>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Diffstat (limited to 'Documentation/sphinx/kerneldoc.py')
-rw-r--r-- | Documentation/sphinx/kerneldoc.py | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/Documentation/sphinx/kerneldoc.py b/Documentation/sphinx/kerneldoc.py new file mode 100644 index 000000000000..d15e07f36881 --- /dev/null +++ b/Documentation/sphinx/kerneldoc.py | |||
@@ -0,0 +1,149 @@ | |||
1 | # coding=utf-8 | ||
2 | # | ||
3 | # Copyright © 2016 Intel Corporation | ||
4 | # | ||
5 | # Permission is hereby granted, free of charge, to any person obtaining a | ||
6 | # copy of this software and associated documentation files (the "Software"), | ||
7 | # to deal in the Software without restriction, including without limitation | ||
8 | # the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
9 | # and/or sell copies of the Software, and to permit persons to whom the | ||
10 | # Software is furnished to do so, subject to the following conditions: | ||
11 | # | ||
12 | # The above copyright notice and this permission notice (including the next | ||
13 | # paragraph) shall be included in all copies or substantial portions of the | ||
14 | # Software. | ||
15 | # | ||
16 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
20 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
22 | # IN THE SOFTWARE. | ||
23 | # | ||
24 | # Authors: | ||
25 | # Jani Nikula <jani.nikula@intel.com> | ||
26 | # | ||
27 | # Please make sure this works on both python2 and python3. | ||
28 | # | ||
29 | |||
30 | import os | ||
31 | import subprocess | ||
32 | import sys | ||
33 | import re | ||
34 | import glob | ||
35 | |||
36 | from docutils import nodes, statemachine | ||
37 | from docutils.statemachine import ViewList | ||
38 | from docutils.parsers.rst import directives | ||
39 | from sphinx.util.compat import Directive | ||
40 | from sphinx.ext.autodoc import AutodocReporter | ||
41 | |||
42 | __version__ = '1.0' | ||
43 | |||
44 | class KernelDocDirective(Directive): | ||
45 | """Extract kernel-doc comments from the specified file""" | ||
46 | required_argument = 1 | ||
47 | optional_arguments = 4 | ||
48 | option_spec = { | ||
49 | 'doc': directives.unchanged_required, | ||
50 | 'functions': directives.unchanged_required, | ||
51 | 'export': directives.unchanged, | ||
52 | 'internal': directives.unchanged, | ||
53 | } | ||
54 | has_content = False | ||
55 | |||
56 | def run(self): | ||
57 | env = self.state.document.settings.env | ||
58 | cmd = [env.config.kerneldoc_bin, '-rst', '-enable-lineno'] | ||
59 | |||
60 | filename = env.config.kerneldoc_srctree + '/' + self.arguments[0] | ||
61 | export_file_patterns = [] | ||
62 | |||
63 | # Tell sphinx of the dependency | ||
64 | env.note_dependency(os.path.abspath(filename)) | ||
65 | |||
66 | tab_width = self.options.get('tab-width', self.state.document.settings.tab_width) | ||
67 | |||
68 | # FIXME: make this nicer and more robust against errors | ||
69 | if 'export' in self.options: | ||
70 | cmd += ['-export'] | ||
71 | export_file_patterns = str(self.options.get('export')).split() | ||
72 | elif 'internal' in self.options: | ||
73 | cmd += ['-internal'] | ||
74 | export_file_patterns = str(self.options.get('internal')).split() | ||
75 | elif 'doc' in self.options: | ||
76 | cmd += ['-function', str(self.options.get('doc'))] | ||
77 | elif 'functions' in self.options: | ||
78 | for f in str(self.options.get('functions')).split(): | ||
79 | cmd += ['-function', f] | ||
80 | |||
81 | for pattern in export_file_patterns: | ||
82 | for f in glob.glob(env.config.kerneldoc_srctree + '/' + pattern): | ||
83 | env.note_dependency(os.path.abspath(f)) | ||
84 | cmd += ['-export-file', f] | ||
85 | |||
86 | cmd += [filename] | ||
87 | |||
88 | try: | ||
89 | env.app.verbose('calling kernel-doc \'%s\'' % (" ".join(cmd))) | ||
90 | |||
91 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) | ||
92 | out, err = p.communicate() | ||
93 | |||
94 | # python2 needs conversion to unicode. | ||
95 | # python3 with universal_newlines=True returns strings. | ||
96 | if sys.version_info.major < 3: | ||
97 | out, err = unicode(out, 'utf-8'), unicode(err, 'utf-8') | ||
98 | |||
99 | if p.returncode != 0: | ||
100 | sys.stderr.write(err) | ||
101 | |||
102 | env.app.warn('kernel-doc \'%s\' failed with return code %d' % (" ".join(cmd), p.returncode)) | ||
103 | return [nodes.error(None, nodes.paragraph(text = "kernel-doc missing"))] | ||
104 | elif env.config.kerneldoc_verbosity > 0: | ||
105 | sys.stderr.write(err) | ||
106 | |||
107 | lines = statemachine.string2lines(out, tab_width, convert_whitespace=True) | ||
108 | result = ViewList() | ||
109 | |||
110 | lineoffset = 0; | ||
111 | line_regex = re.compile("^#define LINENO ([0-9]+)$") | ||
112 | for line in lines: | ||
113 | match = line_regex.search(line) | ||
114 | if match: | ||
115 | # sphinx counts lines from 0 | ||
116 | lineoffset = int(match.group(1)) - 1 | ||
117 | # we must eat our comments since the upset the markup | ||
118 | else: | ||
119 | result.append(line, filename, lineoffset) | ||
120 | lineoffset += 1 | ||
121 | |||
122 | node = nodes.section() | ||
123 | buf = self.state.memo.title_styles, self.state.memo.section_level, self.state.memo.reporter | ||
124 | self.state.memo.reporter = AutodocReporter(result, self.state.memo.reporter) | ||
125 | self.state.memo.title_styles, self.state.memo.section_level = [], 0 | ||
126 | try: | ||
127 | self.state.nested_parse(result, 0, node, match_titles=1) | ||
128 | finally: | ||
129 | self.state.memo.title_styles, self.state.memo.section_level, self.state.memo.reporter = buf | ||
130 | |||
131 | return node.children | ||
132 | |||
133 | except Exception as e: # pylint: disable=W0703 | ||
134 | env.app.warn('kernel-doc \'%s\' processing failed with: %s' % | ||
135 | (" ".join(cmd), str(e))) | ||
136 | return [nodes.error(None, nodes.paragraph(text = "kernel-doc missing"))] | ||
137 | |||
138 | def setup(app): | ||
139 | app.add_config_value('kerneldoc_bin', None, 'env') | ||
140 | app.add_config_value('kerneldoc_srctree', None, 'env') | ||
141 | app.add_config_value('kerneldoc_verbosity', 1, 'env') | ||
142 | |||
143 | app.add_directive('kernel-doc', KernelDocDirective) | ||
144 | |||
145 | return dict( | ||
146 | version = __version__, | ||
147 | parallel_read_safe = True, | ||
148 | parallel_write_safe = True | ||
149 | ) | ||