Commit Graph
131 Commits
Author SHA1 Message Date
Abdessamad Derraz 3164a815bc fix: confirm the backup holder after writing
Between the check and the creation of the run folder, retrobios-backup could be swapped for a link. The holder's device and inode are confirmed unchanged once the run folder exists. Directory file descriptors would close the window entirely but do not exist on Windows; the remaining window is the instant between that confirmation and the move.
2026-10-22 14:10:30 +02:00
Abdessamad Derraz a2b98af88e fix: never reuse a backup folder of another run
When every dated name in retrobios-backup already existed, the loop ended on the last one and wrote into it. It now raises, so the next location is tried and the file stays in place if none works. A holder another user owns is refused on systems with user ids.
2026-10-22 14:09:19 +02:00
Abdessamad Derraz cdaf4f4ea1 fix: never write a backup through a link
A BIOS folder can sit on a share other people write to. A retrobios-backup that is a link is no longer written through (the backup goes inside the BIOS folder instead), run folders are created for the user only and carry a marker, and --restore only takes a folder holding that marker, walking it without following links. Beginner pages label their links to the installer page as details.
2026-10-22 14:07:13 +02:00
Abdessamad Derraz 468b5e1d3e feat: keep a replaced BIOS file beside its folder
A file in place whose contents differ (another revision, a personal
dump) was overwritten and lost. It is now moved to
retrobios-backup/<date-time>/ beside the folder written to, under the
same path, before the verified copy replaces it. Beside, not inside:
DuckStation, SwanStation and Rustation read every file of the BIOS
folder and BizHawk walks its firmware folder recursively.

