Files @ r27919:cd30b76e8b60
Branch filter:

Location: cpp/openttd-patchpack/source/.github/windowdesc-ini-key.py

Patric Stout
Fix: also apply cargo filters on shared groups in vehicle listing (#11294)
"""
Script to scan the OpenTTD source-tree for ini_key issues in WindowDesc entries.
"""

import glob
import os
import re
import sys


def scan_source_files(path, ini_keys=None):
    if ini_keys is None:
        ini_keys = set()

    errors = []

    for new_path in glob.glob(f"{path}/*.cpp"):
        if os.path.isdir(new_path):
            errors.append(scan_source_files(new_path, ini_keys))
            continue

        with open(new_path) as fp:
            output = fp.read()

        for (name, ini_key, widgets) in re.findall(r"^static WindowDesc ([a-zA-Z0-9_]*).*?, (?:\"(.*?)\")?.*?,(?:\s+.*?,){6}\s+[^\s]+\((.*?)\)", output, re.S|re.M):
            if ini_key:
                if ini_key in ini_keys:
                    errors.append(f"{new_path}: {name} ini_key is a duplicate")
                ini_keys.add(ini_key)
            widget = re.findall("static const (?:struct )?NWidgetPart " + widgets + ".*?(?:WWT_(DEFSIZE|STICKY)BOX.*?)?;", output, re.S)[0]
            if widget and not ini_key:
                errors.append(f"{new_path}: {name} has WWT_DEFSIZEBOX/WWT_STICKYBOX without ini_key")
            if ini_key and not widget:
                errors.append(f"{new_path}: {name} has ini_key without WWT_DEFSIZEBOX/WWT_STICKYBOX")

    return errors


def main():
    errors = scan_source_files("src")

    if errors:
        print("\n".join(errors))
        sys.exit(1)

    print("OK")


if __name__ == "__main__":
    main()