scripts/kernel-doc.py: Properly handle Werror and exit codes

The original kernel-doc script has a logic to return warnings
as errors, and to report the number of warnings found, if in
verbose mode.

Implement it to be fully compatible with the original script.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/de33b0cebd9fdf82d8b221bcfe41db7269286222.1744106242.git.mchehab+huawei@kernel.org
This commit is contained in:
Mauro Carvalho Chehab 2025-04-08 18:09:31 +08:00 committed by Jonathan Corbet
parent e4b2bd908c
commit 11afeab6d7
4 changed files with 35 additions and 18 deletions

View file

@ -78,8 +78,6 @@
# Yacine Belkadi <yacine.belkadi.1@gmail.com>
# Yujie Liu <yujie.liu@intel.com>
# TODO: implement warning filtering
"""
kernel_doc
==========
@ -295,6 +293,22 @@ def main():
if msg:
print(msg)
error_count = kfiles.errors
if not error_count:
sys.exit(0)
if args.werror:
print(f"{error_count} warnings as errors")
sys.exit(error_count)
if args.verbose:
print(f"{error_count} errors")
if args.none:
sys.exit(0)
sys.exit(error_count)
# Call main method
if __name__ == "__main__":

View file

@ -12,7 +12,6 @@ import argparse
import logging
import os
import re
import sys
from kdoc_parser import KernelDoc
from kdoc_output import OutputFormat
@ -109,7 +108,7 @@ class KernelFiles():
KernelDoc.process_export(self.config.function_table, line)
except IOError:
print(f"Error: Cannot open fname {fname}", fname=sys.stderr)
self.config.log.error("Error: Cannot open fname %s", fname)
self.config.errors += 1
def file_not_found_cb(self, fname):
@ -262,3 +261,12 @@ class KernelFiles():
fname, ln, dtype)
if msg:
yield fname, msg
@property
def errors(self):
"""
Return a count of the number of warnings found, including
the ones displayed while interacting over self.msg.
"""
return self.config.errors

View file

@ -128,11 +128,9 @@ class OutputFormat:
warnings = args.get('warnings', [])
for warning, log_msg in warnings:
if warning:
self.config.log.warning(log_msg)
else:
self.config.log.info(log_msg)
for log_msg in warnings:
self.config.log.warning(log_msg)
self.config.errors += 1
def check_doc(self, name, args):
"""Check if DOC should be output"""

View file

@ -137,17 +137,18 @@ class KernelDoc:
log_msg = f"{self.fname}:{ln} {msg}"
if not warning:
self.config.log.info(log_msg)
return
if self.entry:
# Delegate warning output to output logic, as this way it
# will report warnings/info only for symbols that are output
self.entry.warnings.append((warning, log_msg))
self.entry.warnings.append(log_msg)
return
if warning:
self.config.log.warning(log_msg)
else:
self.config.log.info(log_msg)
self.config.log.warning(log_msg)
def dump_section(self, start_new=True):
"""
@ -556,7 +557,6 @@ class KernelDoc:
if not members:
self.emit_warning(ln, f"{proto} error: Cannot parse struct or union!")
self.config.errors += 1
return
if self.entry.identifier != declaration_name:
@ -831,7 +831,6 @@ class KernelDoc:
if not members:
self.emit_warning(ln, f"{proto}: error: Cannot parse enum!")
self.config.errors += 1
return
if self.entry.identifier != declaration_name:
@ -1132,7 +1131,6 @@ class KernelDoc:
return
self.emit_warning(ln, "error: Cannot parse typedef!")
self.config.errors += 1
@staticmethod
def process_export(function_table, line):
@ -1677,4 +1675,3 @@ class KernelDoc:
self.process_docblock(ln, line)
except OSError:
self.config.log.error(f"Error: Cannot open file {self.fname}")
self.config.errors += 1