From dbe26fddc943bcc66b72e9f8d2a05f80fe4b04b4 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Sun, 18 Oct 2026 19:47:09 +0200 Subject: [PATCH] fix: group system-less files alike in both modes --- scripts/packextras.py | 18 ++++++++++++++---- tests/test_audit_regressions.py | 26 ++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/scripts/packextras.py b/scripts/packextras.py index c2861bbe..0576cf3f 100644 --- a/scripts/packextras.py +++ b/scripts/packextras.py @@ -1079,7 +1079,7 @@ def emulator_region_drops( for fe in _kept(entries, required_only): dest = _resolve_destination(fe, standalone) if dest: - group_id = _emulator_region_group(emu_name, profile, fe) + group_id = _emulator_region_group(emu_name, profile, fe, dest) region_groups.setdefault(group_id, []).append( (dest, fe.get("name", "")) ) @@ -1090,8 +1090,16 @@ def emulator_region_drops( return region_mod.resolve_region_drops(region_groups, region_index, regions, held) -def _emulator_region_group(emu_name: str, profile: dict, file_entry: dict) -> str: - """Stable group ID for regional alternatives within an emulator profile.""" +def _emulator_region_group( + emu_name: str, profile: dict, file_entry: dict, dest: str +) -> str: + """Stable group ID for regional alternatives within an emulator profile. + + The rule extra_region_groups applies on the platform side: a file no + system names, in a profile serving several, competes with nothing. + Grouped together, geargrafx's LaserActive pac-n1.bin was dropped by + --emulator --region us and kept by --platform --region us. + """ variant = file_entry.get("variant_group") if variant: return f"{emu_name}:variant:{variant}" @@ -1099,4 +1107,6 @@ def _emulator_region_group(emu_name: str, profile: dict, file_entry: dict) -> st profile_systems = list(profile.get("systems", [])) if not system and len(profile_systems) == 1: system = profile_systems[0] - return f"{emu_name}:system:{system or '_profile'}" + if not system: + return f"{emu_name}:file:{dest}" + return f"{emu_name}:system:{system}" diff --git a/tests/test_audit_regressions.py b/tests/test_audit_regressions.py index fb24da41..4c0f9f5e 100644 --- a/tests/test_audit_regressions.py +++ b/tests/test_audit_regressions.py @@ -1441,13 +1441,35 @@ class RegionRegressions(unittest.TestCase): def test_multi_system_emulator_uses_separate_region_groups(self): profile = {"systems": ["odyssey2", "videopac"]} north_america = _emulator_region_group( - "o2em", profile, {"name": "o2rom.bin", "system": "odyssey2"} + "o2em", profile, {"name": "o2rom.bin", "system": "odyssey2"}, "o2rom.bin" ) europe = _emulator_region_group( - "o2em", profile, {"name": "c52.bin", "system": "videopac"} + "o2em", profile, {"name": "c52.bin", "system": "videopac"}, "c52.bin" ) self.assertNotEqual(north_america, europe) + def test_a_systemless_file_groups_alike_in_both_modes(self): + """geargrafx files pac-n1.bin [japan] and pac-n10.bin [north-america] + under none of its four systems: emulator mode grouped them and + dropped pac-n1.bin for --region us, platform mode isolated each and + kept it.""" + from packextras import extra_region_groups + + profile = {"systems": ["nec-pc-engine", "nec-pc-engine-cd", "nec-supergrafx", + "pioneer-laseractive"]} + names = ["pac-n1.bin", "pac-n10.bin"] + emulator = [ + _emulator_region_group("geargrafx", profile, {"name": n}, n) for n in names + ] + platform = [ + extra_region_groups({ + "source_emulator": "geargrafx", "destination": n, + "source_systems": profile["systems"], + })[0] + for n in names + ] + self.assertEqual(emulator, platform) + def test_region_audit_resolves_the_way_the_pack_does(self): """A private resolver read sha1, md5 and a lone name: an entry identified by its path (Dolphin's three IPL.bin) was never checked."""