Commit Graph
923 Commits
Author SHA1 Message Date
Abdessamad Derraz b11c8b0638 fix: keep the agnostic scan inside its own tree
A filename-agnostic core accepts any name for its BIOS, so the builder
scans the directory holding the candidates. It picked that directory
from a first-hit lookup by name, the one piece of evidence that lands
in another emulator's tree: five files answer to GameIndex.yaml and one
belongs to an Android package, rom1.bin is a PS2 ROM and a Roland
SC-55 ROM. One wrong match became every file beside it, flattened into
the BIOS root of platforms that do not run that emulator: 45 files in
the Recalbox pack, 170 in the RetroArch one.

Four things decide it now. A destination and the repo layout meet on a
tail, so the path index is tried from the longest tail down and never
to the bare filename; that alone corrects seven files, among them the
Japanese GameCube slot, which held the US dump. A seed has to declare
the shape it is looking for, since no shape means the whole directory.
An ambiguous name needs the profile's other files to agree before the
scan walks anywhere. What the scan emits carries the SHA-1 it selected,
so packing never resolves it by name again.
2026-08-12 07:23:23 +02:00
Abdessamad Derraz b33d045175 fix: group region candidates once for both sides
The builder and the coverage report each grouped their own candidates
before asking which regional alternatives to withdraw. The builder
grouped the platform files and the core extras; the report grouped the
platform files alone, and keyed them on an unsanitized destination.

So a region run withdrew 73 files from a recalbox pack while the report
withdrew 14, and described the other 59 as covered by a pack that would
not carry them.

platform_region_groups builds the grouping once and both sides read it.
The extras it returns are keyed by emulator, name and path: Dolphin
declares three IPL.bin that differ by path alone, and a name-keyed map
withdraws the wrong one. Manifests are byte-identical before and after.
2026-08-12 06:43:47 +02:00
Abdessamad Derraz 7a84764348 feat: collect the marp score tables 2026-08-12 06:14:51 +02:00
Abdessamad Derraz 34619c778f fix: publish target aliases and refuse an unknown one
The pack builder accepts the aliases declared in the target overrides,
so --target switch works there, but the installer's target manifests
carried only canonical names. The documented word was the one that
failed, and the installer then carried on with every file: 1911 files
and 4.1 GB where the user had asked for the 863 that target needs.

Aliases are emitted beside their canonical target, and an unknown
target now stops the run and lists what is available. A filter is
applied or refused, never ignored.
2026-08-12 06:13:21 +02:00
Abdessamad Derraz 97f7cc1738 feat: collect the scph-90006 board dump 2026-08-12 06:13:10 +02:00
Abdessamad Derraz 2a320a1ade feat: collect the spectrum next firmware 2026-08-12 06:09:19 +02:00
Abdessamad Derraz 52ace172b4 chore: refresh database, manifests and readme
The findable gap moves from five to nine: the files the builder drops
under a digest mode are reported absent instead of counted as held.
2026-08-12 05:52:37 +02:00
Abdessamad Derraz 50b22d34fc feat: build the 3ds client certificate from a console otp 2026-08-12 05:38:37 +02:00
Abdessamad Derraz f998f4d77a fix: judge core extras by content where the builder does
The gap analysis answered from the name index, so a core extra whose
local copy contradicts its declared hash counted as held. Under a
digest mode the builder drops exactly that file, so the coverage report
described a pack that would not contain it: seven files across
Batocera, Recalbox and RetroBat.

An entry that states what its content should be is now resolved by
content; the name still answers for entries that declare nothing to
check against, and existence mode is unchanged because there the
frontend never opens the file and the pack does carry it.
2026-08-12 05:38:16 +02:00
Abdessamad Derraz b28f8d12a3 feat: report unsourceable entries apart from gaps
The per-emulator report counted an entry nobody can supply -- a
per-user key, a slot the user fills, a dump that was never made -- as
plainly missing. fpse-ng read 14 missing when twelve were documented as
unobtainable, which invites the wrong repair: dropping the flag,
deleting the entry, or chasing a vendor's whole install tree.

