#!/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()