| | |
| | 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() |
| |
|