diff --git a/scripts/packreadme.py b/scripts/packreadme.py index 40da81eb..00f367b5 100644 --- a/scripts/packreadme.py +++ b/scripts/packreadme.py @@ -36,8 +36,10 @@ def _build_readme( "INSTALLATION GUIDE\n\n" " Option A: Automatic (recommended)\n" " ---------------------------------\n" - " Run this in a terminal:\n\n" + " Linux, macOS, Steam Deck: run this in a terminal:\n\n" " curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh\n\n" + " Windows: run this in PowerShell:\n\n" + " irm https://raw.githubusercontent.com/Abdess/retrobios/main/install.ps1 | iex\n\n" " The script auto-detects your RetroArch install and copies\n" " files to the correct location.\n\n" " Option B: Manual (PC)\n" @@ -104,20 +106,21 @@ def _build_readme( " ---------------------------------\n" " Open Konsole (or any terminal) and run:\n\n" " curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh\n\n" - " The script places BIOS files AND sets up standalone\n" - " emulator keys automatically.\n\n" + " The script places the BIOS files. To also copy the keys\n" + " into the standalone emulators it finds, run:\n\n" + " curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh -s -- --standalone-copies\n\n" " Option B: Manual\n" " ----------------\n" " 1. Open Dolphin file manager\n" " 2. Navigate to ~/Emulation/bios/\n" " 3. Extract all files from this archive directly into ~/Emulation/bios/\n\n" " STANDALONE EMULATORS (extra step)\n" - " Switch and 3DS emulators need keys in specific folders:\n" - " prod.keys -> ~/.local/share/yuzu/keys/\n" - " prod.keys -> ~/.local/share/eden/keys/\n" - " prod.keys -> ~/.config/Ryujinx/system/\n" - " aes_keys.txt -> ~/Emulation/bios/citra/keys/\n" - " The automatic installer handles this for you.\n\n" + " Switch and 3DS emulators need keys in their own folders:\n" + " prod.keys -> ~/.local/share/yuzu/keys/\n" + " prod.keys -> ~/.local/share/eden/keys/\n" + " prod.keys -> ~/.config/Ryujinx/system/\n" + " aes_keys.txt -> ~/.local/share/azahar/sysdata/\n" + " The installer copies them with --standalone-copies.\n\n" ), "retrodeck": ( "INSTALLATION GUIDE (Steam Deck / Linux)\n\n" @@ -169,19 +172,22 @@ def _build_readme( ), "retropie": ( "INSTALLATION GUIDE (Raspberry Pi)\n\n" - " Option A: Via network share\n" + " Option A: Automatic\n" + " -------------------\n" + " On the Pi (F4 from EmulationStation, or over SSH), run:\n\n" + " curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh\n\n" + " Option B: Via network share\n" " --------------------------\n" " 1. On your PC, open: \\\\RETROPIE\\bios\\\n" " 2. Extract all files from this archive directly into that folder\n\n" - " Option B: Via SSH\n" + " Option C: Via SSH\n" " -----------------\n" " 1. SSH into your Pi: ssh pi@retropie\n" " 2. Copy files to ~/RetroPie/BIOS/\n\n" - " Option C: Via SD card\n" - " ---------------------\n" - " 1. Put the SD card in your PC\n" - " 2. Navigate to /home/pi/RetroPie/BIOS/\n" - " 3. Extract all files from this archive directly into that folder\n\n" + " NOTE: the BIOS folder is on the card's Linux partition,\n" + " which Windows and macOS cannot open: copying through the\n" + " card works from a Linux computer only\n" + " (/home/pi/RetroPie/BIOS/).\n\n" ), } diff --git a/tests/test_audit_regressions.py b/tests/test_audit_regressions.py index 001bd445..f96059e4 100644 --- a/tests/test_audit_regressions.py +++ b/tests/test_audit_regressions.py @@ -560,6 +560,48 @@ class ADamagedArchiveIsNotPacked(unittest.TestCase): self.assertIn("set.zip", str(caught.exception)) +class PackReadmesSayWhatTheInstallerDoes(unittest.TestCase): + """The EmuDeck README promised keys set up automatically (they need + --standalone-copies) and gave a Citra path the installer never uses; the + RetroArch README offered only `| sh`, which Windows cannot run.""" + + def _guide(self, platform: str) -> str: + from packreadme import _build_readme + + text = _build_readme(platform, platform, "", 1, 1) + return text[text.index("INSTALLATION"):text.index("TROUBLESHOOTING")] + + def test_retroarch_offers_the_windows_installer(self): + guide = self._guide("retroarch") + self.assertIn("install.sh | sh", guide) + self.assertIn("install.ps1 | iex", guide) + + def test_emudeck_keys_match_the_registry_and_the_flag(self): + import re + + guide = self._guide("emudeck") + self.assertIn("--standalone-copies", guide) + self.assertNotIn("emulator keys automatically", guide) + self.assertNotIn("handles this for you", guide) + with (ROOT / "platforms" / "_registry.yml").open(encoding="utf-8") as handle: + registry = yaml.safe_load(handle) + targets = { + target.rstrip("/").replace("$HOME", "~") + for copy in registry["_standalone_copies"] + for target in copy.get("targets", {}).get("linux", []) + } + named = { + path.rstrip("/") for path in re.findall(r"-> (~/\S+)", guide) + } + self.assertTrue(named) + self.assertEqual(sorted(named - targets), []) + + def test_retropie_never_sends_a_pc_to_the_linux_partition(self): + guide = self._guide("retropie") + self.assertNotIn("Put the SD card in your PC", guide) + self.assertIn("install.sh | sh", guide) + + class FaqRegressions(unittest.TestCase): """The FAQ states facts the code owns; these tie it back to the source.