fix: keep bundled game data out of missing

verify counted game data installed with its emulator as missing, which cross_reference files as bundled: 24 of Batocera's 427. Bundled firmware already left the lists, and the line naming it never printed. Every bundled entry is now counted on that line, required firmware named and the rest under --verbose.
This commit is contained in:
Abdessamad Derraz committed 2026-11-06 08:50:29 +01:00
1 parent 9a805fd240
commit 46a4a26a54
2 files changed
+45 -8

No files matched your search

+18 -8
View File
@@ -1845,6 +1845,13 @@ def _print_undeclared_section(result: dict, verbose: bool) -> None:
game_data, bios_files, unplaced = _split_undeclared(undeclared)
# A file installed with its emulator is never collected, firmware or
# game data, required or not: cross_reference counts it apart. The
# firmware already left the pack lists (_mark_unplaced), the game data
# did not, and Abuse's three bundled data files read as missing.
bundled = [u for u in undeclared if not u["in_repo"] and u.get("bundled")]
game_data = [u for u in game_data if u["in_repo"] or not u.get("bundled")]
req_not_in_repo = _core_required_missing(bios_files)
req_hle_not_in_repo = [
u
@@ -1854,12 +1861,6 @@ def _print_undeclared_section(result: dict, verbose: bool) -> None:
req_in_repo = [u for u in bios_files if u["required"] and u["in_repo"]]
opt_in_repo = [u for u in bios_files if not u["required"] and u["in_repo"]]
opt_not_in_repo = [u for u in bios_files if not u["required"] and not u["in_repo"]]
bundled = [
u for u in bios_files
if u["required"] and not u["in_repo"] and u.get("bundled")
and not u.get("hle_fallback")
]
# The builder's count, one file per pack path, when the platform pass
# replayed it. Counting entries said 1130 for RetroArch, 48 more than the
# pack holds: rom.key alone was claimed by three Amiga cores.
@@ -1886,8 +1887,17 @@ def _print_undeclared_section(result: dict, verbose: bool) -> None:
for u in opt_not_in_repo:
_print_undeclared_entry(u, "MISSING (optional)", verbose, repeated)
if bundled:
names = ", ".join(sorted({u["name"] for u in bundled}))
print(f" Bundled with their emulator, not collected: {names}")
# The required firmware is named, as a missing one would be; the
# rest (shaders, runtime libraries, engine data) on request.
shown = bundled if verbose else [
u for u in bundled
if u["required"] and u.get("category", "bios") != "game_data"
]
names = ", ".join(sorted({u["name"] for u in shown}))
print(
f" Bundled with their emulator, not collected: {len(bundled)}"
+ (f" ({names})" if names else "")
)
if unplaced:
print(f" Core files held but not packed: {len(unplaced)} "
f"({_omission_reasons(unplaced)})")
+27
View File
@@ -200,6 +200,33 @@ class EveryGapCountedIsNamed(unittest.TestCase):
self.assertIn("MISSING (game data): engine needs level.dat", verbose.getvalue())
class BundledGameDataIsNotMissing(unittest.TestCase):
"""cross_reference put Abuse's abuse.lsp, defaults.prp and english.lsp
under bundled while verify called them missing game data: 24 of the 427
Batocera counted."""
def test_bundled_game_data_is_counted_apart(self):
import contextlib
import io
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import verify # noqa: PLC0415
result = {"undeclared_files": [
{"name": "abuse.lsp", "emulator": "Abuse", "required": True,
"in_repo": False, "category": "game_data", "bundled": True,
"in_pack": False},
{"name": "level.dat", "emulator": "engine", "required": True,
"in_repo": False, "category": "game_data"},
]}
with contextlib.redirect_stdout(io.StringIO()) as out:
verify._print_undeclared_section(result, verbose=True)
self.assertIn("Game data: 0 in pack, 1 missing", out.getvalue())
self.assertNotIn("needs abuse.lsp", out.getvalue())
self.assertIn("Bundled with their emulator, not collected: 1 (abuse.lsp)",
out.getvalue())
class CoreCopiesWithoutAGapEntryAreCounted(unittest.TestCase):
"""verify --platform recalbox --system nec-pc-engine printed no Core
files line while the pack held six geargrafx syscard copies: the gap