You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OpenTTD-patches/.github/windowdesc-ini-key.py

51 lines
1.4 KiB
Python

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