From c6db200beb11e409e388baae3323d5968d90dca3 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 20 Oct 2026 01:17:35 +0200 Subject: [PATCH] fix: the global gap report keeps standalone files With no platform named, cross_reference passed no standalone cores, so every dual profile was laid out as libretro only. The CLI and the site's gaps page left out 133 files that Batocera and RetroBat run standalone and that no platform declares (eka2l1 90, dolphin 21, cemu 11). Both now pass the union of every platform's standalone cores. --- scripts/cross_reference.py | 10 ++++++++++ scripts/generate_site.py | 5 +++++ tests/test_audit_regressions.py | 17 +++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/scripts/cross_reference.py b/scripts/cross_reference.py index 24951b49..c3051b97 100644 --- a/scripts/cross_reference.py +++ b/scripts/cross_reference.py @@ -853,6 +853,16 @@ def main() -> None: ) profiles = {k: v for k, v in profiles.items() if k in relevant} standalone_cores = standalone_set(config) + else: + # The tree as every platform runs it: a profile some platform runs + # standalone keeps its standalone entries. Laid out as libretro only, + # eka2l1, dolphin and xenia-edge lost 133 files no platform declares. + from common import list_registered_platforms + + standalone_cores = set().union(*( + standalone_set(load_platform_config(name, args.platforms_dir)) + for name in list_registered_platforms(args.platforms_dir, include_archived=True) + )) if not profiles: if args.emulator and args.target and set(args.emulator.split(",")) & run_anywhere: diff --git a/scripts/generate_site.py b/scripts/generate_site.py index d57ea385..df98933c 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -618,9 +618,14 @@ def build_emulator_gap_report( for k, v in profiles.items() if v.get("type") not in ("alias", "test") } + from common import standalone_set + return run_cross_reference( unique_profiles, declared, db, data_names=data_names, all_declared=all_declared, + standalone_cores=set().union( + *(standalone_set(cov["config"]) for cov in coverages.values()) + ), ) diff --git a/tests/test_audit_regressions.py b/tests/test_audit_regressions.py index 0209b03f..9f561451 100644 --- a/tests/test_audit_regressions.py +++ b/tests/test_audit_regressions.py @@ -5287,5 +5287,22 @@ class ReportsHoldTheDataTrees(unittest.TestCase): )) +class TheTreeKeepsStandaloneEntries(unittest.TestCase): + """With no platform named, the gap report laid every dual profile out as + libretro only: eka2l1, dolphin and xenia-edge lost 133 files that + Batocera and RetroBat run standalone and no platform declares.""" + + def test_a_standalone_only_entry_is_reported(self): + if not (ROOT / "database.json").exists(): + self.skipTest("database.json is not built") + out = subprocess.run( + [sys.executable, "scripts/cross_reference.py", "--emulator", "eka2l1"], + cwd=ROOT, capture_output=True, text=True, timeout=600, check=True, + ).stdout + undeclared = re.search(r"(\d+) undeclared", out) + self.assertIsNotNone(undeclared, out[-500:]) + self.assertGreater(int(undeclared.group(1)), 0) + + if __name__ == "__main__": unittest.main()