diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bf8faa12..ff78b245 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,6 +47,7 @@ The checks CI runs on a pull request (Python 3.12 or newer): pip install pyyaml "jsonschema[format-nongpl]" python scripts/validate_pr.py --changed # the BIOS files the branch adds python scripts/validate_schemas.py --source-only # profiles and platform files +python scripts/profile_sync.py --emulator NAME --strict # each profile the branch adds python -m unittest discover -s tests -t . ``` @@ -58,8 +59,8 @@ before a release. ## PR validation CI computes SHA1/MD5/CRC32 for every new file, checks them against the platform -configs, validates the YAML against the schemas, runs the test suite, and posts -a report on the PR. +configs, validates the YAML against the schemas, confronts each added profile +with its upstream source, runs the test suite, and posts a report on the PR. Contributors who add platform support are credited in the README, on the documentation site, and in the BIOS packs. diff --git a/README.md b/README.md index 7edb4e9b..67f3241b 100644 --- a/README.md +++ b/README.md @@ -88,13 +88,13 @@ Full list with per-file details: **[https://abdess.github.io/retrobios/](https:/ |----------|-----------------:|-------------------------:|------------| | Batocera | 353/353 | 12,354/12,788 | MD5 hash | | BizHawk | 118/118 | 755/756 | SHA1 hash | -| EmuDeck | 168/168 | 451/453 | MD5 hash | +| EmuDeck | 168/168 | 5,810/5,840 | MD5 hash | | Lakka | 532/532 | 5,267/5,297 | file presence | | MiSTer FPGA | 81/81 | - | MD5 hash | | ROCKNIX | 38/38 | 5,926/6,003 | MD5 hash | | Recalbox | 351/351 | 2,788/2,806 | MD5 hash | | RetroArch | 526/526 | 5,279/5,309 | file presence | -| RetroBat | 348/348 | 7,261/7,420 | MD5 hash | +| RetroBat | 348/348 | 7,258/7,417 | MD5 hash | | RetroDECK | 2,008/2,008 | 5,327/5,377 | MD5 hash | | RetroPie * | 532/532 | 9,197/9,339 | file presence | | RomM | 383/383 | 774/781 | MD5 hash | @@ -180,4 +180,4 @@ The scripts and tooling are released under the [MIT License](LICENSE). The BIOS and firmware files are not covered by that license: they are third-party system software, preserved and provided for personal backup, archival, and interoperability with emulation software. [NOTICE](NOTICE) sets out their status and how to ask for a file to be removed. The reasoning, and where it is weakest, is in the [FAQ](https://abdess.github.io/retrobios/wiki/faq/#is-this-legal). -*Auto-generated on 2026-10-18T18:31:56Z* +*Auto-generated on 2026-10-19T02:14:14Z* diff --git a/scripts/generate_readme.py b/scripts/generate_readme.py index 0eddc08d..8f786d18 100644 --- a/scripts/generate_readme.py +++ b/scripts/generate_readme.py @@ -726,6 +726,7 @@ The checks CI runs on a pull request (Python 3.12 or newer): pip install pyyaml "jsonschema[format-nongpl]" python scripts/validate_pr.py --changed # the BIOS files the branch adds python scripts/validate_schemas.py --source-only # profiles and platform files +python scripts/profile_sync.py --emulator NAME --strict # each profile the branch adds python -m unittest discover -s tests -t . ``` @@ -737,8 +738,8 @@ before a release. ## PR validation CI computes SHA1/MD5/CRC32 for every new file, checks them against the platform -configs, validates the YAML against the schemas, runs the test suite, and posts -a report on the PR. +configs, validates the YAML against the schemas, confronts each added profile +with its upstream source, runs the test suite, and posts a report on the PR. Contributors who add platform support are credited in the README, {site_words}, and in the BIOS packs. diff --git a/tests/test_workflow_paths.py b/tests/test_workflow_paths.py index 2b302876..81091a9d 100644 --- a/tests/test_workflow_paths.py +++ b/tests/test_workflow_paths.py @@ -109,6 +109,18 @@ class DeploySiteTriggers(unittest.TestCase): class DocumentedSteps(unittest.TestCase): + def test_the_release_page_names_every_validation_job(self): + """check-new-profiles ran on every pull request and push while the + page said four jobs and named none of it.""" + workflow = yaml.safe_load( + (REPO_ROOT / ".github/workflows/validate.yml").read_text(encoding="utf-8") + ) + page = (REPO_ROOT / "wiki/release-process.md").read_text(encoding="utf-8") + missing = sorted(job for job in workflow["jobs"] if f"**{job}" not in page) + self.assertEqual(missing, []) + words = {2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven"} + self.assertIn(f"{words[len(workflow['jobs'])]} jobs", page) + def test_the_release_page_names_every_installed_package(self): """The page listed pyyaml and mkdocs and left out jsonschema: a maintainer following it could not run the contract check.""" diff --git a/wiki/release-process.md b/wiki/release-process.md index 85886320..92dff32a 100644 --- a/wiki/release-process.md +++ b/wiki/release-process.md @@ -91,7 +91,7 @@ no YAML anchor. **Concurrency.** Per-PR group on a pull request, per-ref on a push, cancel in-progress either way: a push series collapses to the tip. -Four jobs, two of which read pull request context and carry an event guard: +Five jobs, two of which read pull request context and carry an event guard: **validate-bios** (pull requests only). Diffs the PR to find changed BIOS files, runs `validate_pr.py --markdown` on each, and posts the validation @@ -103,6 +103,13 @@ every emulator profile against `schemas/emulator.schema.json`. Both schemas set `additionalProperties: false`, so a typo in a field name fails the job instead of being silently ignored. +**check-new-profiles.** Runs `profile_sync.py --emulator NAME --strict` on +each profile the change adds (the files `git diff --diff-filter=A` names +against the pull request base, or against the commit a push moved main from). +A profile written from a clone can cite lines that do not hold the value it +declares while schemas and tests pass it; this job confronts it with its +upstream. An edited profile is not held to it. + **run-tests.** Runs `python -m unittest discover -s tests -t . -v`. Must pass before a merge, and again on the commit a direct push puts at the head of main.