From e787fcee8edac745c3509bd702c5ed8e62dd1608 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 6 Oct 2026 12:15:50 +0200 Subject: [PATCH] fix: leave bizhawk's declared sha1 to bizhawk --- scripts/exporter/bizhawk_exporter.py | 7 +++++-- tests/test_export_counts.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/scripts/exporter/bizhawk_exporter.py b/scripts/exporter/bizhawk_exporter.py index 2d56dfd4..f1f9c756 100644 --- a/scripts/exporter/bizhawk_exporter.py +++ b/scripts/exporter/bizhawk_exporter.py @@ -11,7 +11,7 @@ from __future__ import annotations import re from .base_exporter import BaseExporter -from .baseline import NativeFile, NativeSystem, Report +from .baseline import NativeFile, NativeSystem, Report, _hash_values SOURCE_URL = ( "https://raw.githubusercontent.com/TASEmulators/BizHawk/master" @@ -80,7 +80,10 @@ class Exporter(BaseExporter): seen: dict[str, list[NativeFile]] = {} for system in systems.values(): for fe in system.files: - if fe.hash("sha1"): + # A SHA1 BizHawk declares is BizHawk's own code, the authority + # for its cores: the truth's MSX.rom came from FBNeo and would + # have made MSXHawk refuse the dump it accepts. + if fe.hash("sha1") and not _hash_values(fe.platform or {}, "sha1"): seen.setdefault(fe.name.casefold(), []).append(fe) resolved: dict[str, NativeFile] = {} for name, entries in seen.items(): diff --git a/tests/test_export_counts.py b/tests/test_export_counts.py index 2b1acd24..07a2ea93 100644 --- a/tests/test_export_counts.py +++ b/tests/test_export_counts.py @@ -205,6 +205,20 @@ class OneMd5FormatsAddWhole(unittest.TestCase): self.assertTrue(Batocera.writable(single)) +class BizHawkKeepsItsOwnHashes(unittest.TestCase): + def test_a_declared_sha1_is_not_replaced(self): + """FBNeo's MSX.rom replaced the SHA1 MSXHawk accepts in BizHawk's code.""" + sha_bizhawk, sha_fbneo = "4" * 40, "e" * 40 + fe = NativeFile("MSX.rom", "MSX.rom", "MSX", platform={"sha1": sha_bizhawk}, + truth={"sha1": sha_fbneo}, corrections=["sha1"]) + exporter = BizHawk() + source = f'FirmwareAndOption("{sha_bizhawk.upper()}", 32768, "MSX", "b", "MSX.rom", "d");\n' + produced = exporter.render({"MSX": NativeSystem("MSX", files=[fe])}, None, + {exporter.native_filename(): source}) + self.assertIn(sha_bizhawk.upper(), produced[exporter.native_filename()]) + self.assertFalse(exporter.states(fe, "sha1")) + + class ModelKeepsOneFileOneEntry(unittest.TestCase): def test_a_list_of_sizes_is_not_one_size(self): """A profile may accept several revisions; int() on the list crashed."""