diff --git a/scripts/verify.py b/scripts/verify.py index 68516e6b..ea1a369c 100644 --- a/scripts/verify.py +++ b/scripts/verify.py @@ -464,9 +464,15 @@ def find_undeclared_files( profile.get("files", []), db, is_standalone ): fname = f.get("name", "") - effective_path = ( - f.get("standalone_path") if is_standalone else f.get("path") - ) or fname + # One destination rule for the dedup key and for the entry: a + # standalone build without standalone_path falls back on path. + # The key used to skip that fallback, so clk's Acorn/basic.rom and + # Electron/basic.rom both keyed as "basic.rom" under Batocera's + # standalone clk and the second was dropped. + if is_standalone: + dest = f.get("standalone_path") or f.get("path") or fname + else: + dest = f.get("path") or fname raw_regions = f.get("region") or [] region_key = tuple( str(value) for value in ( @@ -478,7 +484,7 @@ def find_undeclared_files( seen_key = ( fname, f.get("archive"), - effective_path, + dest, f.get("system"), f.get("variant_group"), region_key, @@ -539,12 +545,6 @@ def find_undeclared_files( entry["required"] = True continue - # Determine destination path based on mode - if is_standalone: - dest = f.get("standalone_path") or f.get("path") or fname - else: - dest = f.get("path") or fname - # Resolution: storage flag, then name, then path basename storage = f.get("storage", "") if storage in ("release", "large_file"): diff --git a/tests/test_undeclared_dedup.py b/tests/test_undeclared_dedup.py new file mode 100644 index 00000000..b7fa6cde --- /dev/null +++ b/tests/test_undeclared_dedup.py @@ -0,0 +1,43 @@ +"""Same-named core files at two paths stay two files in standalone mode. + +find_undeclared_files keyed its dedup on standalone_path alone when the +platform runs the core standalone, while the destination it then writes +falls back on path. Batocera runs clk standalone, clk declares basic.rom +under Acorn/ and Electron/ without a standalone_path, and the second was +dropped from the pack. +""" + +from __future__ import annotations + +import sys +import unittest +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO_ROOT / "scripts")) + + +class StandaloneFallsBackOnPath(unittest.TestCase): + def test_both_paths_survive(self): + from verify import find_undeclared_files + + profile = { + "emulator": "Clock Signal", + "type": "standalone + libretro", + "systems": ["acorn-electron"], + "files": [ + {"name": "basic.rom", "path": "Acorn/basic.rom", "required": True}, + {"name": "basic.rom", "path": "Electron/basic.rom", "required": True}, + ], + } + config = {"cores": ["clk"], "standalone_cores": ["clk"], "systems": {}} + db = {"files": {}, "indexes": {}} + found = find_undeclared_files(config, "emulators", db, emu_profiles={"clk": profile}) + self.assertEqual( + sorted(f["path"] for f in found if f["name"] == "basic.rom"), + ["Acorn/basic.rom", "Electron/basic.rom"], + ) + + +if __name__ == "__main__": + unittest.main()