Source code for linuxdoc.lint

# SPDX-License-Identifier: AGPL-3.0-or-later
"""
lint
~~~~

Implementation of the :ref:`linuxdoc.lintdoc` command.

:copyright:  Copyright (C) 2023  Markus Heiser
:license:    AGPL-3.0-or-later; see LICENSE for details.

The command ``linuxdoc.lint`` *lint* the kernel-doc comments in the source
code::

    $ linuxdoc.lint --help

"""

import sys
import argparse

from fspath import FSPath
from . import kernel_doc

CMD = None

MSG    = lambda msg: sys.__stderr__.write("INFO : %s\n" % msg)
ERR    = lambda msg: sys.__stderr__.write("ERROR: %s\n" % msg)
FATAL  = lambda msg: sys.__stderr__.write("FATAL: %s\n" % msg)

EPILOG = """This command uses the kernel-doc parser from the linuxdoc Sphinx
extension, for details see: https://return42.github.io/linuxdoc/cmd-line.html"""

DESCRIPTION = """Lint the kernel-doc markup comments in the source code files."""

# ------------------------------------------------------------------------------
[docs] def main(): # ------------------------------------------------------------------------------ global CMD # pylint: disable=global-statement cli = get_cli() CMD = cli.parse_args() kernel_doc.DEBUG = CMD.debug kernel_doc.VERBOSE = CMD.verbose if not CMD.srctree.EXISTS: ERR("%s does not exists or is not a folder" % CMD.srctree) sys.exit(42) if CMD.srctree.ISDIR: for fname in CMD.srctree.reMatchFind(r"^.*\.[ch]$"): lintdoc_file(fname) else: fname = CMD.srctree CMD.srctree = CMD.srctree.DIRNAME lintdoc_file(fname)
[docs] def get_cli(): cli = argparse.ArgumentParser( description = ("") , epilog = EPILOG , formatter_class=argparse.ArgumentDefaultsHelpFormatter) cli.add_argument( "srctree" , help = "File or folder of source code." , type = lambda x: FSPath(x).ABSPATH ) cli.add_argument( "--sloppy" , action = "store_true" , help = "Sloppy linting, reports only severe errors." ) cli.add_argument( "--markup" , choices = ["reST", "kernel-doc"] , default = "reST" , help = ( "Markup of the comments. Change this option only if you know" " what you do. New comments must be marked up with reST!" ) ) cli.add_argument( "--verbose", "-v" , action = "store_true" , help = "verbose output with log messages to stderr" ) cli.add_argument( "--debug" , action = "store_true" , help = "debug messages to stderr" ) return cli
# ------------------------------------------------------------------------------
[docs] def lintdoc_file(fname): # ------------------------------------------------------------------------------ "lint documentation from fname" fname = fname.relpath(CMD.srctree) opts = kernel_doc.ParseOptions( fname = fname , src_tree = CMD.srctree , verbose_warn = not (CMD.sloppy) , markup = CMD.markup ) parser = kernel_doc.Parser(opts, kernel_doc.NullTranslator()) try: parser.parse() except Exception: # pylint: disable=broad-except FATAL("kernel-doc comments markup of %s seems buggy / can't parse" % opts.fname) return