diff --git a/README.md b/README.md index 8828c83b4..5fc35cb7c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,8 @@ irm https://raw.githubusercontent.com/Abdess/retrobios/main/install.ps1 | iex # Android (Termux, after pkg install python and termux-setup-storage) curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh -# SD card mounted on a PC: --dest is the BIOS folder on the card +# SD card mounted on a PC: a muOS, KNULLI, ROCKNIX, Onion, spruceOS or MinUI card +# is found by itself. For another card, --dest is its BIOS folder # (RetroArch on Switch: retroarch/cores/system, on Android: RetroArch/system) curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh -s -- --platform retroarch --dest /path/to/sdcard/retroarch/cores/system @@ -32,12 +33,12 @@ curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | &([scriptblock]::Create((irm https://raw.githubusercontent.com/Abdess/retrobios/main/install.ps1))) --check ``` -The script auto-detects your platform, downloads only missing files, and verifies checksums. +The script opens a full-screen installer, driven with the arrow keys and Enter, or with a controller on a handheld. It finds your setup and its BIOS folder, downloads only the missing files and checks each one. It can also copy the BIOS files from your old SD card. Every option, and what the installer detects and writes, is on the [installer page](https://abdess.github.io/retrobios/wiki/installer/#passing-options). ## Download BIOS packs -A pack holds everything its platform runs: its own BIOS list plus every file its emulator cores load. Pick your platform, download the ZIP, extract to the BIOS path. Each Download link is a page that keeps its address from one release to the next. The installer above does the same file by file. At a terminal it asks whether to install everything or to choose systems, cores and regions, and `--system`, `--core`, `--region` and `--target` make the same choice without questions. For a bare minimum, build your own pack below. +A pack holds everything its platform runs: its own BIOS list plus every file its emulator cores load. Pick your platform, download the ZIP, extract to the BIOS path. Each Download link is a page that keeps its address from one release to the next. The installer above does the same file by file. At a terminal it offers to install everything or to choose systems, cores and regions, and `--system`, `--core`, `--region` and `--target` make the same choice without questions. For a bare minimum, build your own pack below. A pack over 2 GB comes in several parts (`Pack.part1of2.zip`, `Pack.part2of2.zip`), and every part is needed. Each part is an ordinary ZIP: extract them all into the same folder. @@ -199,4 +200,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 project's legal position](https://abdess.github.io/retrobios/wiki/legal/). -*Auto-generated on 2026-10-24T00:06:47Z* +*Auto-generated on 2026-10-24T01:44:28Z* diff --git a/scripts/generate_readme.py b/scripts/generate_readme.py index ad10095c4..4bbd421ba 100644 --- a/scripts/generate_readme.py +++ b/scripts/generate_readme.py @@ -562,7 +562,8 @@ def generate_readme(db: dict, platforms_dir: str, db_path: str = "database.json" "# Android (Termux, after pkg install python and termux-setup-storage)", "curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh", "", - "# SD card mounted on a PC: --dest is the BIOS folder on the card", + "# SD card mounted on a PC: a muOS, KNULLI, ROCKNIX, Onion, spruceOS or MinUI card", + "# is found by itself. For another card, --dest is its BIOS folder", "# (RetroArch on Switch: retroarch/cores/system, on Android: RetroArch/system)", "curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh -s -- --platform retroarch --dest /path/to/sdcard/retroarch/cores/system", "", @@ -570,12 +571,14 @@ def generate_readme(db: dict, platforms_dir: str, db_path: str = "database.json" "&([scriptblock]::Create((irm https://raw.githubusercontent.com/Abdess/retrobios/main/install.ps1))) --check", "```", "", - "The script auto-detects your platform, downloads only missing files, and verifies checksums.", + "The script opens a full-screen installer, driven with the arrow keys and Enter, or with a" + " controller on a handheld. It finds your setup and its BIOS folder, downloads only the missing" + " files and checks each one. It can also copy the BIOS files from your old SD card.", f"Every option, and what the installer detects and writes, is on the [installer page]({SITE_URL}wiki/installer/#passing-options).", "", "## Download BIOS packs", "", - "A pack holds everything its platform runs: its own BIOS list plus every file its emulator cores load. Pick your platform, download the ZIP, extract to the BIOS path. Each Download link is a page that keeps its address from one release to the next. The installer above does the same file by file. At a terminal it asks whether to install everything or to choose systems, cores and regions, and `--system`, `--core`, `--region` and `--target` make the same choice without questions. For a bare minimum, build your own pack below.", + "A pack holds everything its platform runs: its own BIOS list plus every file its emulator cores load. Pick your platform, download the ZIP, extract to the BIOS path. Each Download link is a page that keeps its address from one release to the next. The installer above does the same file by file. At a terminal it offers to install everything or to choose systems, cores and regions, and `--system`, `--core`, `--region` and `--target` make the same choice without questions. For a bare minimum, build your own pack below.", "", "A pack over 2 GB comes in several parts (`Pack.part1of2.zip`," " `Pack.part2of2.zip`), and every part is needed. Each part is an" diff --git a/tests/test_install_experience.py b/tests/test_install_experience.py index 4cba5a56a..3ce23894a 100644 --- a/tests/test_install_experience.py +++ b/tests/test_install_experience.py @@ -742,8 +742,11 @@ class ARefusalTheProbeDoesNotRaise(unittest.TestCase): install._DETECTION_REFUSED.clear() self.addCleanup(install._DETECTION_REFUSED.clear) quiet = mock.patch.object(install.Path, "exists", lambda self: False) - with quiet, mock.patch.object(install._SETUP_SEARCH, "active", True, create=True), \ - contextlib.redirect_stderr(io.StringIO()): + # What _detection_guarded sets while it looks for setups. + outer = getattr(install._SETUP_SEARCH, "active", False) + install._SETUP_SEARCH.active = True + self.addCleanup(setattr, install._SETUP_SEARCH, "active", outer) + with quiet, contextlib.redirect_stderr(io.StringIO()): self.assertFalse(install._exists(target)) self.assertFalse(install._exists(base / "absent")) self.assertEqual(install.closed_folder(target), (closed, "Permission denied")) diff --git a/wiki/installer.md b/wiki/installer.md index 987dc54c6..e458f6dd9 100644 --- a/wiki/installer.md +++ b/wiki/installer.md @@ -197,8 +197,10 @@ file list is downloaded once and handed to each run. always come from one commit. 3. Prints the file count and total size, then a safety notice counting the entries the collection cannot serve, how many of those the platform marks - required, and why. At a terminal, it then offers to install everything or - to choose systems, cores and regions (see below). + required, and why. At a terminal, the + [full-screen interface](#the-full-screen-interface) then offers to install + everything or to choose systems, cores and regions, and `--plain` asks the + same as questions (see below). 4. Hashes what is already in the destination and reports how many entries are present, verified, or present with the wrong contents. 5. Copies from this machine what it already holds: a file misplaced in the @@ -551,7 +553,10 @@ counts them (`3 fixed from copies already in the BIOS folder`). ## Choosing what to install By default the installer fetches everything the platform runs. At a terminal, -after detection, it asks: +the plan screen of the [full-screen interface](#the-full-screen-interface) +offers **Install**, **Choose systems** and **Options**. With `--plain`, or where +the full screen cannot open (a terminal smaller than 40x12, `TERM=dumb`), the +same choice comes as questions after detection: ``` RetroArch: 8069 files, 6.5 GB. @@ -905,10 +910,13 @@ forced `--platform minui` stops and asks for the card's root as `--dest`, and a card (its `Bios/`) is refused with the root to name instead. On Android a forced `--platform retroarch` falls back to `/RetroArch/system` instead, a home directory there belonging to Termux rather than to the frontend. Pass `--dest` to say where instead of -relying on that. +relying on that. When detection met a folder this user cannot open, under the +home folder or above the default, no default is taken: the frontend's own +configuration there may name another folder, so the run asks for `--dest`. -With nothing detected, the installer lists the platforms and asks. With several -detected, it asks which one. Both prompts need a terminal: piped into a script +With nothing detected, the setup screen lists the platforms to choose from, +and `--plain` gives the same list numbered. With several detected, the setup +screen lists each one, and `--plain` asks which. Both need a terminal: piped into a script with no platform to install for, it prints the manual invocation, in the form the run was started with (the one-line command for a one-liner user), and exits 1.