Commit Graph
879 Commits
Author SHA1 Message Date
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
Abdessamad Derraz fec53f7a20 chore: refresh database, manifests and readme
Regenerated with the large-file cache populated, the state CI builds
from: without it ten preserved entries resolve differently and the
counts drift by one file.
2026-08-11 19:28:08 +02:00
Abdessamad Derraz 2df67ba204 feat: collect the epsxe shader packs 2026-08-11 19:21:00 +02:00
Abdessamad Derraz 4b8d7baac5 feat: transcribe bios search orders into priority 2026-08-11 19:18:30 +02:00
Abdessamad Derraz d862de9a2e feat: collect the drastic data files 2026-08-11 19:14:34 +02:00
Abdessamad Derraz d7da2d1645 feat: rebuild the a7800 bios archives from their recipes 2026-08-11 19:12:09 +02:00
Abdessamad Derraz cffb067a59 chore: refresh database, manifests and readme 2026-08-11 19:06:19 +02:00
Abdessamad Derraz 9dfe73d37a feat: collect the schweber demo unit image 2026-08-11 19:02:57 +02:00
Abdessamad Derraz 28643bef5b feat: collect the flash player runtime and the supercharger roms 2026-08-11 18:57:09 +02:00
Abdessamad Derraz f3d912f3d3 feat: profile five more emulators and refine seven 2026-08-11 18:54:15 +02:00
Abdessamad Derraz 9af958e9f8 feat: re-extract the j2me and arcade front-end assets
Bytes taken from the shipped applications rather than a normalised copy.
2026-08-11 18:54:15 +02:00
Abdessamad Derraz d28efae88c fix: stop git normalising preserved bytes
SHA1 is the primary key of this collection and there was no
.gitattributes, so git guessed. Git for Windows sets core.autocrlf=true
by default: a clone there rewrites every file git considers text,
meaning the shaders, .ini, .txt and .dat assets under bios/ arrive with
CRLF and a different hash from the one published. Verification then
fails on files nobody touched.

bios/ and data/ are exempt from normalisation, generated artefacts are
pinned to LF so a Windows checkout does not show them modified, and the
rule order is asserted rather than assumed.
2026-08-11 18:52:10 +02:00
Abdessamad Derraz 851b9c9e50 feat: collect the bam runtime and its tracking libraries 2026-08-11 18:41:44 +02:00
Abdessamad Derraz 4ecb65b8d9 fix: keep the mame clone map across runs
A clone group is only visible while both copies are on disk, and the
run then deletes the clone, so writing only what this run saw erased
every mapping an earlier run had recorded. One real run took the map
from 69 entries to 1, and the canonical zips silently stopped answering
to the names they stand in for.

The map is merged now, the 68 lost entries are restored, and the one
whose canonical file is no longer in the collection is dropped.
2026-08-11 18:41:04 +02:00
Abdessamad Derraz 8c018849ae fix: return instead of continue in the split profile
The cross-reference loop body became its own function, but one exit
stayed a continue and left the module unparseable, which took the whole
test suite down with it. The other ten continues are inside genuine
inner loops and stand.

Output verified identical to the version before the split.
2026-08-11 18:41:04 +02:00
Abdessamad Derraz 6e5b15911f chore: drop the unsourceable flag on collected files 2026-08-11 18:12:59 +02:00
Abdessamad Derraz 837ea786b0 refactor: separate the dedup decision from the deletion
deduplicate reached complexity 50 by mixing the question of which
copies may go with the work of removing them. The decision is now its
own function: same name in two directories is a true duplicate,
different names only collapse as MAME device clones, and anywhere else
each name may be the one some emulator looks for.

Verified against the real collection: both versions plan the same 99
removals.
2026-08-11 18:12:35 +02:00
Abdessamad Derraz 58ca2689f1 test: pin the rules dedup must not get wrong
dedup.py is the only script here that deletes BIOS files and it had no
tests: the sole guard was remembering --dry-run. These cover the
protected directories where two identical copies are both load-bearing,
the canonical choice between a primary and a variant, MAME zip clones
against same-content files that must keep every name, and that a dry
run reports exactly the plan the real run executes.

Disabling the NODEDUP guard fails four of them.
2026-08-11 18:10:20 +02:00
Abdessamad Derraz 6f93624a77 feat: collect the j2me runtimes and the smaf libraries 2026-08-11 18:09:15 +02:00
Abdessamad Derraz b5e6b68263 refactor: split the per-system platform sections
generate_platform_page reached complexity 49, most of it in the block
rendering one collapsible section per system: each file shows a
different set of hashes, sizes and provenance depending on what the
platform declares. That block is now its own function and the caller
sits at 28. All 534 pages identical apart from timestamps.
2026-08-11 18:07:57 +02:00
Abdessamad Derraz ae7256f56f refactor: split the cross-reference into its two views
generate_cross_reference rendered the same relation twice in one
function, once per platform and once per upstream, and reached
complexity 53. Each view is now its own function and the caller is a
pair of calls.