They are listed with the reason the profile records rather than hidden,
and the summary counts them apart. Platform reports are untouched.
2026-08-12 05:20:25 +02:00
Abdessamad Derraz 221ca93dbf feat: collect the famicom network kanji rom 2026-08-12 05:14:44 +02:00
Abdessamad Derraz 4a9269ae0e feat: collect the nes palettes and the gngeo data 2026-08-12 05:12:52 +02:00
Abdessamad Derraz f097184b00 fix: stop counting a contradicted hash as covered
The per-emulator report captured the status resolve_local_file returns
and then ignored it: any non-empty path became OK. An entry whose only
candidate contradicts its declared hash therefore read as covered, so a
same-named file from another system stood in for one the collection
does not hold. 36 entries across 14 profiles were affected, among them
config.ini, ROM and rom2.bin, names that collide across systems.

Emulator validation still runs first, since it names the field that
disagrees; the resolution status is consulted only when validation had
nothing to say.
2026-08-12 04:21:54 +02:00
Abdessamad Derraz 0efd4f34ce feat: collect the msx machine configurations 2026-08-12 04:19:38 +02:00
Abdessamad Derraz e325b84174 feat: derive the switch console keys from the held dump 2026-08-12 04:10:32 +02:00
Abdessamad Derraz 88fc667106 feat: collect the arcade audio samples and the console keys 2026-08-12 03:49:12 +02:00
Abdessamad Derraz 45ced32598 docs: drop tooling references from test docstrings
Three docstrings pointed at a contributor-guide file that is not part
of the repository. The rules they describe are stated directly now.
2026-08-12 03:44:25 +02:00
Abdessamad Derraz a0d34f04ad feat: collect the naomi 2 and dragon alpha boot roms 2026-08-12 03:16:00 +02:00
Abdessamad Derraz 1fd5f40ef6 feat: add six emulator profiles 2026-08-12 03:15:05 +02:00
Abdessamad Derraz 87117a3e8f feat: collect naomi2 and dragon alpha boot roms 2026-08-12 03:15:05 +02:00
Abdessamad Derraz 2114c62b0b chore: refresh the mame4droid hiscore data 2026-08-12 03:15:05 +02:00
Abdessamad Derraz 7c043475cd feat: follow mame clones in the gap analysis 2026-08-12 03:15:05 +02:00
Abdessamad Derraz b86a34933c feat: parse gamel machines and computed sizes 2026-08-12 03:15:05 +02:00
Abdessamad Derraz ac9ce4d2cc feat: realign prose refs across fourteen profiles 2026-08-12 03:11:47 +02:00
Abdessamad Derraz 6719aa415d feat: anchor prose citations beside source refs 2026-08-12 03:11:47 +02:00
Abdessamad Derraz 48a432d79c feat: collect the game genie rom in both loader forms 2026-08-12 01:43:35 +02:00
Abdessamad Derraz ef449ed12f feat: collect ten ps2 board dumps 2026-08-12 01:38:26 +02:00
Abdessamad Derraz 4b9c89466a feat: serve the cmd drive roms under the vice names 2026-08-12 01:35:12 +02:00
Abdessamad Derraz bd8fb75722 feat: collect three coh-h board dumps 2026-08-12 01:32:13 +02:00
Abdessamad Derraz 1251589940 chore: drop the unsourceable flag on collected files 2026-08-12 01:17:07 +02:00
Abdessamad Derraz 5bae72bcae feat: collect the vita patch list 2026-08-12 01:16:40 +02:00
Abdessamad Derraz a47d3a7efe feat: collect the applewin resource roms 2026-08-12 01:12:10 +02:00
Abdessamad Derraz 8c0de8f91c feat: collect the wii nand backup 2026-08-12 01:10:54 +02:00
Abdessamad Derraz eece892a73 feat: collect the ps4 system modules and the mame support data 2026-08-12 01:07:44 +02:00
Abdessamad Derraz d0395f4226 feat: collect the xbox dashboard tree and the eeprom 2026-08-12 00:55:24 +02:00
Abdessamad Derraz 2fcde58db0 feat: collect the amiibo keys and the driver libraries 2026-08-12 00:49:40 +02:00
Abdessamad Derraz b120528dd7 test: cover the native format exporters
export_native turns the profile data back into each platform's own
file, for a maintainer there to pick up and use, and none of the ten
exporters had a test. Coverage goes from 0 to 83%.

