chore: merge the full-screen installer

This commit is contained in:
Abdessamad Derraz committed 2026-10-23 16:13:00 +02:00
commit c2fff3a389
97 files changed
+6673 -16

No files matched your search

+18 -2
View File
@@ -213,9 +213,19 @@ jobs:
run: python3.9 -m pip install pyyaml "jsonschema[format-nongpl]==4.25.1"
# markdown: the site validation test renders a wiki line to prove the
# heading guard's premise, and skipped on every run without it.
# heading guard's premise, and skipped on every run without it. pyte
# reads the installer's full screen back in its end-to-end tests,
# hypothesis fuzzes its key decoder, and vermin holds install.py to 3.8.
- name: Install dependencies
run: pip install pyyaml "jsonschema[format-nongpl]==4.26.0" "markdown==3.10.2"
run: pip install pyyaml "jsonschema[format-nongpl]==4.26.0" "markdown==3.10.2" "pyte==0.8.2" "hypothesis==6.170.8" "vermin==1.9.2"
# The full screen also runs under the 3.8 floor: the end-to-end tests
# start install.py with the interpreter that runs them.
- name: Install the screen tests' dependency for Python 3.8
run: python3.8 -m pip install "pyte==0.8.2"
- name: Hold install.py to Python 3.8
run: vermin --no-tips -t=3.8- --violations install.py
# The site is built as deploy-site.yml builds it, from the lockfile.
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
@@ -257,6 +267,12 @@ jobs:
RETROBIOS_OFFLINE: "1"
run: python -m unittest discover -s tests -t . -v
- name: Run the full-screen interface tests on Python 3.8
if: ${{ !cancelled() }}
env:
RETROBIOS_OFFLINE: "1"
run: python3.8 -m unittest tests.test_install_tui -v
# deploy-site.yml runs this after the merge, and a dead link or a stray
# heading failed it there with nothing in front of it. Run whatever the
# suite returned, so one red step does not hide the other. The release
+1 -1
View File
@@ -11,7 +11,7 @@
$ErrorActionPreference = "Stop"
$defaultInstallUrl = "https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
$defaultInstallSha256 = "8cfe5cb80b8df7f8c2736cfe5855a768c3eacad6ebf5bfd7336b3b4f5a4d5d76"
$defaultInstallSha256 = "84ba56c9498a8bf89db4c4af8bd3413871f467771b36aea36158458aa4644ef8"
$maximumInstallerBytes = 2MB
$installerExit = 0
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
+2623 -9
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -18,7 +18,7 @@ esac
TEMP_INSTALLER=""
TEMP_DIRECTORY=""
DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
DEFAULT_INSTALL_SHA256="8cfe5cb80b8df7f8c2736cfe5855a768c3eacad6ebf5bfd7336b3b4f5a4d5d76"
DEFAULT_INSTALL_SHA256="84ba56c9498a8bf89db4c4af8bd3413871f467771b36aea36158458aa4644ef8"
MAX_INSTALLER_BYTES=2097152
cleanup() {
+5
View File
@@ -17,6 +17,11 @@ dependencies = [
dev = [
"jsonschema[format-nongpl]>=4.23",
"markdown>=3.7",
# The installer's full-screen tests: pyte reads the screen back,
# hypothesis fuzzes the key decoder, vermin holds install.py to 3.8.
"pyte>=0.8.2",
"hypothesis>=6.100",
"vermin>=1.9",
]
# The site is built by Astro Starlight from website/package.json and its
# lockfile (npm ci --prefix website): no Python package builds it.
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Browse for a folder
/home/user/.config/retroarch
> Use this folder
..
/media/user/SDCARD (NextUI card)
cores/
system/
A/Enter Use this folder B/Esc Back ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Browse for a folder
/home/user/.config/retroarch
> Use this folder
..
/media/user/SDCARD (NextUI card)
cores/
system/
A Use this folder B Back ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Browse for a folder
/home/user/.config/retroarch
> Use this folder
..
/media/user/SDCARD (NextUI card)
cores/
system/
A Use this folder B Back ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Browse for a folder
/home/user/.config/retroarch
> Use this folder
..
/media/user/SDCARD (NextUI card)
cores/
system/
A/Enter Use this folder B/Esc Back ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Checking
RetroArch: ~/.config/retroarch/system
File list: 5 files.
Reading the files already in the folder... 0:04
Ctrl-C Quit B/Esc Back
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Checking
RetroArch: ~/.config/retroarch/system
File list: 5 files.
Reading the files already in the
folder... 0:04
Ctrl-C Quit B/Esc Back
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Checking
RetroArch: ~/.config/retroarch/system
File list: 5 files.
Reading the files already in the
folder... 0:04
Ctrl-C Quit B/Esc Back
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Checking
RetroArch: ~/.config/retroarch/system
File list: 5 files.
Reading the files already in the folder... 0:04
Ctrl-C Quit B/Esc Back
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Command line
The same choice without questions:
python3 install.py --platform retroarch --dest /home/user/.config/retroarch/system --system
nintendo-gba
A/Enter Back
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Command line
The same choice without questions:
python3 install.py --platform
retroarch --dest
/home/user/.config/retroarch/system
--system nintendo-gba
A/Enter Back
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Command line
The same choice without questions:
python3 install.py --platform
retroarch --dest
/home/user/.config/retroarch/system
--system nintendo-gba
A/Enter Back
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Command line
The same choice without questions:
python3 install.py --platform retroarch --dest
/home/user/.config/retroarch/system --system nintendo-gba
A/Enter Back
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Confirm
1 file to download, 16.0 KB
0 in place, 1 missing, 0 wrong copies
BIOS folder: ~/.config/retroarch/system
Free space: 50.0 GB
> Install
Back
A/Enter Install B/Esc Back ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Confirm
1 file to download, 16.0 KB
0 in place, 1 missing, 0 wrong copies
BIOS folder:
~/.config/retroarch/system
Free space: 50.0 GB
> Install
Back
A/Enter Install B/Esc Back ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Confirm
1 file to download, 16.0 KB
0 in place, 1 missing, 0 wrong copies
BIOS folder:
~/.config/retroarch/system
Free space: 50.0 GB
> Install
Back
A/Enter Install B/Esc Back ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Confirm
1 file to download, 16.0 KB
0 in place, 1 missing, 0 wrong copies
BIOS folder: ~/.config/retroarch/system
Free space: 50.0 GB
> Install
Back
A/Enter Install B/Esc Back ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Cores
Tick the cores you use. With none ticked, every core's files are kept.
> Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
A/Enter Filter B/Esc Back X/Space Tick ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Cores
Tick the cores you use. With none
ticked, every core's files are kept.
> Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
A Filter B Back X Tick ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Cores
Tick the cores you use. With none
ticked, every core's files are kept.
> Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
A Filter B Back X Tick ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Cores
Tick the cores you use. With none ticked, every core's files are kept.
> Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
A/Enter Filter B/Esc Back X/Space Tick ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Create the folder?
/home/user/bios/new does not exist.
The nearest folder that does: /home/user
> Create it and continue
Choose another folder
A/Enter Create B/Esc Back
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Create the folder?
/home/user/bios/new does not exist.
The nearest folder that does:
/home/user
> Create it and continue
Choose another folder
A/Enter Create B/Esc Back
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Create the folder?
/home/user/bios/new does not exist.
The nearest folder that does:
/home/user
> Create it and continue
Choose another folder
A/Enter Create B/Esc Back
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Create the folder?
/home/user/bios/new does not exist.
The nearest folder that does: /home/user
> Create it and continue
Choose another folder
A/Enter Create B/Esc Back
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Something went wrong
Could not fetch the file list for retroarch after 3 attempts: [Errno -2] Name or service not
known
Address: https://raw.githubusercontent.com/Abdess/retrobios/main/install/retroarch.json
> Choose another setup or folder
Quit
A/Enter Back B/Esc Back
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Something went wrong
Could not fetch the file list for
retroarch after 3 attempts: [Errno
-2] Name or service not known
Address:
https://raw.githubusercontent.com/
Abdess/retrobios/main/install/
retroarch.json
> Choose another setup or folder
Quit
A/Enter Back B/Esc Back
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Something went wrong
Could not fetch the file list for
retroarch after 3 attempts: [Errno
-2] Name or service not known
Address:
https://raw.githubusercontent.com/
Abdess/retrobios/main/install/
retroarch.json
> Choose another setup or folder
Quit
A/Enter Back B/Esc Back
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Something went wrong
Could not fetch the file list for retroarch after 3 attempts: [Errno -2]
Name or service not known
Address: https://raw.githubusercontent.com/Abdess/retrobios/main/install/
retroarch.json
> Choose another setup or folder
Quit
A/Enter Back B/Esc Back
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Which folder?
RetroArch reads its BIOS files from:
/home/user/.config/retroarch/system
> Use this folder
Browse for a folder
Type a path
A/Enter Use this folder B/Esc Back ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Which folder?
RetroArch reads its BIOS files from:
/home/user/.config/retroarch/system
> Use this folder
Browse for a folder
Type a path
A Use this folder B Back ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Which folder?
RetroArch reads its BIOS files from:
/home/user/.config/retroarch/system
> Use this folder
Browse for a folder
Type a path
A Use this folder B Back ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Which folder?
RetroArch reads its BIOS files from:
/home/user/.config/retroarch/system
> Use this folder
Browse for a folder
Type a path
A/Enter Use this folder B/Esc Back ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Where is the SD card?
NextUI keeps its BIOS files on its SD card. Choose the card's root folder, the one holding
.system.
> Browse for a folder
Type a path
A/Enter Browse B/Esc Back ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Where is the SD card?
NextUI keeps its BIOS files on its SD
card. Choose the card's root folder,
the one holding .system.
> Browse for a folder
Type a path
A/Enter Browse B/Esc Back ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Where is the SD card?
NextUI keeps its BIOS files on its SD
card. Choose the card's root folder,
the one holding .system.
> Browse for a folder
Type a path
A/Enter Browse B/Esc Back ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Where is the SD card?
NextUI keeps its BIOS files on its SD card. Choose the card's root folder, the
one holding .system.
> Browse for a folder
Type a path
A/Enter Browse B/Esc Back ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Keys
Up/Down, k/j Move
A/Enter, Start Install
Y, o, Tab Options
B/Esc, Backspace Back
q, Ctrl-C Quit
?, F1 This help
BIOS folder: /home/user/.config/retroarch/system
Any key closes this help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Keys
Up/Down, k/j Move
A/Enter, Start Install
Y, o, Tab Options
B/Esc, Backspace Back
q, Ctrl-C Quit
?, F1 This help
BIOS folder:
/home/user/.config/retroarch/system
Any key closes this help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Keys
Up/Down, k/j Move
A/Enter, Start Install
Y, o, Tab Options
B/Esc, Backspace Back
q, Ctrl-C Quit
?, F1 This help
BIOS folder:
/home/user/.config/retroarch/system
Any key closes this help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Keys
Up/Down, k/j Move
A/Enter, Start Install
Y, o, Tab Options
B/Esc, Backspace Back
q, Ctrl-C Quit
?, F1 This help
BIOS folder: /home/user/.config/retroarch/system
Any key closes this help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Installing
[##############################################---------------------------------------------] 50%
528.0 KB of 1.0 MB
128.9 KB/s, 0:04 left
2 of 4 files
B, Ctrl-C or Start+Select stops. What is done stays done.
FAILED scph5500.bin (HTTP 404)
ok gba_bios.bin
B/Esc Stop ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Installing
[###############----------------] 50%
528.0 KB of 1.0 MB
128.9 KB/s, 0:04 left
2 of 4 files
B, Ctrl-C or Start+Select stops. What
is done stays done.
FAILED scph5500.bin (HTTP 404)
ok gba_bios.bin
B/Esc Stop ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Installing
[###############----------------] 50%
528.0 KB of 1.0 MB
128.9 KB/s, 0:04 left
2 of 4 files
B, Ctrl-C or Start+Select stops. What
is done stays done.
FAILED scph5500.bin (HTTP 404)
ok gba_bios.bin
B/Esc Stop ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Installing
[####################################-----------------------------------] 50%
528.0 KB of 1.0 MB
128.9 KB/s, 0:04 left
2 of 4 files
B, Ctrl-C or Start+Select stops. What is done stays done.
FAILED scph5500.bin (HTTP 404)
ok gba_bios.bin
B/Esc Stop ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Options
Each row is an option of the command line, named on the right.
> Preferred regions: North America, Japan --region
Leave out game data: no --no-game-data
Installed cores only: no (1 found) --installed-cores
Cores: all --core
Parallel downloads: 8 --jobs
BIOS folder: ~/.config/retroarch/system --dest
Preview the file list --dry-run
Show the command line
A/Enter Open B/Esc Back Left/Right Set ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Options
> Preferred regions: North America, Ja
Leave out game data: no
Installed cores only: no (1 found)
Cores: all
Parallel downloads: 8
BIOS folder: ~/.config...ch/system
Preview the file list
Show the command line
A Open B Back <> Set ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Options
> Preferred regions: North America, Ja
Leave out game data: no
Installed cores only: no (1 found)
Cores: all
Parallel downloads: 8
BIOS folder: ~/.config...ch/system
Preview the file list
Show the command line
Sets --region
A Open B Back <> Set ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Options
Each row is an option of the command line, named on the right.
> Preferred regions: North America, Japan --region
Leave out game data: no --no-game-data
Installed cores only: no (1 found) --installed-cores
Cores: all --core
Parallel downloads: 8 --jobs
BIOS folder: ~/.config/retroarch/system --dest
Preview the file list --dry-run
Show the command line
A/Enter Open B/Esc Back Left/Right Set ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Type a path
The folder for RetroArch:
> ~/bios_
Ctrl-U clears. Quotes are removed, ~ and variables are expanded.
Enter Use this folder Esc Back Ctrl-U Clear
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Type a path
The folder for RetroArch:
> ~/bios_
Ctrl-U clears. Quotes are removed, ~
and variables are expanded.
Enter Use this folder Esc Back
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Type a path
The folder for RetroArch:
> ~/bios_
Ctrl-U clears. Quotes are removed, ~
and variables are expanded.
Enter Use this folder Esc Back
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Type a path
The folder for RetroArch:
> ~/bios_
Ctrl-U clears. Quotes are removed, ~ and variables are expanded.
Enter Use this folder Esc Back Ctrl-U Clear
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: RetroArch
4 files to download, 1.0 MB
1 in place, 3 missing, 1 wrong copy
BIOS folder: ~/.config/retroarch/system
Free space: 50.0 GB
They are replaced, and the old copies are kept in a backup folder.
2 files of the list are not in the collection.
> Install
Choose systems
Options
Quit
A/Enter Install B/Esc Back Y/o Options ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: RetroArch
4 files to download, 1.0 MB
1 in place, 3 missing, 1 wrong copy
BIOS folder:
~/.config/retroarch/system
Free space: 50.0 GB
> Install
Choose systems
Options
Quit
A Install B Back Y Options ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: RetroArch
4 files to download, 1.0 MB
1 in place, 3 missing, 1 wrong copy
BIOS folder:
~/.config/retroarch/system
Free space: 50.0 GB
They are replaced, and the old copies
are kept in a backup folder.
> Install
Choose systems
Options
Quit
A Install B Back Y Options ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: RetroArch
4 files to download, 1.0 MB
1 in place, 3 missing, 1 wrong copy
BIOS folder: ~/.config/retroarch/system
Free space: 50.0 GB
They are replaced, and the old copies are kept in a backup folder.
2 files of the list are not in the collection.
> Install
Choose systems
Options
Quit
A/Enter Install B/Esc Back Y/o Options ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: RetroArch
Everything is in place
5 in place, 0 missing, 0 wrong copies
BIOS folder: ~/.config/retroarch/system
Free space: 50.0 GB
> Close
Options
A/Enter Close B/Esc Back Y/o Options ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: RetroArch
Everything is in place
5 in place, 0 missing, 0 wrong copies
BIOS folder:
~/.config/retroarch/system
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: RetroArch
Everything is in place
5 in place, 0 missing, 0 wrong copies
BIOS folder:
~/.config/retroarch/system
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: RetroArch
Everything is in place
5 in place, 0 missing, 0 wrong copies
BIOS folder: ~/.config/retroarch/system
Free space: 50.0 GB
> Close
Options
A/Enter Close B/Esc Back Y/o Options ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Which setup?
Choose the setup that will use the BIOS files.
Filter (/ to type)
> RetroArch muOS, JELOS, KOLOS, Uno...Anbernic stock firmware
Batocera
Recalbox
RetroBat
EmuDeck
Lakka
RetroDECK
ROCKNIX
RomM
BizHawk
MiSTer FPGA
RetroPie
AmberELEC PAN4ELEC
EmuELEC
KNULLI
MinUI
NextUI
MyMinUI
A/Enter Choose B/Esc Back / Filter ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Which setup?
Filter (/ to type)
> RetroArch muOS, JE...firmware
Batocera
Recalbox
RetroBat
EmuDeck
Lakka
RetroDECK
1-7 of 18
A Choose B Back / Filter ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Which setup?
Filter (/ to type)
> RetroArch muOS, JE...firmware
Batocera
Recalbox
RetroBat
EmuDeck
Lakka
RetroDECK
ROCKNIX
RomM
BizHawk
1-10 of 18
A Choose B Back / Filter ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Which setup?
Choose the setup that will use the BIOS files.
Filter (/ to type)
> RetroArch muOS, JELOS, KOLOS...nic stock firmware
Batocera
Recalbox
RetroBat
EmuDeck
Lakka
RetroDECK
ROCKNIX
RomM
BizHawk
MiSTer FPGA
RetroPie
AmberELEC PAN4ELEC
EmuELEC
KNULLI
MinUI
NextUI
MyMinUI
A/Enter Choose B/Esc Back / Filter ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Preview
4 files to download, 1.0 MB. Nothing is written.
missing 512.0 KB scph5500.bin
wrong copy 512.0 KB scph5501.bin
missing 4 B pcsx/extra.bin
missing 16.0 KB gba_bios.bin
A/Enter Back Up/Down Scroll
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Preview
4 files to download, 1.0 MB. Nothing
is written.
missing 512.0 KB scph5500.bin
wrong copy 512.0 KB scph5501.bin
missing 4 B pcsx/extra.bin
missing 16.0 KB gba_bios.bin
A/Enter Back Up/Down Scroll
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Preview
4 files to download, 1.0 MB. Nothing
is written.
missing 512.0 KB scph5500.bin
wrong copy 512.0 KB scph5501.bin
missing 4 B pcsx/extra.bin
missing 16.0 KB gba_bios.bin
A/Enter Back Up/Down Scroll
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Preview
4 files to download, 1.0 MB. Nothing is written.
missing 512.0 KB scph5500.bin
wrong copy 512.0 KB scph5501.bin
missing 4 B pcsx/extra.bin
missing 16.0 KB gba_bios.bin
A/Enter Back Up/Down Scroll
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Quit?
Quit without installing? Nothing was written.
> Quit
Stay
A/Enter Quit B/Esc Stay
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Quit?
Quit without installing? Nothing was
written.
> Quit
Stay
A/Enter Quit B/Esc Stay
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Quit?
Quit without installing? Nothing was
written.
> Quit
Stay
A/Enter Quit B/Esc Stay
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Quit?
Quit without installing? Nothing was written.
> Quit
Stay
A/Enter Quit B/Esc Stay
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Preferred regions
Tick the regions to keep, best first. Where a system has one BIOS per region, the best one found
is installed.
> [1] North America
[ ] Japan
A/Enter Tick B/Esc Done Left/Right Order ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Preferred regions
Tick the regions to keep, best first.
Where a system has one BIOS per
region, the best one found is
installed.
> [1] North America
[ ] Japan
A Tick B Done <> Order ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Preferred regions
Tick the regions to keep, best first.
Where a system has one BIOS per
region, the best one found is
installed.
> [1] North America
[ ] Japan
A Tick B Done <> Order ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Preferred regions
Tick the regions to keep, best first. Where a system has one BIOS per region,
the best one found is installed.
> [1] North America
[ ] Japan
A/Enter Tick B/Esc Done Left/Right Order ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Finished with errors
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
The files it replaced are kept in /home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
To put them back: python3 install.py --restore
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
2 files of the list are not in the collection, 1 of them needed to start an emulator.
Same choice without questions:
python3 install.py --platform retroarch --dest /home/user/.config/retroarch/system
Details: /tmp/retrobios-x/install.log
A/Enter Exit Up/Down Scroll
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Finished with errors
3 installed, 1 failed.
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py
1-4 of 9
A/Enter Exit Up/Down Scroll
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Finished with errors
3 installed, 1 failed.
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py
--restore
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
1-5 of 9
A/Enter Exit Up/Down Scroll
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Finished with errors
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
To put them back: python3 install.py --restore
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
2 files of the list are not in the collection, 1 of them needed to start an
emulator.
Same choice without questions:
python3 install.py --platform retroarch --dest
/home/user/.config/retroarch/system
Details: /tmp/retrobios-x/install.log
A/Enter Exit Up/Down Scroll
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Where do you play?
Found on this machine:
> RetroArch
KNULLI (Batocera files)
Another setup or folder
BIOS folder: /home/user/.config/retroarch/system
ES-DE found: its BIOS files go to each emulator, not to ES-DE itself.
A/Enter Continue B/Esc Quit ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Where do you play?
Found on this machine:
> RetroArch
KNULLI (Batocera files)
Another setup or folder
BIOS folder:
/home/user/.config/retroarch/system
ES-DE found: its BIOS files go to each
A/Enter Continue B/Esc Quit ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Where do you play?
Found on this machine:
> RetroArch
KNULLI (Batocera files)
Another setup or folder
BIOS folder:
/home/user/.config/retroarch/system
ES-DE found: its BIOS files go to each
emulator, not to ES-DE itself.
A/Enter Continue B/Esc Quit ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Where do you play?
Found on this machine:
> RetroArch
KNULLI (Batocera files)
Another setup or folder
BIOS folder: /home/user/.config/retroarch/system
ES-DE found: its BIOS files go to each emulator, not to ES-DE itself.
A/Enter Continue B/Esc Quit ? Help
+40
View File
@@ -0,0 +1,40 @@
RetroBIOS: Choose systems
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
2 of 3 systems: 4 files, 1.0 MB
A/Enter Continue B/Esc Back X/Space Tick ? Help
+12
View File
@@ -0,0 +1,12 @@
RetroBIOS: Choose systems
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick ? Help
+15
View File
@@ -0,0 +1,15 @@
RetroBIOS: Choose systems
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick ? Help
+24
View File
@@ -0,0 +1,24 @@
RetroBIOS: Choose systems
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
2 of 3 systems: 4 files, 1.0 MB
A/Enter Continue B/Esc Back X/Space Tick ? Help
+3
View File
@@ -5049,6 +5049,9 @@ class EventsDescribeTheRun(unittest.TestCase, _SyntheticTree):
{"event": "detect", "os": "linux", "os_name": install._os_name(),
"platforms": [{"platform": "retroarch", "name": "RetroArch",
"bios_dir": str(self.bios)}]},
# a.bin and b.bin are in place: the first read and the last.
{"event": "checking", "files_done": 1, "files_total": 2},
{"event": "checking", "files_done": 2, "files_total": 2},
{"event": "file", "platform": "retroarch", "dest": "a.bin",
"systems": ["sys-a"], "size": 100, "state": "present"},
{"event": "file", "platform": "retroarch", "dest": "b.bin",
File diff suppressed because it is too large. Load diff
+62
View File
@@ -79,6 +79,64 @@ from the text and calling it passes the arguments through:
--platform retroarch --dest D:\bios
```
## The full-screen interface { #the-full-screen-interface }
Run at a terminal, the installer opens a full screen that a keyboard or a
controller drives. Three presses of A or Enter install everything your setup
reads: the setup found here, the plan, then the result. The plan screen says
how many files are missing, how much they weigh, how many are in place and how
much space is free, before anything is written.
The other choices sit one press away. **Choose systems** ticks the consoles you
play, with the total to download under the list. **Options** sets the
preferred regions, game data, the installed cores only, the cores, the parallel
downloads and the folder. Each row names the option it sets, and **Show the
command line** gives the same choice as one command for a script. **Preview the
file list** shows what would be downloaded and writes nothing. Back on the plan
after a change of options, the folder is checked again, so its numbers are the
exact ones for the new choice. Ticked systems get their exact count before the
install starts.
| Action | Keyboard | Controller |
|--------|----------|------------|
| Move | Up and Down, `k` and `j` | D-pad Up and Down |
| Page | PgUp and PgDn | L1 and R1 |
| First, last | Home and End, `g` and `G` | |
| Continue, open, choose | Enter, Space | A, Start |
| Tick, untick | Space, Right, Left | X, D-pad Right and Left |
| Back | Esc, Backspace | B, Select |
| Options | `o`, Tab | Y |
| Filter a long list | `/` then type | the Filter row |
| Keys of the screen | `?`, F1 | |
| Stop an install | Esc, `q`, Ctrl+C | B, Start+Select |
| Quit | `q`, Ctrl+C | B on the first screen |
The bottom line of each screen names what A does on the row under the cursor,
with both spellings (`A/Enter`, `B/Esc`), since A and B swap places between
controller layouts. A narrow screen shortens them to `A`, `B` and `X`. On the
regions screen, Left and Right move the region under the cursor up and down the
order of preference. During the download, a stop waits for the files in
progress, and a second one stops at once. Start+Select on a handheld ends the
installer with a signal (SIGTERM), which stops it the same way. Either way the
result says how many files were installed, and it stays printed in the terminal
once the screen closes, with the command that repeats the run. A run that failed
keeps its log and names it, and every other run leaves nothing behind.
It opens only for an install, at a terminal of at least 40 columns and 12 rows
that is not `TERM=dumb`. A listing, `--check`, `--dry-run`, `--events`,
`--quiet`, `--no-input`, `--yes` and `--restore` keep the plain output. Options
given on the command line fill the screens in advance and are kept as they are.
- `--tui` asks for the full screen, and names the reason when it cannot open
(code 2).
- `--plain`, `RETROBIOS_PLAIN=1` or `ACCESSIBLE=1` keep the questions line by
line. This is the mode for a screen reader, which reads a full screen badly.
Behind the screens, the installer runs itself with `--check --events`, then
`--events --yes` and the options chosen: the same
[events](#machine-readable-events) a program driving the installer reads. The
file list is downloaded once and handed to each run.
## What the installer does
1. Detects the host OS and the platforms installed on it.
@@ -518,6 +576,8 @@ what the options name, everything by default.
| `--from-pack PATH` | Install from a pack already downloaded: its ZIP, one of its parts (the others are found in the same folder), or the folder holding them. Makes no network request and checks every file's hash. See [Without a network](#without-a-network-offline-install) |
| `--manifest FILE` | Read the file list from FILE, a copy of `install/<platform>.json`, instead of downloading it. See [Without a network](#without-a-network-offline-install) |
| `--restore FOLDER` | Put back the files a run replaced and kept in FOLDER, a dated folder inside `retrobios-backup`. Takes no other option but `--dry-run` and `--no-input`. See [Files you already had](#files-you-already-had) |
| `--tui` | Open the full-screen interface, or stop with the reason it cannot open here (code 2) instead of falling back to the questions. Wins over `RETROBIOS_PLAIN` and `ACCESSIBLE`. See [The full-screen interface](#the-full-screen-interface) |
| `--plain` | Ask the questions line by line instead of the full-screen interface, the mode for a screen reader. See [The full-screen interface](#the-full-screen-interface) |
| `--version` | Print the installer's identity, the first 12 hex digits of the SHA-256 the bootstraps pin |
| `--list-platforms` | Print the supported platforms and what was detected here |
| `--list-targets` | Print the hardware targets a platform publishes, with the core count each carries |
@@ -1046,6 +1106,7 @@ kind, and each kind has exactly the keys below, in this order. The schema is
| `start` | `schema`, `installer`, `mode` | First line. `schema` is 1, `installer` the identity `--version` prints, `mode` one of `install`, `check`, `dry-run`, `list` |
| `detect` | `os`, `os_name`, `platforms` | Once the platforms are known. `os_name` comes from `/etc/os-release`. `platforms` lists `{platform, name, bios_dir}`, and is empty when nothing supported was found |
| `error` | `stage`, `reason`, `platform`, `message` | The file list could not be read (`stage` is `manifest`). `reason` is `network`, `not_found` or `invalid`, `clock` when the server's certificate was refused and the system clock reads a date before the installer was written, or `no_ca` when the machine holds no list of trusted certificates (`SSL_CERT_FILE` names one). `message` says it in words |
| `checking` | `files_done`, `files_total` | While the files already in the folder are read and hashed, at most every half second and once at the end. `files_total` counts the files found in place |
| `file` | `platform`, `dest`, `systems`, `size`, `state` | Each file of the list after the check. `state` is `present` (hash verified), `wrong_hash` or `missing` |
| `system` | `platform`, `system`, `name`, `files`, `present`, `missing`, `wrong_hash`, `bytes_needed` | Each system, sorted by id, and with `--system` only the systems named. Files with no system count under `other`. `name` is the platform's own name for it |
| `check` | `platform`, `name`, `bios_dir`, `files`, `present`, `missing`, `wrong_hash`, `bytes_needed`, `data_missing`, `not_installable` | The platform's totals. `data_missing` counts data-tree files to fetch, `not_installable` the files the collection cannot supply |
@@ -1072,6 +1133,7 @@ no event at all. A program reads a missing `end` as that case.
| `NO_COLOR` | Plain text, no colour, even at a terminal, when set to any value but an empty one. `TERM=dumb` also turns the live progress line off |
| `FORCE_COLOR`, `CLICOLOR_FORCE` | Colour even when the output is a pipe or a file, set to any value but `0` or an empty one. `NO_COLOR` wins over both, and the progress line stays one line per file |
| `SSL_CERT_FILE`, `SSL_CERT_DIR` | The trusted certificates to check servers with, for a Python that finds none of its own |
| `RETROBIOS_PLAIN`, `ACCESSIBLE` | Set to anything but `0`: the questions come line by line, as with `--plain`, instead of the full-screen interface |
| `HTTPS_PROXY`, `NO_PROXY` | Honoured for every download through the standard library's default proxy handling: one names the proxy, the other the hosts to reach directly |
## When something goes wrong
+6 -3
View File
@@ -36,8 +36,11 @@ needs `pyyaml` and `jsonschema` installed for that interpreter. The
schema contract tests also need `jsonschema[format-nongpl]`, and one site test
renders a wiki line with `markdown`. The CI installs both: without them those
tests are reported as skipped, so install them before a pull request
(`pip install "jsonschema[format-nongpl]" markdown`). No test framework beyond
the standard library `unittest` module.
(`pip install "jsonschema[format-nongpl]" markdown`). The installer's
full-screen tests drive `install.py --tui` on a pseudo-terminal and read the
screen back with `pyte`, and fuzz the key decoder with `hypothesis`: both skip
without them (`pip install pyte hypothesis`). No test framework beyond the
standard library `unittest` module.
## Modules at a glance
@@ -51,7 +54,7 @@ Every module in `tests/`, by the area it guards.
| Packs and manifests | synthetic + real packs | `test_artifact_lock`, `test_atomic_artifacts`, `test_batocera_cores`, `test_deterministic_zip`, `test_emulator_pack_counts`, `test_finalize_pack_names`, `test_large_file_cache`, `test_libretro_layout`, `test_manifest_entry`, `test_minui_platform`, `test_no_game_data`, `test_pack_conformance_dirs`, `test_pack_core_extras`, `test_pack_counts`, `test_pack_destinations`, `test_pack_failures`, `test_pack_file_names`, `test_pack_grouping`, `test_pack_integrity`, `test_pack_member_identity`, `test_pack_readme`, `test_platform_inheritance`, `test_platform_keys`, `test_required_only_archives`, `test_required_only_twins`, `test_save_root`, `test_split_extras`, `test_split_names`, `test_split_pack`, `test_system_pack_extras`, `test_system_pack_parity`, `test_torrentzip`, `test_which_pack` |
| Slots and regions | synthetic + profiles | `test_region`, `test_region_agnostic_scan`, `test_region_groups`, `test_region_held`, `test_region_platform_index`, `test_region_required_only`, `test_slot`, `test_slots`, `test_slots_shipped_file` |
| Hardware targets and systems | synthetic + target files | `test_extract_targets`, `test_lakka_targets`, `test_libretro_slugs`, `test_system_ids`, `test_system_selection`, `test_target_names`, `test_target_scrapers`, `test_target_systems`, `test_target_verify` |
| Installer and downloads | loopback server | `test_check_release`, `test_download`, `test_install`, `test_install_cores`, `test_install_experience`, `test_install_offline`, `test_install_selection` |
| Installer and downloads | loopback server | `test_check_release`, `test_download`, `test_install`, `test_install_cores`, `test_install_experience`, `test_install_offline`, `test_install_selection`, `test_install_tui` |
| Handheld port | stubbed PortMaster dialogs, fake installer | `test_port` |
| Truth and native export | synthetic + cached originals | `test_export_counts`, `test_export_native_layer`, `test_export_report`, `test_exporters`, `test_truth_data_dir_readers`, `test_truth_diff`, `test_truth_layout` |
| Scrapers, upstream and provenance | inline sources, synthetic | `test_batocera_md5_list`, `test_check_freshness`, `test_contributing_text`, `test_coverage_cache`, `test_data_dir_refs`, `test_dataclass_defaults`, `test_dedup`, `test_doc_pages`, `test_doc_surfaces`, `test_elec_scrapers`, `test_fbneo_parser`, `test_find_pinned_revision`, `test_hash_merge`, `test_launchers`, `test_launchers_emudeck`, `test_launchers_recalbox`, `test_launchers_retrobat`, `test_launchers_retrodeck`, `test_launchers_retropie`, `test_launchers_rocknix`, `test_mame_devices`, `test_mame_parser`, `test_mame_ref_audit`, `test_optional_dependencies`, `test_profile_sync`, `test_prose_style`, `test_provenance`, `test_refresh_data_dirs`, `test_refresh_failures`, `test_refresh_stale`, `test_retrodeck_scraper_errors`, `test_romset_recipes`, `test_schema_semantic_gate`, `test_scraper_contract`, `test_site_availability`, `test_site_content_data`, `test_site_copy`, `test_site_cores`, `test_site_emulator_page`, `test_site_exports`, `test_site_funnel`, `test_site_images`, `test_site_picker`, `test_site_platform_hashes`, `test_site_r2_components`, `test_site_r2_css`, `test_site_r2_emulators`, `test_site_r2_entry`, `test_site_r2_gate`, `test_site_r2_nav`, `test_site_r2_p0`, `test_site_r2_reference`, `test_site_r2_systems`, `test_site_r2_wiki`, `test_site_r3_collection`, `test_site_r3_components`, `test_site_r3_css`, `test_site_r3_emulators`, `test_site_r3_entry`, `test_site_r3_nav`, `test_site_r3_p0`, `test_site_r4_p0`, `test_site_r3_reference`, `test_site_r3_systems`, `test_site_r3_wiki`, `test_site_render`, `test_site_system_links`, `test_site_validation`, `test_site_weight`, `test_site_write`, `test_source_ref_targets`, `test_upstream`, `test_upstream_index`, `test_validate_pr`, `test_validate_pr_flow`, `test_validate_pr_hashes`, `test_workflow_paths` |