From 181248b6db8030210e39f3ecfcbeee4043e2c1b0 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Fri, 27 Mar 2026 12:58:08 +0100 Subject: [PATCH] fix: case-sensitive packs for linux platforms, remove empty bios placeholder --- bios/Apple/Apple II/disk2-13boot.rom | 0 database.json | 19 ++----------------- platforms/retroarch.yml | 1 + platforms/retrobat.yml | 1 + scripts/generate_pack.py | 28 +++++++++++++++++++--------- 5 files changed, 23 insertions(+), 26 deletions(-) delete mode 100644 bios/Apple/Apple II/disk2-13boot.rom diff --git a/bios/Apple/Apple II/disk2-13boot.rom b/bios/Apple/Apple II/disk2-13boot.rom deleted file mode 100644 index e69de29b..00000000 diff --git a/database.json b/database.json index af6cda55..d75d9a6c 100644 --- a/database.json +++ b/database.json @@ -1,6 +1,6 @@ { - "generated_at": "2026-03-26T12:17:17Z", - "total_files": 6748, + "generated_at": "2026-03-27T11:57:57Z", + "total_files": 6747, "total_size": 5505760050, "files": { "520d3d1b5897800af47f92efd2444a26b7a7dead": { @@ -573,16 +573,6 @@ "crc32": "665cd50f", "adler32": "39cd4d98" }, - "da39a3ee5e6b4b0d3255bfef95601890afd80709": { - "path": "bios/Apple/Apple II/disk2-13boot.rom", - "name": "disk2-13boot.rom", - "size": 0, - "sha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "md5": "d41d8cd98f00b204e9800998ecf8427e", - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "crc32": "00000000", - "adler32": "00000001" - }, "afd060e6f35faf3bb0146fa889fc787adf56330a": { "path": "bios/Apple/Apple II/disk2-13seq.rom", "name": "disk2-13seq.rom", @@ -67543,7 +67533,6 @@ "ba89edf2729a28a17cd9e0f7a0ac9a39": "bc32bc0e8902946663998f56aea52be597d9e361", "8f7ee14ccca8ae3dd8c759497af3f09b": "799e2fc90d6bfd8cb74e331e04d5afd36f2f21a1", "d3bef2755267a941f264fb5b288e3076": "e8c40d3a44a41a9b6b5dd3a993d7057b3bfb4086", - "d41d8cd98f00b204e9800998ecf8427e": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "4f80448507cf43ab40c17ac08d89e278": "afd060e6f35faf3bb0146fa889fc787adf56330a", "5f1be0c1cdff26f5956eef9643911886": "bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4", "c835eab06842e3c1d6e2e7dc19289828": "a57f14469867ce0d0865995a645b69f41a0ea718", @@ -74405,9 +74394,6 @@ "e8c40d3a44a41a9b6b5dd3a993d7057b3bfb4086", "5ba8555f716bd48834858d8a7f42810ab7293b12" ], - "disk2-13boot.rom": [ - "da39a3ee5e6b4b0d3255bfef95601890afd80709" - ], "disk2-13seq.rom": [ "afd060e6f35faf3bb0146fa889fc787adf56330a" ], @@ -95646,7 +95632,6 @@ "de7ddf29": "bc32bc0e8902946663998f56aea52be597d9e361", "4f923a35": "799e2fc90d6bfd8cb74e331e04d5afd36f2f21a1", "665cd50f": "e8c40d3a44a41a9b6b5dd3a993d7057b3bfb4086", - "00000000": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "d34eb2ff": "afd060e6f35faf3bb0146fa889fc787adf56330a", "b72a2c70": "bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4", "6105d2ee": "a57f14469867ce0d0865995a645b69f41a0ea718", diff --git a/platforms/retroarch.yml b/platforms/retroarch.yml index 528ceac5..894e1d00 100644 --- a/platforms/retroarch.yml +++ b/platforms/retroarch.yml @@ -7,6 +7,7 @@ base_destination: system cores: all_libretro hash_type: sha1 verification_mode: existence +case_insensitive_fs: true systems: 3do: files: diff --git a/platforms/retrobat.yml b/platforms/retrobat.yml index cb96c4dd..acb0216b 100644 --- a/platforms/retrobat.yml +++ b/platforms/retrobat.yml @@ -5,6 +5,7 @@ source: "https://raw.githubusercontent.com/RetroBat-Official/emulatorlauncher/ma base_destination: bios hash_type: md5 verification_mode: md5 +case_insensitive_fs: true cores: - 81 - a5200 diff --git a/scripts/generate_pack.py b/scripts/generate_pack.py index 8de6bef7..6c38674e 100644 --- a/scripts/generate_pack.py +++ b/scripts/generate_pack.py @@ -250,11 +250,16 @@ def generate_pack( zip_path = os.path.join(output_dir, zip_name) os.makedirs(output_dir, exist_ok=True) + # Case-insensitive dedup only for platforms targeting Windows/macOS. + # Linux-only platforms (Batocera, Recalbox, RetroDECK, Lakka, RomM) + # are case-sensitive and may have distinct files like DISK.ROM vs disk.rom. + case_insensitive = config.get("case_insensitive_fs", False) + total_files = 0 missing_files = [] user_provided = [] seen_destinations: set[str] = set() - seen_lower: set[str] = set() # case-insensitive dedup for Windows/macOS + seen_lower: set[str] = set() # only used when case_insensitive=True # Per-file status: worst status wins (missing > untested > ok) file_status: dict[str, str] = {} file_reasons: dict[str, str] = {} @@ -293,7 +298,7 @@ def generate_pack( full_dest = dest dedup_key = full_dest - already_packed = dedup_key in seen_destinations or dedup_key.lower() in seen_lower + already_packed = dedup_key in seen_destinations or (case_insensitive and dedup_key.lower() in seen_lower) storage = file_entry.get("storage", "embedded") @@ -301,7 +306,8 @@ def generate_pack( if already_packed: continue seen_destinations.add(dedup_key) - seen_lower.add(dedup_key.lower()) + if case_insensitive: + seen_lower.add(dedup_key.lower()) file_status.setdefault(dedup_key, "ok") instructions = file_entry.get("instructions", "Please provide this file manually.") instr_name = f"INSTRUCTIONS_{file_entry['name']}.txt" @@ -326,7 +332,8 @@ def generate_pack( else: zf.write(tmp_path, full_dest) seen_destinations.add(dedup_key) - seen_lower.add(dedup_key.lower()) + if case_insensitive: + seen_lower.add(dedup_key.lower()) file_status.setdefault(dedup_key, "ok") total_files += 1 else: @@ -401,7 +408,8 @@ def generate_pack( if already_packed: continue seen_destinations.add(dedup_key) - seen_lower.add(dedup_key.lower()) + if case_insensitive: + seen_lower.add(dedup_key.lower()) extract = file_entry.get("extract", False) if extract and local_path.endswith(".zip"): @@ -437,7 +445,7 @@ def generate_pack( if full_dest in seen_destinations: continue # Skip case-insensitive duplicates (Windows/macOS FS safety) - if full_dest.lower() in seen_lower: + if full_dest.lower() in seen_lower and case_insensitive: continue local_path, status = resolve_file(fe, db, bios_dir, zip_contents) @@ -449,7 +457,8 @@ def generate_pack( else: zf.write(local_path, full_dest) seen_destinations.add(full_dest) - seen_lower.add(full_dest.lower()) + if case_insensitive: + seen_lower.add(full_dest.lower()) core_count += 1 total_files += 1 @@ -479,10 +488,11 @@ def generate_pack( src = os.path.join(root, fname) rel = os.path.relpath(src, local_path) full = f"{dd_prefix}/{rel}" - if full in seen_destinations or full.lower() in seen_lower: + if full in seen_destinations or full.lower() in seen_lower and case_insensitive: continue seen_destinations.add(full) - seen_lower.add(full.lower()) + if case_insensitive: + seen_lower.add(full.lower()) zf.write(src, full) total_files += 1