浏览代码

Meta: Add script for checking WebIDL files

This adds a new script for linting WebIDL files, and adds it to the set
of scripts Meta/lint-ci.sh runs. Initially, this script does just one
thing: normalizes IDL definition lines so they start with four spaces.
sideshowbarker 10 月之前
父节点
当前提交
a7578164d4
共有 2 个文件被更改,包括 70 次插入0 次删除
  1. 69 0
      Meta/check-idl-files.py
  2. 1 0
      Meta/lint-ci.sh

+ 69 - 0
Meta/check-idl-files.py

@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import pathlib
+import re
+import subprocess
+import sys
+
+script_name = pathlib.Path(__file__).resolve().name
+
+lines_to_skip = re.compile(
+    r"^($| *//|\};|#import |.+ includes .+|\[[^\]]+\]"
+    r"|interface |dictionary |enum |namespace |typedef |callback )"
+)
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--overwrite-inplace", action=argparse.BooleanOptionalAction)
+parser.add_argument('filenames', nargs='*')
+args = parser.parse_args()
+
+
+def find_files_here_or_argv():
+    if args.filenames:
+        raw_list = args.filenames
+    else:
+        process = subprocess.run(["git", "ls-files"], check=True, capture_output=True)
+        raw_list = process.stdout.decode().strip("\n").split("\n")
+    return filter(lambda filename: filename.endswith(".idl"), raw_list)
+
+
+def run():
+    """Lint WebIDL files checked into git for four leading spaces on each line."""
+    files_without_four_leading_spaces = set()
+    did_fail = False
+    for filename in find_files_here_or_argv():
+        lines = []
+        with open(filename, "r") as f:
+            for line_number, line in enumerate(f, start=1):
+                if lines_to_skip.match(line):
+                    lines.append(line)
+                    continue
+                if not line.startswith("    "):
+                    if args.overwrite_inplace:
+                        line = "    " + line.lstrip()
+                        lines.append(line)
+                        continue
+                    did_fail = True
+                    files_without_four_leading_spaces.add(filename)
+                    print(
+                        f"{filename}:{line_number} error: Line does not start with four spaces:{line.rstrip()}")
+                lines.append(line)
+        if args.overwrite_inplace:
+            with open(filename, "w") as f:
+                f.writelines(lines)
+
+    if files_without_four_leading_spaces:
+        print("\nWebIDL files that have lines without four leading spaces:",
+              " ".join(files_without_four_leading_spaces))
+        if not args.overwrite_inplace:
+            print(
+                f"\nTo fix the WebIDL files in place, run: ./Meta/{script_name} --overwrite-inplace")
+    if did_fail:
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    os.chdir(os.path.dirname(__file__) + "/..")
+    run()

+ 1 - 0
Meta/lint-ci.sh

@@ -15,6 +15,7 @@ set +e
 
 for cmd in \
         Meta/check-debug-flags.sh \
+        Meta/check-idl-files.py \
         Meta/check-newlines-at-eof.py \
         Meta/check-png-sizes.sh \
         Meta/check-style.py \