Verified by generating the site with both versions against the same
data: all 533 pages identical apart from timestamps, with a control run
of the same code twice to confirm the comparison had no drift in it.
2026-08-11 17:58:11 +02:00
Abdessamad Derraz 36a284b93b fix: name and announce every narrowed pack 2026-08-11 17:54:28 +02:00
Abdessamad Derraz bdf6bf6da0 feat: collect the mfme default assets 2026-08-11 17:52:04 +02:00
Abdessamad Derraz 2cf0f65b63 feat: collect future pinball and the j2me runtimes 2026-08-11 17:46:42 +02:00
Abdessamad Derraz c3074af6a9 feat: collect the ps2 bios companions and the paladin data 2026-08-11 17:34:22 +02:00
Abdessamad Derraz 5c61a30880 feat: collect the pcsx2 fonts and directx redistributables 2026-08-11 17:17:23 +02:00
Abdessamad Derraz 8a3c4ea2fb chore: refresh database, manifests and readme 2026-08-11 17:14:25 +02:00
Abdessamad Derraz 4eea2db101 feat: profile three java me front-ends 2026-08-11 16:56:20 +02:00
Abdessamad Derraz 4bd277a7be feat: name every narrowing in the pack filename 2026-08-11 16:56:20 +02:00
Abdessamad Derraz 5b0e6836de refactor: split the problem-files gap section
generate_gap_analysis reached complexity 56. Its problem-files section
is the one that stands alone -- it reads platform_problems and nothing
else -- so it becomes its own function and the caller drops to 43.

The neighbouring sections were tried too and put back: they share
gap_report and the resolved core list, so pulling them out turns a
render pass into an argument-threading exercise for no gain. Verified
by generating the site with both versions against the same data: 529 of
530 pages identical, the odd one a wiki page another run had edited.
2026-08-11 16:52:18 +02:00
Abdessamad Derraz e53f7dfafc test: cover the four 3DS unique-data verifiers
verify.py reaches these through a dynamic import and nothing exercised
them, so a signature check that accepted everything would have looked
exactly like one that worked.

Console dumps are personal data and cannot be committed, but the
verifiers only read structure and signatures: the fixtures are built
from the layouts in unique_data.cpp and otp.cpp, signing with a key the
test owns and passing the matching public key in through the keys file.
That covers the region-change detection in SecureInfo_A, the embedded
LFCS in movable.sed, and the OTP path down to the sect233r1 certificate
including the pre-v5 expiry endianness.

crypto_verify goes from 9 to 89 percent. Disabling the OTP hash check
and the movable.sed magic check each fails a test.
2026-08-11 16:31:35 +02:00
Abdessamad Derraz d37caecc27 test: cover slot naming and per-system extras 2026-08-11 16:06:20 +02:00
Abdessamad Derraz 80ea7f5764 chore: refresh database, manifests and readme 2026-08-11 16:05:57 +02:00
Abdessamad Derraz 627cc84a78 test: skip pack checks while a build holds dist
The pack integrity tests failed whenever another run was writing
dist/, reporting a corrupt archive when the only fact established was
that somebody else was building. Which test went red depended on how
far along that build was. They skip now, the way validate_schemas
already does.
2026-08-11 16:05:57 +02:00
Abdessamad Derraz ed0c44be4a feat: profile idtech4a++, ines and infinity 2026-08-11 15:56:45 +02:00
Abdessamad Derraz 694f2a74d0 fix: index emulator systems by display name too 2026-08-11 15:56:45 +02:00
Abdessamad Derraz 4b1ab7cb74 fix: separate findable gaps from unsourceable ones
The README said 14 files were 'not in the collection yet', which
implies somebody could still put them there. Nine of them cannot be:
WHDLoad.key is a per-user signed registration, Custom.dat and key.txt
are slots the emulator expects the user to fill, gpib.rom and
dragonfly-2.3.rom have never been dumped, CARTS.CRC belongs to a dead
code path. The profiles already record why, so the two are now counted
apart: five still to be found, nine that cannot be.
2026-08-11 15:56:26 +02:00
Abdessamad Derraz b890998a94 chore: refresh database, manifests and readme 2026-08-11 14:45:18 +02:00
Abdessamad Derraz a0abe939f9 feat: profile haku x 2026-08-11 14:40:33 +02:00
Abdessamad Derraz e97c1fbbcc fix: keep unsourceable files from matching homonyms 2026-08-11 14:40:33 +02:00
Abdessamad Derraz 94512b5acf fix: drop manifest entries with no download source
install.py fetches a file from its repo_path or from a release asset.
Resolution can land on a file the database does not index, and the
entry then shipped with neither: a line in the download list that can
only ever fail. Those are recorded as omitted instead, which is what
the installer already knows how to report, and a test holds the
committed manifests to it.

validate_schemas read dist/ while a build was writing it and reported
a half-written pack as 'File is not a zip file'. It takes the shared
lock --verify-packs uses, and says so when a build holds it.
2026-08-11 14:40:33 +02:00
Abdessamad Derraz 85f3f7c393 fix: read the bios preference order the code applies 2026-08-11 14:34:49 +02:00
Abdessamad Derraz 5e4b3048a6 feat: add the fpse-ng and gba-emu bundled assets
Both are declared by the profiles that load them.
2026-08-11 14:21:55 +02:00
Abdessamad Derraz 17b4537bde feat: profile sixteen android and pinball front-ends
ES-DE standalone batch: PSX, DS, GBA, GBC, Xbox, Dolphin and pinball
front-ends, each read from its own source or shipped binary.
2026-08-11 14:21:29 +02:00
Abdessamad Derraz a372f2abf3 feat: keep one bios per slot on declared order 2026-08-11 13:34:15 +02:00