95 lines
2.6 KiB
Python
Executable file
95 lines
2.6 KiB
Python
Executable file
#!/usr/bin/env python
|
|
# Generate the wiki Home.md page from the contained doc comments
|
|
# requires the checked out wiki in ../rust-clippy.wiki/
|
|
# with -c option, print a warning and set exit status 1 if the file would be
|
|
# changed.
|
|
|
|
import re
|
|
import sys
|
|
|
|
from lintlib import log, parse_all
|
|
|
|
PREFIX = """Welcome to the rust-clippy wiki!
|
|
|
|
Here we aim to collect further explanations on the lints clippy provides. So \
|
|
without further ado:
|
|
"""
|
|
|
|
WARNING = """
|
|
# A word of warning
|
|
|
|
Clippy works as a *plugin* to the compiler, which means using an unstable \
|
|
internal API. We have gotten quite good at keeping pace with the API \
|
|
evolution, but the consequence is that clippy absolutely needs to be compiled \
|
|
with the version of `rustc` it will run on, otherwise you will get strange \
|
|
errors of missing symbols.
|
|
|
|
"""
|
|
|
|
TEMPLATE = """\n# `%s`
|
|
|
|
**Default level:** %s
|
|
|
|
%s"""
|
|
|
|
CONF_TEMPLATE = """
|
|
**Configuration:** This lint has the following configuration variables:
|
|
|
|
* `%s: %s`: %s (defaults to `%s`).
|
|
"""
|
|
|
|
|
|
def level_message(level):
|
|
if level == "Deprecated":
|
|
return "\n**Those lints are deprecated**:\n\n"
|
|
else:
|
|
return "\n**Those lints are %s by default**:\n\n" % level
|
|
|
|
|
|
def write_wiki_page(lints, configs, filepath):
|
|
lints.sort()
|
|
with open(filepath, "w") as fp:
|
|
fp.write(PREFIX)
|
|
|
|
for level in ('Deny', 'Warn', 'Allow', 'Deprecated'):
|
|
fp.write(level_message(level))
|
|
for lint in lints:
|
|
if lint.level == level:
|
|
fp.write("[`%s`](#%s)\n" % (lint.name, lint.name))
|
|
|
|
fp.write(WARNING)
|
|
for lint in lints:
|
|
fp.write(TEMPLATE % (lint.name, lint.level, "".join(lint.doc)))
|
|
|
|
if lint.name in configs:
|
|
fp.write(CONF_TEMPLATE % configs[lint.name])
|
|
|
|
|
|
def check_wiki_page(lints, configs, filepath):
|
|
lintdict = dict((lint.name, lint) for lint in lints)
|
|
errors = False
|
|
with open(filepath) as fp:
|
|
for line in fp:
|
|
m = re.match("# `([a-z_0-9]+)`", line)
|
|
if m:
|
|
v = lintdict.pop(m.group(1), None)
|
|
if v is None:
|
|
log.error("Spurious wiki entry: %s", m.group(1))
|
|
errors = True
|
|
for n in sorted(lintdict):
|
|
log.error("Missing wiki entry: %s", n)
|
|
errors = True
|
|
if errors:
|
|
return 1
|
|
|
|
|
|
def main():
|
|
lints, configs = parse_all()
|
|
if "-c" in sys.argv:
|
|
check_wiki_page(lints, configs, "../rust-clippy.wiki/Home.md")
|
|
else:
|
|
write_wiki_page(lints, configs, "../rust-clippy.wiki/Home.md")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|