diff --git a/.github/windowdesc-ini-key.py b/.github/windowdesc-ini-key.py new file mode 100644 --- /dev/null +++ b/.github/windowdesc-ini-key.py @@ -0,0 +1,50 @@ +""" +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}", 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() diff --git a/.github/workflows/windowdesc-ini-key.yml b/.github/workflows/windowdesc-ini-key.yml new file mode 100644 --- /dev/null +++ b/.github/workflows/windowdesc-ini-key.yml @@ -0,0 +1,24 @@ +name: WindowDesc ini_key + +on: + pull_request: + branches: + - master + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/master' }} + +jobs: + windowdesc-ini-key: + name: WindowDesc ini_key issues + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Check for ini_key issues in WindowDesc entries + shell: bash + run: | + python3 .github/windowdesc-ini-key.py