Identical files are never kept. --dry-run counts what would be kept,
the summary and the summary event name the folder, files and bytes,
and --restore FOLDER puts the files back. Data trees and standalone
copies keep their replaced files the same way.
2026-10-22 14:00:00 +02:00
Abdessamad Derraz 48a9a61819 feat: let the installer skip game data
install.py --no-game-data leaves out the files and omissions the manifest
marks game data, in an install, --check and --dry-run, and names them with
their category. The --events summary gains left_out, one group per
category with every destination. A list without categories is refused.
2026-10-22 06:19:10 +02:00
Abdessamad Derraz e05844e611 chore: merge the handheld port 2026-10-22 04:12:09 +02:00
Abdessamad Derraz 841017c887 chore: merge the minui family platforms 2026-10-22 04:09:17 +02:00
Abdessamad Derraz 43bdf83973 feat: add minui, nextui and myminui platforms
minarch hands every core SDCARD_PATH/Bios/<TAG> as its system directory
and opens no file in it. The scrapers read each pak's launch.sh (core,
tag, devices), each device's core makefile (the project a library is
built from: MyMinUI's dosbox_libretro.so is dosbox-pure) and the minarch
statement, at a pinned commit. The installer recognises the card from
.system/version.txt and refuses a folder inside it.
2026-10-22 04:04:36 +02:00
Abdessamad Derraz e7edae0101 chore: merge android retroarch folder per build
# Conflicts:
#	install.ps1
#	install.sh
2026-10-22 04:00:16 +02:00
Abdessamad Derraz 259fb14954 chore: merge the amberelec, emuelec, knulli lists
AmberELEC, PAN4ELEC and EmuELEC detection now installs their own lists
at /storage/roms, the root those lists are written against; KNULLI its
own list at /userdata/bios. JELOS, KOLOS, UnofficialOS and Arch R keep
RetroArch's list with the folder their retroarch.cfg names.
2026-10-22 03:58:48 +02:00
Abdessamad Derraz 65362e628f feat: add --events output to the installer
One JSON object per line on stdout (detection, per-file and per-system
check, download progress, summary, exit code) and the usual text on
stderr, so a program driving install.py never parses prose. EVENT_KEYS
is the one schema. The installer page documents it, and a test holds the
two equal. The handheld port reads it.
2026-10-22 03:58:02 +02:00
Abdessamad Derraz 2071abf766 fix: resolve Android RetroArch folder per build
The Google Play and retroarch.com builds share com.retroarch and com.retroarch.aarch64 but build their defaults under different roots (RetroArch v1.22.2 MainMenuActivity.java:182-183). The build is told by the version code it records in retroarch.cfg, else by the folder it wrote. A Google Play folder Termux cannot write is named, as for DraStic and Flycast.
2026-10-22 03:52:19 +02:00
Abdessamad Derraz d488b14a7f feat: detect knulli, amberelec and emuelec
KNULLI keeps its markers and now installs its own list. AmberELEC is
found by NAME in os-release (its ID is coreelec), EmuELEC by ID.
2026-10-22 03:42:25 +02:00
Abdessamad Derraz 43bb0c9b29 feat: name Android BIOS folders out of reach
DraStic keeps its BIOS in its private data and Flycast in Android/data,
which Termux cannot write on Android 11 and later. An installed one is now
named with the files not copied, and a writable Flycast folder is a
standalone copy target.
2026-10-22 03:38:04 +02:00
Abdessamad Derraz 05d8f944a9 docs: cite RetroArch v1.22.2 for Android detection 2026-10-22 03:34:39 +02:00
Abdessamad Derraz 8dd463933e feat: follow a RetroDECK bios folder moved alone
RetroDECK moves each of its folders on its own and records the new place
in retrodeck.json paths (api_data_processing.sh:913-935). Only
rd_home_path was read, so files went to <home>/bios after a move.
2026-10-22 03:32:14 +02:00
Abdessamad Derraz e27a583975 feat: detect handheld systems by their own files
AmberELEC, EmuELEC, JELOS, KOLOS, UnofficialOS, ArchR, PAN4ELEC, dArkOS,
RetroOZ, spruceOS, CrossMix-OS, Onion, Allium, Koriki, MiyooCFW and plumOS
are found by what their builds write, named as they name themselves, and
installed to the system_directory of their RetroArch config, which follows
ArkOS and dArkOS to a second card. TrimUI stock, MinUI and a plumOS build
without a known folder are named and not installed to. Two unrelated
systems matching stop a run without a terminal.
2026-10-22 03:29:41 +02:00
Abdessamad Derraz ef69687fe1 fix: replay held omissions in install regions
The builder keeps a held regional fallback when the requested file is
missing (since 2026-10-17), and the comment beside the manifest's
omissions still said the opposite. A file the builder holds but the
manifest cannot download sat in omitted_files counted unheld, so the
installer kept a fallback the pack drops. Such an omission now carries
held: true and narrow() counts it held, as the builder does.
2026-10-21 11:18:53 +02:00
Abdessamad Derraz fd1d1b7b96 chore: merge round 2 fixes (pins)
# Conflicts:
#	install.ps1
#	install.sh
2026-10-21 10:31:09 +02:00
Abdessamad Derraz ce1f165d2f chore: merge round 2 fixes (tests)
# Conflicts:
#	install.ps1
#	install.py
#	install.sh
2026-10-21 10:29:19 +02:00
Abdessamad Derraz 10dc9a11ac feat: accept ISO country codes for --region
jp, us, kr and gb were aliases but au was unknown, and the first
spelling offered for it was auto, which means world. Every territory
of the region tree now answers to its ISO 3166-1 code, in the build
scripts and in the installer, whose SHA-256 is pinned again.
2026-10-21 10:12:07 +02:00
Abdessamad Derraz 26a0717601 feat: offer winget when windows lacks python
Without Python, install.ps1 at a console now offers to run winget install Python.Python.3.12, rereads PATH from the registry and carries on. The Store's python.exe placeholder fails the version check like a missing Python.
2026-10-21 10:07:33 +02:00
Abdessamad Derraz d63c881648 chore: drop label comments across scripts
CommentsSayWhy read three scripts while 22 comments in 13 other files
named the next statement. They are removed or replaced by the reason,
and the test reads every tracked script and install.py.
2026-10-21 10:06:39 +02:00
Abdessamad Derraz 7cebbfe2ec feat: fill standalone emulator folders
With no platform detected, a machine running standalone emulators (ES-DE with DuckStation and PCSX2) was offered RetroArch's folder. The installer now fills the emulator folders of the standalone copies list that exist here, from the EmuDeck then RetroArch file lists, asking first at a terminal.
2026-10-21 10:03:58 +02:00
Abdessamad Derraz 0b0480a121 fix: name standalone folders instead of skipped
Every install ended on 'Standalone copies skipped', on machines with no standalone emulator as on one whose DuckStation lacked its BIOS. The line now lists the emulator folders that exist here, and nothing is said when there are none.
2026-10-21 10:02:15 +02:00
Abdessamad Derraz ff8a390ce6 fix: say when --dest does not exist
A mistyped --dest was created with every missing parent and reported done. The run now names the missing folder and the nearest one that exists, asks at a terminal before creating more than one level, and prints the folder it created. The free-space check now runs before the folder is made and ends with 2, nothing installed.
2026-10-21 10:01:34 +02:00
Abdessamad Derraz 6c4f056f08 fix: keep the listing in the no-platform hint
--list-systems, --list-cores, --list-emulators and --list-targets with nothing detected were answered with an install command that dropped the listing and added --dest. The hint now names the platform and keeps the listing.
2026-10-21 10:00:07 +02:00
Abdessamad Derraz 5e4d9199c2 feat: accept platform system names in --system
The manifest now carries system_names, each system's native_system names from the platform's own file, and --system, its suggestions and --list-systems read them: --platform batocera --system psx installs sony-playstation.
2026-10-21 09:59:25 +02:00
Abdessamad Derraz 10c94369df fix: no sudo advice for a read-only mount
EROFS was advised like a permission refusal, and sudo fails the same way on a read-only mount. The advice now reads the mount flag and says to check and remount the card or drive.
2026-10-21 09:54:55 +02:00
Abdessamad Derraz 730f900ff5 fix: detect emudeck on macos
EmuDeck's macOS build reads ~/.config/EmuDeck/settings.sh like the Linux one (functions/all.sh:3-4,24 and vars.sh:2 at dddb3022). The settings and ~/Emulation/bios rules now run on darwin too.
2026-10-21 09:53:37 +02:00
Abdessamad Derraz 35b4cacb5d chore: merge audit fixes (installer)
# Conflicts:
#	install.ps1
#	install.sh
2026-10-21 06:02:02 +02:00
Abdessamad Derraz 1c4686ab93 feat: place RomM firmware by its own template
RomM 5.4 reads each platform's firmware where filesystem.structure.firmware
in config.yml says, bios/{platform} by default, and suggests {platform}/bios
for a {platform}/roms library (rommapp/romm 5.4.0,
backend/config/config_manager.py:58,101-109,205-225,564-568,1105-1124).
The installer only wrote bios/<platform>/. It now reads the template from
config.yml beside the library, takes --romm-firmware when that file is
elsewhere, refuses a platform-first library with no template, and detects
RomM by /romm/config/config.yml too.
2026-10-21 05:53:23 +02:00
Abdessamad Derraz 43c6df58ee chore: merge audit fixes (region)
# Conflicts:
#	install.ps1
#	install.sh
2026-10-21 05:48:59 +02:00
Abdessamad Derraz 89c533e9ba fix: detect Batocera and Knulli by build files
No Batocera build writes /etc/batocera-version: batocera-system.mk:21-22
(batocera.linux 38845725, unchanged since batocera-30) writes
/usr/share/batocera/batocera.version. Knulli (knulli-linux 57afa662) adds
OS_NAME=knulli to os-release, writes /usr/share/knulli/knulli.version and
removes /usr/share/batocera, and no Knulli source writes /etc/knulli-release.
Neither was detected. A Knulli board is named and not narrowed by
Batocera's per-board lists, and an unlisted board is named.
2026-10-21 05:44:27 +02:00
Abdessamad Derraz edda080c59 fix: read muOS RetroArch from its own config
muOS runs RetroArch on a config copied from its default, which reads
/run/muos/storage/bios, bound to MUOS/bios on the second card when that
card holds one, and loads cores from /opt/muos/share/core (MustardOS/internal
f41f4a89, script/control/retroarch.sh:8-20, script/device/bind.sh:116-150,
retroarch.default.cfg:2806,3151). The installer wrote to /mnt/mmc/MUOS/bios
and --installed-cores found no core. The config now decides both.
2026-10-21 05:35:45 +02:00
Abdessamad Derraz 15cb52d551 fix: find EmuDeck Windows where its scripts look
functions/all.ps1:4-14 (emudeck-we 037460ef) reads the APPDATA
settings.ps1, else the one under the profile, and takes C:\Emulation when
neither names a folder. Only the first was read and a forced platform fell
back to %USERPROFILE%\Emulation\bios. A network install names its share
through $VolName (JSONtoPS1.ps1:166-172), and a UTF-16 settings file is
decoded.
2026-10-21 05:31:35 +02:00
Abdessamad Derraz cdb2cfa6f0 feat: find RetroBat through the folder it records
RetroBat.exe writes its folder to HKCU\SOFTWARE\RetroBat
LatestKnownInstallPath on every start (retrobat-executable 702da66a,
Program.cs:57 and 99, RegistryTools.cs:15-50). Only C:\RetroBat and the
profile folder were looked at, so an install on D: was missed and a forced
--platform retrobat wrote into C:\RetroBat\bios. The value is read
through winreg, or reg.exe under WSL, before the fixed folders.
2026-10-21 05:28:35 +02:00
Abdessamad Derraz 4f20b5daaf fix: name the network when every transfer fails
A run whose downloads were all cut ended on "Location that was being
written to" and "once that is resolved", pointing at the disk. A
failure caused by the connection (lookup, reset, timeout, TLS, a cut
transfer, HTTP 5xx or 429) is now marked as such, and the summary says to
check the connection and HTTPS_PROXY.
2026-10-21 05:25:19 +02:00
Abdessamad Derraz 253a41ebc8 feat: list the names --emulator accepts
An unknown --emulator name pointed at --list-cores and counted 441 names
while --list-cores prints 189: the buildbot names --emulator accepts
(mednafen_psx for beetle_psx) were listed nowhere. --list-emulators prints
each accepted name beside the emulator it stands for, and the hint names
it.
2026-10-21 05:22:08 +02:00
Abdessamad Derraz 7bcd41e0c4 fix: let taiwan and asia-ntsc answer each other
kronos tags the ST-V BIOS epr-19854.ic8 taiwan, mednafen_stv tags it
asia-ntsc, the SMPC area Mednafen names for Taiwan (ss.cpp:1119,
2363-2364). As siblings under asia they never matched, so a request in
one spelling dropped the file tagged in the other, and --region
taiwan,us dropped the Saturn sega_101.bin. AREA_TERRITORIES relates
each area to the territory it serves, china for asia-pal included, in
region.py and its installer copy.
2026-10-21 05:20:08 +02:00
Abdessamad Derraz 8a19d647a8 fix: pass -v and every short flag to install.py
A [Parameter()] attribute made install.ps1 an advanced script: its common
parameters took -v (-Verbose), -vb, -d and -ea before install.py saw them,
and the scriptblock form printed PowerShell's own VERBOSE lines. The
wrapper now forwards $args as typed.
2026-10-21 05:16:52 +02:00
Abdessamad Derraz 1392f00c8d fix: replace a link at a standalone copy's name
A link already at the destination was skipped without a word and counted
as "dir not found" while the folder existed, so the emulator kept the file
the link pointed at. The link now gives way to the file, written beside it
and renamed over the name, and a name leading out of the folder is a named
failure.
2026-10-21 05:16:16 +02:00
Abdessamad Derraz 9b1d378d2f fix: never truncate a copy another run renames
On Windows a verified partial copy is closed before its rename. A second
run that claimed it in that moment truncated it and the first rename failed
with a sharing violation, reported as an unwritable folder. A complete
partial is now left whole there, the rename waits for a sharing violation
to clear, and a sharing violation no longer reads as a refused folder.
2026-10-21 05:16:12 +02:00
Abdessamad Derraz c638c12ca8 fix: replay the builder's held and one-file groups
install.region_drops now skips one-file groups (:file:) and lets no
omitted match displace an installable file, as region.resolve_region_drops
does on the builder side. The property test draws both cases and
compares against the builder.
2026-10-21 05:15:56 +02:00
Abdessamad Derraz 82acd55ebc fix: guide installer users with their own command
Names are matched on letters and digits, so the site's display names
work, and a typo gets the closest names instead of a full list. Hints
and advice give back the command the user ran (curl or PowerShell form,
every flag kept), --dest alone follows detection and says whose list it
installs, Ctrl+C at a question exits 130, and --cores-dir names a core
folder. install.ps1 runs in its own scope so irm | iex leaves the
session alone, and an override that causes a fingerprint mismatch is
named. --check lists hash mismatches first, missing required files are
grouped by system, and --help ends with examples.
2026-10-21 04:47:50 +02:00
Abdessamad Derraz 392aacb207 fix: hash a large download through its own handle
On Windows the partial copy of a file of 16 MB or more is locked with msvcrt.locking, a LockFile region: the locking process cannot access that region through a second handle (Microsoft LockFile remarks). Hashing reopened the path, the read failed with a sharing violation, and every large file was reported as 'folder not writable' (issue 82). Both digests are now read in one pass through the handle that holds the lock. A read-only file already at the destination had the same misleading report: on Windows its attribute is now cleared before the verified copy replaces it, and a refusal that remains is named for what it is.
2026-10-21 03:46:14 +02:00
Abdessamad Derraz e424a35aee feat: install one emulator's files in one command
install.py --emulator NAME keeps what the named emulators read on the detected platform: their own files and the platform's files of the systems they run, as a pack built for them carries, without the systems no core is mapped to. Each emulator page now gives that command for Linux, macOS and Windows, beside the per-file links.
2026-10-20 09:09:05 +02:00
Abdessamad Derraz d087caec40 fix: a refused standalone copy is named
A copy refused by a read-only emulator folder raised the error count with no failures entry: the summary named no file, gave the BIOS folder as the location and no advice. The failure now carries its path, and the summary names the emulator folder and what to do.
2026-10-20 04:41:18 +02:00
Abdessamad Derraz 4603b6ec77 fix: the check names files it cannot supply
--check counted the required files the list leaves out and named none, then said all files were up to date. A Recalbox user asking why Caesar III would not start learned nothing, though the list names c3.555. The count line no longer calls a file not found unsafe.
2026-10-20 04:41:08 +02:00
Abdessamad Derraz 9e8229c07a fix: a resumed download is not counted as speed
The live line divided every byte by the run's time, a partial copy left by an earlier run included, and showed a 3 GB resume as 2.5 GB/s with nothing left.
2026-10-20 04:40:52 +02:00