diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 47af25709..d355bc57d 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -4078,6 +4078,33 @@ def _network_share(name: str, guide: Guide) -> str: return "" +def _share_tabs(name: str, share: str) -> tuple[dict[str, str], dict[str, str]]: + """The command per computer for a network folder (\\\\RECALBOX\\share\\bios), + and how a Mac or a Linux desktop opens that folder first. Only Windows + had a line: a Mac user fell back to SSH or to taking the card out. + + macOS mounts smb://recalbox/share at /Volumes/share. A Linux desktop + mounts it where its file manager chooses, so that tab names the folder. + """ + host, _, rest = share.lstrip("\\").partition("\\") + volume, _, below = rest.partition("\\") + url = f"smb://{host.lower()}/{volume}" + tail = "/" + below.replace("\\", "/") if below else "" + args = { + "windows": f"--platform {name} --dest {share}", + "macos": f"--platform {name} --dest /Volumes/{volume}{tail}", + "linux": f"--platform {name} --dest /path/to/{volume}{tail}", + } + how = { + "macos": (f"In Finder, choose Go, then Connect to Server, and enter `{url}`. " + f"It opens as `/Volumes/{volume}`. Then open **Terminal**, in " + "Applications, then Utilities. Paste the line. Press Return."), + "linux": (f"Open `{url}` in your file manager. Open a terminal, paste the line " + f"and change `/path/to/{volume}` to the folder it opened. Press Enter."), + } + return args, how + + def _offline_line(name: str) -> list[str]: """The offline line, on a setup whose ZIP a release publishes: the installer reads that ZIP with no network (`--from-pack`).""" @@ -4138,10 +4165,11 @@ def _setup_routes(name: str, display: str, page_link: bool = False) -> list[str] if share or (card and guide.run == ("device",)): computer = ["## From your computer { #from-your-computer }", ""] if share: + args, how = _share_tabs(name, share) computer += [ "Needs the device on your network. Run the command on the computer.", "", - *terminal_tabs(("windows",), {"windows": f"--platform {name} --dest {share}"}), + *terminal_tabs(("windows", "macos", "linux"), args, how=how), SAFE_LINK, "", ] diff --git a/tests/test_site_r4_entry.py b/tests/test_site_r4_entry.py index ec4d423dc..404b01946 100644 --- a/tests/test_site_r4_entry.py +++ b/tests/test_site_r4_entry.py @@ -85,6 +85,20 @@ class NoZipNoUnzipText(unittest.TestCase): self.assertIn("Needs the device on your network.", text) self.assertIn(f"--platform {name} --dest {share}\n", text) + def test_a_mac_and_a_linux_desktop_reach_the_share_too(self): + """The share route was a PowerShell tab alone: a Mac user with Recalbox + on Wi-Fi fell back to SSH or to taking the card out.""" + args, how = generate_site._share_tabs("recalbox", "\\\\RECALBOX\\share\\bios") + self.assertEqual(args["macos"], "--platform recalbox --dest /Volumes/share/bios") + self.assertIn("`smb://recalbox/share`", how["macos"]) + self.assertIn("`/Volumes/share`", how["macos"]) + self.assertEqual(args["linux"], "--platform recalbox --dest /path/to/share/bios") + self.assertIn("`smb://recalbox/share`", how["linux"]) + lines = generate_site._setup_routes("recalbox", "Recalbox") + routes = "\n".join(lines[:lines.index("## On the device { #install }")]) + for label in ("Windows", "macOS", "Linux"): + self.assertIn(f'label="{label}"', routes) + def test_the_network_route_needs_a_share_and_no_zip(self): for name in SETUPS: share = generate_site._network_share(name, siteguides.GUIDES[name])