2 Commits
7 changed files with 128 additions and 76 deletions

No files matched your search

+13 -13
View File
@@ -44,18 +44,18 @@ Every release ships `SHA256SUMS.txt` and a detached signature of it, checkable a
| Platform | Files | Extracted size | Extract to | Download |
|----------|------:|---------------:|-----------|----------|
| Batocera | 1,839 | 4.0 GB | `/userdata/bios/` | [Download](../../releases/latest) |
| BizHawk | 542 | 2.2 GB | `Firmware/` | [Download](../../releases/latest) |
| EmuDeck | 624 | 3.2 GB | `~/Emulation/bios/` | [Download](../../releases/latest) |
| Lakka | 4,525 | 5.5 GB | `/storage/system/` | [Download](../../releases/latest) |
| MiSTer FPGA | 74 | 24 MB | `/media/fat/games/` | [Download](../../releases/latest) |
| ROCKNIX | 1,741 | 5.3 GB | `/storage/roms/bios/` | [Download](../../releases/latest) |
| Recalbox | 1,330 | 3.6 GB | `/recalbox/share/bios/` | [Download](../../releases/latest) |
| RetroArch | 4,525 | 5.5 GB | `system/` | [Download](../../releases/latest) |
| RetroBat | 1,466 | 4.4 GB | `bios/` | [Download](../../releases/latest) |
| RetroDECK | 3,519 | 6.2 GB | `~/retrodeck/` | [Download](../../releases/latest) |
| RetroPie * | 4,525 | 5.5 GB | `~/RetroPie/BIOS/` | [Download](../../releases/latest) |
| RomM | 617 | 1.3 GB | `library/bios/` | [Download](../../releases/latest) |
| Batocera | 12,810 | 7.5 GB | `/userdata/bios/` | [Download](../../releases/latest) |
| BizHawk | 950 | 2.4 GB | `Firmware/` | [Download](../../releases/latest) |
| EmuDeck | 620 | 3.2 GB | `~/Emulation/bios/` | [Download](../../releases/latest) |
| Lakka | 8,504 | 6.0 GB | `/storage/system/` | [Download](../../releases/latest) |
| MiSTer FPGA | 83 | 29 MB | `/media/fat/games/` | [Download](../../releases/latest) |
| ROCKNIX | 5,804 | 6.1 GB | `/storage/roms/bios/` | [Download](../../releases/latest) |
| Recalbox | 3,222 | 3.9 GB | `/recalbox/share/bios/` | [Download](../../releases/latest) |
| RetroArch | 8,504 | 6.0 GB | `system/` | [Download](../../releases/latest) |
| RetroBat | 12,399 | 7.9 GB | `bios/` | [Download](../../releases/latest) |
| RetroDECK | 7,793 | 8.0 GB | `~/retrodeck/` | [Download](../../releases/latest) |
| RetroPie * | 12,533 | 8.1 GB | `~/RetroPie/BIOS/` | [Download](../../releases/latest) |
| RomM | 1,087 | 1.5 GB | `library/bios/` | [Download](../../releases/latest) |
The RetroDECK pack already carries its own `bios/` folder, so it extracts into `~/retrodeck/` rather than into the BIOS folder.
@@ -180,4 +180,4 @@ The scripts and tooling are released under the [MIT License](LICENSE).
The BIOS and firmware files are not covered by that license: they are third-party system software, preserved and provided for personal backup, archival, and interoperability with emulation software. [NOTICE](NOTICE) sets out their status and how to ask for a file to be removed.
The reasoning, and where it is weakest, is in the [FAQ](https://abdess.github.io/retrobios/wiki/faq/#is-this-legal).
*Auto-generated on 2026-10-09T21:03:52Z*
*Auto-generated on 2026-10-09T23:59:06Z*
+8 -1
View File
@@ -97,4 +97,11 @@ if [ -z "$PYTHON" ]; then
exit 1
fi
"$PYTHON" "$INSTALLER" "$@"
# Piped from curl, standard input is this script, not the terminal: the
# installer would skip every question it can ask. Hand it the terminal when
# there is one.
if [ ! -t 0 ] && (: </dev/tty) 2>/dev/null; then
"$PYTHON" "$INSTALLER" "$@" </dev/tty
else
"$PYTHON" "$INSTALLER" "$@"
fi
+1 -1
View File
@@ -19,7 +19,7 @@
"total_files": 5861,
"total_size": 6398490526,
"pack_files": 8504,
"pack_size": 6439023690,
"pack_size": 6439023053,
"total_omitted": 0,
"omitted_files": [],
"files": [
+1 -1
View File
@@ -258,7 +258,7 @@
"total_files": 5861,
"total_size": 6398490526,
"pack_files": 8504,
"pack_size": 6439023690,
"pack_size": 6439023053,
"total_omitted": 0,
"omitted_files": [],
"files": [
+1 -1
View File
@@ -18,7 +18,7 @@
"total_files": 9890,
"total_size": 8732256943,
"pack_files": 12533,
"pack_size": 8772790107,
"pack_size": 8772789470,
"total_omitted": 8,
"omitted_files": [
{
+62 -59
View File
@@ -1,100 +1,103 @@
{
"tag": "v2026.09.04",
"tag": "v2026.10.10",
"packs": {
"Batocera_43.1_BIOS_Pack.zip": {
"files": 1839,
"extracted_size": 4320230269,
"download_size": 2557851727,
"files": 12810,
"extracted_size": 8062660183,
"download_size": 5570768859,
"assets": [
"Batocera_43.1_BIOS_Pack.zip.001",
"Batocera_43.1_BIOS_Pack.zip.002"
"Batocera_43.1_BIOS_Pack.part1of3.zip",
"Batocera_43.1_BIOS_Pack.part2of3.zip",
"Batocera_43.1_BIOS_Pack.part3of3.zip"
]
},
"BizHawk_2.11.1_BIOS_Pack.zip": {
"files": 542,
"extracted_size": 2332771486,
"download_size": 1223296442,
"files": 950,
"extracted_size": 2585360680,
"download_size": 1469752558,
"assets": [
"BizHawk_2.11.1_BIOS_Pack.zip"
]
},
"EmuDeck_2.3.8_BIOS_Pack.zip": {
"files": 624,
"extracted_size": 3398423896,
"download_size": 1889509442,
"EmuDeck_2.7EA_BIOS_Pack.zip": {
"files": 620,
"extracted_size": 3473777719,
"download_size": 1939696164,
"assets": [
"EmuDeck_2.3.8_BIOS_Pack.zip"
"EmuDeck_2.7EA_BIOS_Pack.zip"
]
},
"MiSTer_FPGA_2026-08-29_BIOS_Pack.zip": {
"files": 74,
"extracted_size": 25209623,
"download_size": 16769418,
"MiSTer_FPGA_2026-09-29_BIOS_Pack.zip": {
"files": 83,
"extracted_size": 29989684,
"download_size": 18787872,
"assets": [
"MiSTer_FPGA_2026-08-29_BIOS_Pack.zip"
"MiSTer_FPGA_2026-09-29_BIOS_Pack.zip"
]
},
"ROCKNIX_20260901_BIOS_Pack.zip": {
"files": 1741,
"extracted_size": 5715015067,
"download_size": 3337595108,
"ROCKNIX_20261001_BIOS_Pack.zip": {
"files": 5804,
"extracted_size": 6538611412,
"download_size": 4022886600,
"assets": [
"ROCKNIX_20260901_BIOS_Pack.zip.001",
"ROCKNIX_20260901_BIOS_Pack.zip.002"
"ROCKNIX_20261001_BIOS_Pack.part1of2.zip",
"ROCKNIX_20261001_BIOS_Pack.part2of2.zip"
]
},
"Recalbox_10.0.8_BIOS_Pack.zip": {
"files": 1330,
"extracted_size": 3883703707,
"download_size": 2096847659,
"Recalbox_10.1.1_BIOS_Pack.zip": {
"files": 3222,
"extracted_size": 4173452215,
"download_size": 2367991387,
"assets": [
"Recalbox_10.0.8_BIOS_Pack.zip.001",
"Recalbox_10.0.8_BIOS_Pack.zip.002"
"Recalbox_10.1.1_BIOS_Pack.part1of2.zip",
"Recalbox_10.1.1_BIOS_Pack.part2of2.zip"
]
},
"RetroArch_Lakka_v1.22.2_BIOS_Pack.zip": {
"files": 4525,
"extracted_size": 5882727352,
"download_size": 3349430771,
"files": 8504,
"extracted_size": 6407344187,
"download_size": 3853113197,
"assets": [
"RetroArch_Lakka_v1.22.2_BIOS_Pack.zip.001",
"RetroArch_Lakka_v1.22.2_BIOS_Pack.zip.002"
"RetroArch_Lakka_v1.22.2_BIOS_Pack.part1of2.zip",
"RetroArch_Lakka_v1.22.2_BIOS_Pack.part2of2.zip"
]
},
"RetroBat_8.2.1_BIOS_Pack.zip": {
"files": 1466,
"extracted_size": 4724194892,
"download_size": 3105818817,
"files": 12399,
"extracted_size": 8493976396,
"download_size": 6134642511,
"assets": [
"RetroBat_8.2.1_BIOS_Pack.zip.001",
"RetroBat_8.2.1_BIOS_Pack.zip.002"
"RetroBat_8.2.1_BIOS_Pack.part1of3.zip",
"RetroBat_8.2.1_BIOS_Pack.part2of3.zip",
"RetroBat_8.2.1_BIOS_Pack.part3of3.zip"
]
},
"RetroDECK_0.10.9b_BIOS_Pack.zip": {
"files": 3519,
"extracted_size": 6627934502,
"download_size": 4132852872,
"RetroDECK_0.10.10b_BIOS_Pack.zip": {
"files": 7793,
"extracted_size": 8590201314,
"download_size": 5469112852,
"assets": [
"RetroDECK_0.10.9b_BIOS_Pack.zip.001",
"RetroDECK_0.10.9b_BIOS_Pack.zip.002",
"RetroDECK_0.10.9b_BIOS_Pack.zip.003"
"RetroDECK_0.10.10b_BIOS_Pack.part1of3.zip",
"RetroDECK_0.10.10b_BIOS_Pack.part2of3.zip",
"RetroDECK_0.10.10b_BIOS_Pack.part3of3.zip"
]
},
"RetroPie_v1.22.2_BIOS_Pack.zip": {
"files": 4525,
"extracted_size": 5882738533,
"download_size": 3349391169,
"RetroPie_4.8.12_BIOS_Pack.zip": {
"files": 12533,
"extracted_size": 8742145940,
"download_size": 5482623403,
"assets": [
"RetroPie_v1.22.2_BIOS_Pack.zip.001",
"RetroPie_v1.22.2_BIOS_Pack.zip.002"
"RetroPie_4.8.12_BIOS_Pack.part1of3.zip",
"RetroPie_4.8.12_BIOS_Pack.part2of3.zip",
"RetroPie_4.8.12_BIOS_Pack.part3of3.zip"
]
},
"RomM_5.2.0_BIOS_Pack.zip": {
"files": 617,
"extracted_size": 1370456481,
"download_size": 765186250,
"RomM_5.3.1_BIOS_Pack.zip": {
"files": 1087,
"extracted_size": 1581830590,
"download_size": 973353236,
"assets": [
"RomM_5.2.0_BIOS_Pack.zip"
"RomM_5.3.1_BIOS_Pack.zip"
]
}
}
+42
View File
@@ -9,6 +9,7 @@ import importlib.util
import io
import json
import os
import shlex
import re
import shutil
import subprocess
@@ -1460,6 +1461,47 @@ class TestAvailablePlatforms(unittest.TestCase):
self.assertTrue(marker.is_file(), "piped bootstrap did not download install.py")
self.assertIn("retroarch", proc.stdout)
@unittest.skipUnless(shutil.which("script"), "script(1) provides the terminal")
def test_piped_one_liner_hands_the_terminal_to_the_installer(self):
"""curl | sh gives the installer the script as stdin, so isatty()
was false and every question it asks was skipped on Linux and Mac."""
scratch = REPO_ROOT / "tmp" / "tests"
scratch.mkdir(parents=True, exist_ok=True)
with tempfile.TemporaryDirectory(dir=scratch) as directory:
root = Path(directory)
probe = root / "probe.py"
probe.write_text(
"import sys\nprint('installer stdin is a terminal:', sys.stdin.isatty())\n",
encoding="utf-8",
)
fake_bin = root / "bin"
fake_bin.mkdir()
(fake_bin / "curl").write_text(
"#!/bin/sh\n"
"output=\n"
"while [ \"$#\" -gt 0 ]; do\n"
" if [ \"$1\" = --output ]; then output=$2; shift 2; else shift; fi\n"
"done\n"
f"cp -- {shlex.quote(str(probe))} \"$output\"\n",
encoding="utf-8",
)
(fake_bin / "curl").chmod(0o755)
env = os.environ.copy()
env.update(
PATH=f"{fake_bin}{os.pathsep}{env['PATH']}",
TMPDIR=str(root),
RETROBIOS_INSTALL_URL="https://example.invalid/install.py",
RETROBIOS_INSTALL_SHA256=hashlib.sha256(probe.read_bytes()).hexdigest(),
)
piped = f"sh -s < {shlex.quote(str(REPO_ROOT / 'install.sh'))}"
proc = subprocess.run(
["script", "-qec", piped, "/dev/null"],
cwd=root, env=env, capture_output=True, text=True, timeout=30,
check=False,
)
self.assertEqual(proc.returncode, 0, proc.stdout + proc.stderr)
self.assertIn("installer stdin is a terminal: True", proc.stdout)
class TargetListFailureIsNotAnAnswer(unittest.TestCase):
"""A timeout is not 'no targets': it sent users to the full pack."""