Writing them found the EmuDeck exporter rejecting its own output: its
export skips placeholder entries, its validate looked for them anyway
and reported the omission as a missing hash. Both sides apply the same
filter now.

The placeholder assertion initially passed for the wrong reason twice
over -- the fixture entry had no hash, so it was dropped as incomplete
rather than as a placeholder, and the assertion then read the name
while the exporters write the path. It is pinned on an unmistakable
destination now, and removing the guard fails two tests.
2026-08-12 00:46:04 +02:00
Abdessamad Derraz fa5b1130ec chore: drop the unsourceable flag on the vita databases 2026-08-12 00:35:14 +02:00
Abdessamad Derraz 69d0c7ad85 chore: drop a same-named file from another project 2026-08-12 00:35:06 +02:00
Abdessamad Derraz 1ea547255d feat: collect the soundfonts and the controller database 2026-08-12 00:33:51 +02:00
Abdessamad Derraz 50dd523493 chore: refresh database, manifests and readme 2026-08-11 20:42:36 +02:00
Abdessamad Derraz b24c5cdb91 feat: refine eighteen profiles and drop a duplicate
cheat.zip under mame4droid was byte-identical to the Arcade copy and
resolves by hash from there.
2026-08-11 20:30:27 +02:00
Abdessamad Derraz b5f28d7b7f chore: drop three reads whose result went nowhere
The requirement parser read core, hashMatchMandatory and note from
each bios element and discarded all three, which reads like a dropped
attribute: hashMatchMandatory decides whether a wrong hash is yellow or
red on Recalbox. It is not lost -- the config parser below captures it
for the YAML -- so these were leftovers, and they cost a look to
confirm that.

Two yaml imports left unused by the move to the shared loader go too.
2026-08-11 20:27:53 +02:00
Abdessamad Derraz e6813aaa60 feat: collect the vita compatibility data and the arcade history 2026-08-11 20:20:18 +02:00
Abdessamad Derraz 0a941acc43 refactor: split the site validator into its two passes
validate_site reached complexity 43 doing three things at once. The
per-page checks and the link resolution are now separate functions and
the caller keeps only the cross-page duplicate check, which cannot run
until every page has been seen.

The first attempt left the link pass calling a closure that had moved,
and running it against the real site did not catch that: no page there
has a broken link, so the error path never ran. The unit test covering
a deliberately broken fragment did.
2026-08-11 20:16:11 +02:00
Abdessamad Derraz 00f10b0379 refactor: extract rename matching from the truth diff
_diff_system reached complexity 42, and its hash-based rename fallback
is the part that stands alone: a platform is free to call a file
whatever it likes, so a name matching nothing is not yet a gap, and
counting one file as both missing and extra invents a discrepancy.

That step is now its own function at complexity 31, with the tests it
never had: pairing on any of the three digests, case folding, non-string
values, and the case where two files simply have no hashes and so are
not evidence of anything. diff_truth output is unchanged.
2026-08-11 19:54:45 +02:00
Abdessamad Derraz 7a9e227e95 feat: collect the archiver libraries for xm6 2026-08-11 19:44:19 +02:00
Abdessamad Derraz faff5c08bd feat: collect the amstrad roms and the mame4droid data 2026-08-11 19:38:39 +02:00
Abdessamad Derraz e66a89d1be feat: collect the trs-80 rom images and the ines assets 2026-08-11 19:33:32 +02:00
Abdessamad Derraz 826e8c0c01 feat: collect the fpse plugins and the apple iie keyboard rom 2026-08-11 19:29:30 +02:00