FreeCAD WebAssembly development snapshot
Some checks failed
FreeCAD master CI / Prepare (push) Has been cancelled
FreeCAD master CI / Pixi (push) Has been cancelled
FreeCAD master CI / Ubuntu (push) Has been cancelled
FreeCAD master CI / Windows (push) Has been cancelled
FreeCAD master CI / Lint (push) Has been cancelled
FreeCAD master CI / WrapUp (push) Has been cancelled
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Stale Issues / stale (push) Has been cancelled
Some checks failed
FreeCAD master CI / Prepare (push) Has been cancelled
FreeCAD master CI / Pixi (push) Has been cancelled
FreeCAD master CI / Ubuntu (push) Has been cancelled
FreeCAD master CI / Windows (push) Has been cancelled
FreeCAD master CI / Lint (push) Has been cancelled
FreeCAD master CI / WrapUp (push) Has been cancelled
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Stale Issues / stale (push) Has been cancelled
This commit is contained in:
90
tools/lint/cpplint.py
vendored
Normal file
90
tools/lint/cpplint.py
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import logging
|
||||
from utils import (
|
||||
run_command,
|
||||
init_environment,
|
||||
write_file,
|
||||
append_file,
|
||||
emit_problem_matchers,
|
||||
add_common_arguments,
|
||||
)
|
||||
|
||||
DEFAULT_LINE_LENGTH_LIMIT = 100
|
||||
|
||||
def load_cpplint_filters(conf_file="cpplint.cfg"):
|
||||
"""Load cpplint filters from a configuration file."""
|
||||
try:
|
||||
with open(conf_file, "r", encoding="utf-8") as f:
|
||||
filters = f.read().strip()
|
||||
return filters
|
||||
except Exception as e:
|
||||
logging.warning(f"Could not load {conf_file}: {e}")
|
||||
return ""
|
||||
|
||||
def count_cpplint_errors(log_text: str) -> int:
|
||||
"""
|
||||
Count the number of cpplint error/warning lines.
|
||||
"""
|
||||
matches = re.findall(r"\[[0-9]+\]$", log_text, re.MULTILINE)
|
||||
return len(matches)
|
||||
|
||||
def generate_markdown_report(aggregated_output: str, errors_count: int) -> str:
|
||||
"""Generate a Markdown report section based on cpplint output and error count."""
|
||||
report_lines = []
|
||||
if errors_count > 0:
|
||||
report_lines.append(
|
||||
f"<details><summary>:warning: CppLint found {errors_count} errors / warnings</summary>"
|
||||
)
|
||||
else:
|
||||
report_lines.append(
|
||||
"<details><summary>:heavy_check_mark: No cpplint errors found </summary>"
|
||||
)
|
||||
report_lines.append("")
|
||||
report_lines.append("````")
|
||||
report_lines.append(aggregated_output)
|
||||
report_lines.append("````")
|
||||
report_lines.append("</details>")
|
||||
report_lines.append("")
|
||||
return "\n".join(report_lines)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Run cpplint on provided C++ files and append a Markdown report."
|
||||
)
|
||||
add_common_arguments(parser)
|
||||
args = parser.parse_args()
|
||||
init_environment(args)
|
||||
|
||||
run_command(["pip", "install", "-q", "cpplint"], check=True)
|
||||
|
||||
cpplint_filters = load_cpplint_filters("cpplint.cfg")
|
||||
|
||||
aggregated_output = ""
|
||||
for file in args.files.split():
|
||||
cmd = [
|
||||
"cpplint",
|
||||
f"--filters={cpplint_filters}",
|
||||
f"--linelength={DEFAULT_LINE_LENGTH_LIMIT}",
|
||||
file,
|
||||
]
|
||||
stdout, stderr, _ = run_command(cmd)
|
||||
aggregated_output += stdout + stderr + "\n"
|
||||
|
||||
cpplint_log = os.path.join(args.log_dir, "cpplint.log")
|
||||
write_file(cpplint_log, aggregated_output)
|
||||
emit_problem_matchers(cpplint_log, "cpplint.json", "cpplint")
|
||||
|
||||
errors_count = count_cpplint_errors(aggregated_output)
|
||||
logging.info(f"Found {errors_count} cpplint errors")
|
||||
|
||||
report = generate_markdown_report(aggregated_output, errors_count)
|
||||
append_file(args.report_file, report)
|
||||
|
||||
sys.exit(0 if errors_count == 0 else 1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user