feat: say the installer and setup pages plainly

- The installer speaks without "you": the first screen asks "Where
  to install?", rows read "Copy the BIOS files from an old card or a
  folder", a close match reads "Close matches: ...". The handheld
  launchers and their port text follow, and the pronoun guard no
  longer lists any installer message.
- A setup that runs as an app opens on its one-line command, the
  folder table after it; a setup that runs on its own device keeps
  the network folder first, which its ZIP route needs.
- The home steps say what to do: "Its page gives one line to copy",
  "Paste it, press Enter".
This commit is contained in:
Abdessamad Derraz committed 2026-11-09 16:33:56 +01:00
1 parent a18262f184
commit 6c14468862
59 files changed
+312 -315

No files matched your search

+1 -1
View File
@@ -16,7 +16,7 @@
# and Invoke-WebRequest throws on a cut transfer before the hash is read:
# the site's build rewrites this line there (scripts/sitebootstrap.py).
$mismatchAdvice = "The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that."
$defaultInstallSha256 = "4b4833da4ae715233cbb075e0efe073b1ddfbe1635014470aa89e22af83dda8d"
$defaultInstallSha256 = "8dd510a5dbc2468248a74e7bb53b791729b194a6ab97e4cc9d900ffa620fa2ba"
$maximumInstallerBytes = 2MB
$installerExit = 0
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
+33 -33
View File
@@ -3278,7 +3278,7 @@ def did_you_mean(
if by_key[k] not in close:
close.append(by_key[k])
if close:
return f"Did you mean: {', '.join(close[:3])}? {listing} lists all {len(known)}."
return f"Close matches: {', '.join(close[:3])}. {listing} lists all {len(known)}."
if len(known) <= SHORT_LIST:
return f"Known: {', '.join(known)}."
return f"{listing} lists all {len(known)}."
@@ -4605,7 +4605,7 @@ def canonical_region(raw: str) -> str:
import difflib # noqa: PLC0415
close = difflib.get_close_matches(key, [*REGION_ALIASES, *REGIONS], n=3, cutoff=0.5)
hint = f" Did you mean: {', '.join(close)}?" if close else ""
hint = f" Close matches: {', '.join(close)}." if close else ""
raise ValueError(
f"unknown region: {raw.strip()}.{hint} "
f"Short forms: {', '.join(REGION_ALIASES)}. Regions: "
@@ -5632,7 +5632,7 @@ def _kept_lines() -> list[str]:
lines = []
for item in KEPT.summary():
folder = Path(item["folder"])
lines.append(f"Kept {_plural(item['files'], 'file')} you had "
lines.append(f"Kept {_plural(item['files'], 'file')} already there "
f"({format_size(item['bytes'])}), which the collection's "
f"copies replaced, in {folder}")
lines.append(f" To put them back: {_INVOCATION.launcher()} --restore "
@@ -5695,7 +5695,7 @@ def restore_kept(run: Path, dry_run: bool = False) -> int:
print(f"\nPut back {_plural(restored, 'file')} ({format_size(size)}) under {root}.")
if failed:
print(f"{_plural(failed, 'file')} could not be put back.", file=sys.stderr)
print(f"The copies are still in {run}. Delete that folder once you no longer need it.")
print(f"The copies are still in {run}. That folder can be deleted once it is no longer needed.")
return 1 if failed else 0
@@ -6319,7 +6319,7 @@ TUI_INSTALL_ROW = "Install"
TUI_SYSTEMS_ROW = "Choose systems"
# The first screen's title: a setup found here, or none, and the list.
# which-pack names them from here.
TUI_FOUND_TITLE = "Where do you play?"
TUI_FOUND_TITLE = "Where to install?"
TUI_CHOOSE_TITLE = "Which setup?"
# Asked after Which setup? where nothing was found, and on a card.
TUI_FOLDER_TITLE = "Which folder?"
@@ -6781,7 +6781,7 @@ def _offline_remedy(folders: list[str] | None = None, named: bool = False) -> st
named = ", ".join(screen_text(shown_path(label)) for label in labels)
return (f"They are not in {named}: run the installer again with a pack "
f"(--from-pack) or {offline_undo()}.")
return ("Copy them from your old card or a folder (--from), or run the installer "
return ("Copy them from an old card or a folder (--from), or run the installer "
f"again with a pack (--from-pack) or {offline_undo()}.")
@@ -6857,7 +6857,7 @@ def game_data_missing(names: str, count: int, folders: list[Path]) -> str:
# spliced into this sentence, and said again on its own line.
return (f"Not available here: {names}, game data "
f"{'its game reads' if one else 'their games read'}. Copy "
f"{'it' if one else 'them'} from your own copy of the game{where}.")
f"{'it' if one else 'them'} from an owned copy of the game{where}.")
def not_installable_words(count: int, required: int, reasons: dict[str, int]) -> str:
@@ -7101,7 +7101,7 @@ def _print_plan(
print(f" {term.bold(entry['ref'] + ' data')} {_sized(list(needed.values()))}, "
f"from {source}{archive}")
for folder, (count, size) in sorted((kept or {}).items()):
print(f"\n Would keep {_plural(count, 'file')} you have ({format_size(size)}), "
print(f"\n Would keep {_plural(count, 'file')} already there ({format_size(size)}), "
f"whose contents differ, in {folder}")
print("\n Nothing was written. Run without --dry-run to install.")
@@ -7962,8 +7962,8 @@ def _choose_platform(title: str, default: str = "", setups: list | None = None,
for piece in pieces[1:]:
print(" " * len(number) + piece)
print(" q) quit")
print("Type a number, a setup's name, or your device's name (Miyoo Mini, R36S).")
usage = (f" Type a number from 1 to {len(choices)}, a setup name or your "
print("Type a number, a setup's name, or the device's name (Miyoo Mini, R36S).")
usage = (f" Type a number from 1 to {len(choices)}, a setup name or the "
"device's name, or q to quit.")
while True:
prompt = f"> [Enter for {display_name(default)}] " if default else "> "
@@ -7992,7 +7992,7 @@ def _choose_platform(title: str, default: str = "", setups: list | None = None,
print(f" {len(found)} setups run on '{choice.strip()}':")
for index, label in found:
print(f" {index + 1}) {label}")
print(" Type the number of yours.")
print(" Type the number of the right one.")
default = ""
continue
hint = android_hint(choice, os_type)
@@ -8227,7 +8227,7 @@ def unproven_words() -> str:
names = _names_and([_mount_name(mount) for mount in drives])
has, it = ("has", "it") if len(drives) == 1 else ("have", "one")
return (f"{names} {has} a bios folder but no folder a handheld system writes. "
f"Pick {it} below if your files go there.")
f"Pick {it} below if the BIOS files go there.")
def _said_with(label: str, words: str) -> str:
@@ -8492,7 +8492,7 @@ def _prompt_platform_choice(
labels: dict | None = None,
other: Callable[[], list[tuple[str, Path]]] | None = None,
) -> list[tuple[str, Path]]:
"""One of the setups found here, as the screen's Where do you play?
"""One of the setups found here, as the screen's Where to install?
lists them: its labels, Enter taking the first as A does there, and o
for another setup or folder (other). Line mode had no Enter default, an
All the screen lacks, and no way to another setup once one was found."""
@@ -8863,7 +8863,7 @@ def folder_warnings(plat: str, bios_path: Path, files: list[dict], hint: Invocat
return lines
CANNOT_WRITE = "You cannot write to this folder"
CANNOT_WRITE = "This folder cannot be written to"
def cannot_write_words(bios_path: Path, plat: str, hint: Invocation, commands: bool,
@@ -9076,7 +9076,7 @@ def _prompt_custom_selection(
choosable = bool(axes)
if choosable:
print(f" c) choose {axes}" + (" again" if current is not given else ""))
# The screen's "Copy the BIOS files from your old card or a folder".
# The screen's "Copy the BIOS files from an old card or a folder".
copying = not dry_run
if copying:
print(" f) copy from a folder or an old card")
@@ -9162,7 +9162,7 @@ def _print_menu_head(
"regions ranked" + (" (--region)" if flag else "") if regions else ""]))
named = "" if named == ", " else named
if current is not given:
print("\n Counted again for your choices. Nothing is written before Enter.")
print("\n Counted again for these choices. Nothing is written before Enter.")
counts = tally(shown)
if emptied:
# The screen's headline for a choice that keeps no file.
@@ -12823,7 +12823,7 @@ def _check_copy_lines(
them = "it" if fixed == 1 else "them"
lines.append(f" {fixed} of these files {verb} in the BIOS folder in the wrong place: "
f"a run without --check copies {them} where the cores open {them}, and "
f"leaves your {'copy' if fixed == 1 else 'copies'} as "
f"leaves the {'copy' if fixed == 1 else 'copies'} found as "
f"{'it is' if fixed == 1 else 'they are'}.")
for label, count in _counts_by_folder(entries, copies, bios_index):
them = "it" if count == 1 else "them"
@@ -12868,7 +12868,7 @@ def copy_plan_lines(
head = (f"Would fix {sized} misplaced in the BIOS folder, copied where the "
"cores open them:" if planned else
f"Fixing {sized} misplaced in the BIOS folder: copied where the cores "
"open them, your copies left as they are.")
"open them, the copies found left as they are.")
elif key == "=":
head = (f"Would copy {sized} the BIOS folder already holds at another "
"place of the list:" if planned else
@@ -13026,7 +13026,7 @@ def bulk_hint(
return [
f" {heavy} pulls {format_size(alone[heavy])} of this "
f"{format_size(total)} download. --system naming the systems "
f"you play leaves it out and saves {format_size(alone[heavy])} "
f"played leaves it out and saves {format_size(alone[heavy])} "
f"({alone[heavy] * 100 // total}%), --list-systems names them."
]
return []
@@ -15262,7 +15262,7 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None:
assumed_dests: set[Path] = set()
named = args.platform or ""
# What detection found, with the screen's labels, and whether the setups
# found are offered as its Where do you play? offers them: always when
# found are offered as its Where to install? screen offers them: always when
# detection chose, and when a file list named the platform.
setups: list = []
mounted: set = set()
@@ -18332,7 +18332,7 @@ def _plan_rows(state: TuiState) -> list[TuiRow]:
*([TuiRow("install", "Install anyway")] if rows else [])]
# --system given: the choice stays offered, the list widened when it is
# opened. With one system named it was neither shown nor changeable.
copy = TuiRow("fromcard", "Copy the BIOS files from your old card or a folder")
copy = TuiRow("fromcard", "Copy the BIOS files from an old card or a folder")
if not rows:
# Nothing can be installed: the remedy the plan names comes first,
# in focus. Choose systems was, whose systems need the internet
@@ -19269,7 +19269,7 @@ def _no_setup_reads(state: TuiState, folder: Path | None) -> str:
if folder is None:
return ""
if folder == state.home:
return "No setup reads BIOS files in your home folder."
return "No setup reads BIOS files in the home folder."
if folder == Path(folder.anchor):
return "No setup reads BIOS files at a drive's root."
return ""
@@ -21427,7 +21427,7 @@ def _plan_lines(check: dict, dest: Path | None, state: TuiState) -> list:
f"{'is' if len(misplaced) == 1 else 'are'} in the wrong place, "
f"{'it' if len(misplaced) == 1 else 'they'} will be copied where the "
"emulators read "
f"{'it' if len(misplaced) == 1 else 'them'}, your "
f"{'it' if len(misplaced) == 1 else 'them'}, the "
f"{'copy' if len(misplaced) == 1 else 'copies'} left as "
f"{'it is' if len(misplaced) == 1 else 'they are'}.")
if backup:
@@ -21616,7 +21616,7 @@ def _view_platforms(state: TuiState, width: int, height: int) -> tuple:
# A handheld's owner knows its device, not its system's name: the
# filter finds it, and a pad that cannot type finds the cards right
# after RetroArch (_cards_first).
pinned.append("Nothing was found here. Choose the setup, or type your device's "
pinned.append("Nothing was found here. Choose the setup, or type the device's "
"name (/)." if state.pad in ("both", "keys") else
"Nothing was found here. Choose the setup: handhelds come after "
"RetroArch.")
@@ -21821,7 +21821,7 @@ def _choice_line(state: TuiState) -> list[str]:
again by a check of their own, so only ticked systems are left here."""
if tui_flags(state) == state.checked_flags:
return []
return [f"For your {len(state.ticked)} of {len(state.systems)} systems, the exact "
return [f"For the {len(state.ticked)} of {len(state.systems)} systems chosen, the exact "
"count comes before the install."]
@@ -21903,7 +21903,7 @@ def _view_plan(state: TuiState, width: int, height: int) -> tuple:
else "")] if state.regions else [])]
said = ", ".join(named)
if said and not said.startswith("for "):
said = f"for your choice: {said}"
said = f"for this choice: {said}"
# A system --system named that --no-game-data left empty, in line mode's
# words.
listed = {row["system"] for row in state.systems}
@@ -21977,7 +21977,7 @@ def _view_plan(state: TuiState, width: int, height: int) -> tuple:
else [line])]
rows = tui_rows(state)
if width < 54:
rows = [row._replace(label="Copy from your old card or a folder")
rows = [row._replace(label="Copy from an old card or a folder")
if row.action == "fromcard" else row for row in rows]
# One line: in two, a 40x12 plan dropped it, "1 wrong copy" left
# alone to say a file would be replaced.
@@ -22126,7 +22126,7 @@ def _view_systems(state: TuiState, width: int, height: int) -> tuple:
chosen = _ticked_files(state)
total = (f"{len(state.ticked)} of {len(state.systems)} systems: "
f"{_plural(len(chosen), 'file')}, {format_size(sum(e['size'] for e in chosen))}"
+ (" before your options" if _counts_predate_options(state) else ""))
+ (" before the options" if _counts_predate_options(state) else ""))
footer = [_styled(total, "title")]
focused = rows[min(state.focus.get("systems", 0), len(rows) - 1)]
drawn = str(_row_line(focused, True, width))
@@ -22210,7 +22210,7 @@ def _status_footer(state: TuiState) -> list:
def _view_cores(state: TuiState, width: int, height: int) -> tuple:
# Kept above a list that scrolls: dropped once the rows filled the
# screen, 189 cores never said what unticking does.
pinned = ["Untick the cores you do not use: the platform's own files are always kept, "
pinned = ["Untick the cores not in use: the platform's own files are always kept, "
"and a core with no extra file reads only those."]
return ("Cores", _compose(state, width, height, [], tui_rows(state), (),
_status_footer(state), pinned),
@@ -22223,7 +22223,7 @@ _STATE_WORDS = {"missing": "missing", "wrong_hash": "wrong copy"}
def _pager_items(state: TuiState) -> list:
"""The text of a screen that scrolls, the same for its view and its keys."""
if state.screen == "misplaced":
return ["They are copied where the emulators read them. Your copies stay where "
return ["They are copied where the emulators read them. The copies found stay where "
"they are.", ""] + [f"{event['dest']}: {event['reason']}"
for event in _tui_misplaced(state)]
if state.screen == "unreadable":
@@ -22311,7 +22311,7 @@ def _view_confirm(state: TuiState, width: int, height: int) -> tuple:
if str(line).startswith(_FOLDER_LABEL)), len(lines))
lines.insert(at, parts)
if any(row.action == "install" for row in tui_rows(state)):
lines.insert(0, "Counted again for your choices. Nothing is written before "
lines.insert(0, "Counted again for these choices. Nothing is written before "
"Install.")
if not any(row.action == "install" for row in tui_rows(state)) and state.dry is not None:
# Back alone: one Back on the bar, and no word of an Install. Titled
@@ -22472,7 +22472,7 @@ def unavailable_lines(needed: list[dict], manifest: dict | None, dest: Path | No
if firmware:
lines.append(f"Not available here, and needed to start "
f"{'its emulator' if len(firmware) == 1 else 'their emulators'}: "
f"{named(firmware)}. Your own copy goes in the BIOS folder.")
f"{named(firmware)}. An owned copy goes in the BIOS folder.")
if games:
lines.append(game_data_missing(named(games), len(games), [
(dest / entry["dest"]).parent for entry in games] if dest else []))
@@ -22574,7 +22574,7 @@ def tui_outcome(state: TuiState) -> tuple[str, list[str]]:
ok = {dest for dest, good, _why in state.finished if good}
if any(reason and dest in ok for dest, (_folder, reason) in state.local_dests.items()):
# A fix copies: the misplaced files are the user's, never moved.
lines.append("Your copies in the wrong place were left as they are.")
lines.append("The copies in the wrong place were left as they are.")
if _tui_categories(state) and title != "Stopped" and installed:
# As the plan counted them, and as line mode ends, on every result:
# the old card's said "6 files copied" and no kind. The data tree
+1 -1
View File
@@ -23,7 +23,7 @@ DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/ins
# curl or wget stop on a cut transfer before the hash is read: the site's
# build rewrites this line there (scripts/sitebootstrap.py).
MISMATCH_ADVICE="The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that."
DEFAULT_INSTALL_SHA256="4b4833da4ae715233cbb075e0efe073b1ddfbe1635014470aa89e22af83dda8d"
DEFAULT_INSTALL_SHA256="8dd510a5dbc2468248a74e7bb53b791729b194a6ab97e4cc9d900ffa620fa2ba"
MAX_INSTALLER_BYTES=2097152
cleanup() {
+14 -14
View File
@@ -27,8 +27,8 @@
{
"dest": "roms/ports/retrobios/install.py",
"repo_path": "install.py",
"size": 1125299,
"sha256": "4b4833da4ae715233cbb075e0efe073b1ddfbe1635014470aa89e22af83dda8d",
"size": 1125340,
"sha256": "8dd510a5dbc2468248a74e7bb53b791729b194a6ab97e4cc9d900ffa620fa2ba",
"executable": false
},
{
@@ -62,8 +62,8 @@
{
"dest": "roms/ports/retrobios/tui.txt",
"repo_path": "ports/shared/tui.txt",
"size": 36434,
"sha256": "fa05432a9a4325f3fd3220eec0548ad932dffc1888b93a08af2047cc78aa4d0c",
"size": 36432,
"sha256": "daa51e746e7930863b6e746d3beadfba615c0ad4017fee8413269a15c93ecb92",
"executable": false
}
]
@@ -71,8 +71,8 @@
"muos": {
"archive": {
"dest": "ARCHIVE/RetroBIOS.muxapp",
"size": 1178926,
"sha256": "e323c16d792945916f4352442ee7bcfcb4194f13e50d70150b05684adf2d0d88"
"size": 1178965,
"sha256": "beaf9d9caafd8e94953605a78fb878787a811646065764ed325b38223eb6a479"
},
"members": [
{
@@ -92,8 +92,8 @@
{
"name": "RetroBIOS/install.py",
"repo_path": "install.py",
"size": 1125299,
"sha256": "4b4833da4ae715233cbb075e0efe073b1ddfbe1635014470aa89e22af83dda8d",
"size": 1125340,
"sha256": "8dd510a5dbc2468248a74e7bb53b791729b194a6ab97e4cc9d900ffa620fa2ba",
"executable": false
},
{
@@ -141,8 +141,8 @@
{
"name": "RetroBIOS/tui.txt",
"repo_path": "ports/shared/tui.txt",
"size": 36434,
"sha256": "fa05432a9a4325f3fd3220eec0548ad932dffc1888b93a08af2047cc78aa4d0c",
"size": 36432,
"sha256": "daa51e746e7930863b6e746d3beadfba615c0ad4017fee8413269a15c93ecb92",
"executable": false
}
]
@@ -166,8 +166,8 @@
{
"dest": ".config/modules/retrobios/install.py",
"repo_path": "install.py",
"size": 1125299,
"sha256": "4b4833da4ae715233cbb075e0efe073b1ddfbe1635014470aa89e22af83dda8d",
"size": 1125340,
"sha256": "8dd510a5dbc2468248a74e7bb53b791729b194a6ab97e4cc9d900ffa620fa2ba",
"executable": false
},
{
@@ -208,8 +208,8 @@
{
"dest": ".config/modules/retrobios/tui.txt",
"repo_path": "ports/shared/tui.txt",
"size": 36434,
"sha256": "fa05432a9a4325f3fd3220eec0548ad932dffc1888b93a08af2047cc78aa4d0c",
"size": 36432,
"sha256": "daa51e746e7930863b6e746d3beadfba615c0ad4017fee8413269a15c93ecb92",
"executable": false
}
]
+1 -1
View File
@@ -372,7 +372,7 @@ guides:
- where: From Windows, over the home network
path: '`\\RECALBOX\share\bios\`'
run: [device]
download_hint: From a computer, use the network folder above.
download_hint: From a computer, use the network folder below.
pack_manual: |
Option B: Manual (network share)
--------------------------------
+1 -1
View File
@@ -7,7 +7,7 @@ the system, checks every file its emulators read against its hash, and
installs the missing ones.
With a network connection the files are downloaded. Without one, copy the
BIOS pack of your system (a `_BIOS_Pack.zip` file from the releases page)
BIOS pack of the system (a `_BIOS_Pack.zip` file from the releases page)
into `ports/retrobios` on the card, and RetroBIOS installs from it.
Python 3.8 or newer: the system's, or PortMaster's `python_3.11` runtime on
+1 -1
View File
@@ -13,7 +13,7 @@
],
"desc": "Checks the BIOS folder of this system against the files its emulators read, and downloads the missing ones from the RetroBIOS collection, each verified by its hash.",
"desc_md": null,
"inst": "Downloads the files with a network connection. Without one, copy the BIOS pack of your system (a _BIOS_Pack.zip file from github.com/Abdess/retrobios/releases) into ports/retrobios. Uses the system's Python 3.8 or newer, or PortMaster's python_3.11 runtime on aarch64.",
"inst": "Downloads the files with a network connection. Without one, copy the BIOS pack of the system (a _BIOS_Pack.zip file from github.com/Abdess/retrobios/releases) into ports/retrobios. Uses the system's Python 3.8 or newer, or PortMaster's python_3.11 runtime on aarch64.",
"inst_md": null,
"genres": [
"other"
+1 -1
View File
@@ -353,7 +353,7 @@ rb_screen_summary() {
;;
kept)
kept=$((kept + 1))
rb_entry "summary" "info:kept:$kept" "Kept $(rb_plural "$b" file) you had ($c)" "The collection's copies replaced them. Yours are in $a. Copy what that folder holds into the folder above retrobios-backup to put them back."
rb_entry "summary" "info:kept:$kept" "Kept $(rb_plural "$b" file) already there ($c)" "The collection's copies replaced them. Yours are in $a. Copy what that folder holds into the folder above retrobios-backup to put them back."
;;
skipped)
rb_entry "summary" "info:skipped:$a" "Not in the collection ($a): $(rb_plural "$b" file)" "Required: $c. The RetroBIOS collection does not hold these files, so they cannot be downloaded."
+2 -2
View File
@@ -863,7 +863,7 @@ rb_here() {
return 1
fi
other=$(rb_other_card)
if [ -n "$other" ] && rb_ask "Copy the BIOS files from your other card? $other holds files. RetroBIOS copies the ones this system needs, each checked by its hash, and leaves that card as it is."; then
if [ -n "$other" ] && rb_ask "Copy the BIOS files from the other card? $other holds files. RetroBIOS copies the ones this system needs, each checked by its hash, and leaves that card as it is."; then
args=(--from "$other")
fi
pack=$(rb_find_pack)
@@ -874,7 +874,7 @@ rb_here() {
if [ -z "$pack" ]; then
if [ "${#args[@]}" -gt 0 ]; then
# --from needs the list of files, which comes from the network or a pack.
rb_message "$(rb_pack_text) The pack carries the list of files: with it, the files on your other card are copied too."
rb_message "$(rb_pack_text) The pack carries the list of files: with it, the files on the other card are copied too."
else
rb_message "$(rb_pack_text)"
fi
+4 -4
View File
@@ -112,7 +112,7 @@ def load_database(db_path: str) -> dict:
)
if close:
raise DatabaseUnreadable(
f"{db_path} not found. Did you mean {typed.with_name(close[0])}?"
f"{db_path} not found. Close match: {typed.with_name(close[0])}"
) from None
raise DatabaseUnreadable(
f"{db_path} not found. Build it with: python scripts/generate_db.py "
@@ -665,7 +665,7 @@ def suggest_names(
close = sorted({m for name in typed
for m in difflib.get_close_matches(name, available, n=3, cutoff=0.6)})
if close:
return f"Did you mean: {', '.join(close)}? {listing_flag} lists all {total}."
return f"Close matches: {', '.join(close)}. {listing_flag} lists all {total}."
if len(available) <= SHORT_LIST:
return f"Known: {', '.join(available)}."
return f"{listing_flag} lists all {total}."
@@ -733,7 +733,7 @@ def require_platform(name: str, platforms_dir: str = "platforms") -> None:
known = list_registered_platforms(platforms_dir)
close = difflib.get_close_matches(name, known, n=1)
hint = f" Did you mean '{close[0]}'?" if close else ""
hint = f" Close match: '{close[0]}'." if close else ""
raise SystemExit(
f"ERROR: unknown platform '{name}'.{hint}\nKnown platforms: {', '.join(known)}"
)
@@ -3661,7 +3661,7 @@ def _unknown_target_message(target: str, platforms: list[str], platforms_dir: st
close = difflib.get_close_matches(target, sorted(owners), n=3, cutoff=0.6)
if close:
named = ", ".join(f"{n} ({', '.join(sorted(owners[n]))})" for n in close)
return f"{message} Did you mean: {named}?"
return f"{message} Close matches: {named}."
return (f"{message} python scripts/verify.py --platform <name> --list-targets "
"lists the targets of one platform.")
+8 -3
View File
@@ -517,8 +517,8 @@ def generate_home(
"## Three steps",
"",
*markup.steps([
"**Pick the device.** Its page shows the BIOS folder.",
"**Run one command.** Some setups have a ZIP.",
"**Pick the device.** Its page gives one line to copy.",
"**Paste it, press Enter.** Some setups have a ZIP.",
"**Start a game.**",
]),
*install_demo(),
@@ -4519,6 +4519,8 @@ def _platform_guide(name: str, display: str, cov: dict, registry: dict, no_list:
guide = GUIDES[name]
entry = registry.get(name, {})
extract_to = entry.get("extract_to")
# An app's page opens on the command: one line to paste is the shortest
# way to a working setup, and the folder table is what a manual copy needs.
lines = ["## Where the files go", ""]
if guide.lead:
lines += [guide.lead, ""]
@@ -4542,6 +4544,7 @@ def _platform_guide(name: str, display: str, cov: dict, registry: dict, no_list:
if guide.on_card:
lines += ["<!-- image: minui-card -->", ""]
if _computer_first(name, guide):
# The ZIP copied over the network needs the folder table above it.
lines += [
*_guide_download(name, display, guide, extract_to,
"## From a computer { #download }"),
@@ -4549,10 +4552,12 @@ def _platform_guide(name: str, display: str, cov: dict, registry: dict, no_list:
*_guide_install(name, guide, "## On the device { #install }"),
]
else:
lines += [
where = lines
lines = [
*_setup_routes(name, display, page_link=True),
*_guide_download(name, display, guide, extract_to, "## Download"),
*_offline_line(name),
*where,
]
check_args = {key: f"{args} --check" for key, args in platform_args(name, guide).items()}
lines += [
+1 -1
View File
@@ -129,7 +129,7 @@ def unknown_region_message(raw: str, aliases: dict[str, str], regions: frozenset
spelled = raw.strip()
close = difflib.get_close_matches(spelled.lower(), [*aliases, *regions], n=3, cutoff=0.5)
hint = f" Did you mean: {', '.join(close)}?" if close else ""
hint = f" Close matches: {', '.join(close)}." if close else ""
return (
f"unknown region: {spelled}.{hint} Short forms: {', '.join(aliases)}; "
f"regions: {', '.join(sorted(regions))}"
+6 -6
View File
@@ -1,5 +1,5 @@
=== setup
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where do you play?^[[0m
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where to install?^[[0m
Found on this machine:
@@ -337,7 +337,7 @@
^[[0;7;35m > Install^[[0m
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -534,8 +534,8 @@
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Untick the cores you do not use: the platform's own files are always kept, and a core with no
extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a core with no extra
file reads only those.
^[[0;7;35m > Filter (/ to type)^[[0m
[ ] mesen 1 file, 8.0 KB
@@ -657,7 +657,7 @@
=== confirm
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Confirm^[[0m
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
^[[0;1m ^[[0;1;35m1^[[0;1m file to download, ^[[0;1;35m16.0 KB^[[0m
BIOS folder: ^[[0;1m~/.config/retroarch/system^[[0m
0 in place, 1 missing, 0 wrong copies
@@ -917,7 +917,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+4 -4
View File
@@ -1,5 +1,5 @@
=== setup
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where do you play?^[[0m
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where to install?^[[0m
Found on this machine:
@@ -111,7 +111,7 @@
^[[0;33m1 wrong copy^[[0m: backed up, replaced.
^[[0;7;35m > Install^[[0m
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
^[[0;1;35mA^[[0m Install ^[[0;2mB^[[0m Back ^[[0;2mY^[[0m Options ^[[0;2m?^[[0m Help
@@ -170,7 +170,7 @@
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -209,7 +209,7 @@
=== confirm
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Confirm^[[0m
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
^[[0;1m ^[[0;1;35m1^[[0;1m file to download, ^[[0;1;35m16.0 KB^[[0m
BIOS folder: ^[[0;1m~/.co.../retroarch/system^[[0m
+5 -5
View File
@@ -1,5 +1,5 @@
=== setup
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where do you play?^[[0m
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where to install?^[[0m
Found on this machine:
@@ -138,7 +138,7 @@
^[[0;7;35m > Install^[[0m
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
^[[0;1;35mA^[[0m Install ^[[0;2mB^[[0m Back ^[[0;2mY^[[0m Options ^[[0;2m?^[[0m Help
@@ -209,7 +209,7 @@
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -257,7 +257,7 @@
=== confirm
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Confirm^[[0m
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
^[[0;1m ^[[0;1;35m1^[[0;1m file to download, ^[[0;1;35m16.0 KB^[[0m
BIOS folder: ^[[0;1m~/.co.../retroarch/system^[[0m
@@ -362,7 +362,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
^[[0;1;35mA^[[0m Install ^[[0;2mB^[[0m Back ^[[0;2mY^[[0m Options ^[[0;2m?^[[0m Help
+6 -6
View File
@@ -1,5 +1,5 @@
=== setup
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where do you play?^[[0m
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Where to install?^[[0m
Found on this machine:
@@ -209,7 +209,7 @@
^[[0;7;35m > Install^[[0m
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -326,8 +326,8 @@
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
^[[0;7;35m > Filter (/ to type)^[[0m
[ ] mesen 1 file, 8.0 KB
@@ -401,7 +401,7 @@
=== confirm
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Confirm^[[0m
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
^[[0;1m ^[[0;1;35m1^[[0;1m file to download, ^[[0;1;35m16.0 KB^[[0m
BIOS folder: ^[[0;1m~/.config/retroarch/system^[[0m
0 in place, 1 missing, 0 wrong copies
@@ -565,7 +565,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+1 -1
View File
@@ -1,6 +1,6 @@
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
+1 -1
View File
@@ -1,6 +1,6 @@
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
+1 -1
View File
@@ -1,6 +1,6 @@
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
+1 -1
View File
@@ -1,6 +1,6 @@
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
+2 -2
View File
@@ -1,7 +1,7 @@
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and a core with no
extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a core with no extra
file reads only those.
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
+1 -1
View File
@@ -1,6 +1,6 @@
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
+1 -1
View File
@@ -1,6 +1,6 @@
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
+2 -2
View File
@@ -1,7 +1,7 @@
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
+1 -1
View File
@@ -8,7 +8,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+1 -1
View File
@@ -6,7 +6,7 @@
1 wrong copy: backed up, replaced.
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options ? Help
+1 -1
View File
@@ -9,7 +9,7 @@
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options ? Help
+1 -1
View File
@@ -8,7 +8,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+1 -1
View File
@@ -14,7 +14,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+1 -1
View File
@@ -9,7 +9,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options ? Help
+1 -1
View File
@@ -14,7 +14,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+15 -15
View File
@@ -1,5 +1,5 @@
=== setup 40x12
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -12,7 +12,7 @@
ES-DE: files go to each emulator.
A Continue B Quit
=== setup 40x15
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -28,7 +28,7 @@
A Continue B Quit
=== setup 80x24
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -410,7 +410,7 @@
1 wrong copy: backed up, replaced.
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -426,7 +426,7 @@
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -441,7 +441,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -674,7 +674,7 @@
=== cores 40x12
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -687,7 +687,7 @@
=== cores 40x15
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -703,8 +703,8 @@
=== cores 80x24
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
@@ -778,7 +778,7 @@
=== confirm 40x12
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -791,7 +791,7 @@
=== confirm 40x15
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -807,7 +807,7 @@
=== confirm 80x24
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
@@ -1079,7 +1079,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -1100,7 +1100,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+15 -15
View File
@@ -1,5 +1,5 @@
=== setup 40x12
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -12,7 +12,7 @@
ES-DE: files go to each emulator.
A Continue B Quit
=== setup 40x15
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -28,7 +28,7 @@
A Continue B Quit
=== setup 80x24
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -410,7 +410,7 @@
1 wrong copy: backed up, replaced.
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -426,7 +426,7 @@
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -441,7 +441,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -674,7 +674,7 @@
=== cores 40x12
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -687,7 +687,7 @@
=== cores 40x15
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -703,8 +703,8 @@
=== cores 80x24
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
@@ -778,7 +778,7 @@
=== confirm 40x12
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -791,7 +791,7 @@
=== confirm 40x15
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -807,7 +807,7 @@
=== confirm 80x24
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
@@ -1079,7 +1079,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -1100,7 +1100,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+15 -15
View File
@@ -1,5 +1,5 @@
=== setup 40x12
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -12,7 +12,7 @@
ES-DE: files go to each emulator.
A Continue B Quit
=== setup 40x15
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -28,7 +28,7 @@
A Continue B Quit
=== setup 80x24
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -410,7 +410,7 @@
1 wrong copy: backed up, replaced.
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -426,7 +426,7 @@
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -441,7 +441,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -674,7 +674,7 @@
=== cores 40x12
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -687,7 +687,7 @@
=== cores 40x15
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -703,8 +703,8 @@
=== cores 80x24
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
@@ -778,7 +778,7 @@
=== confirm 40x12
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -791,7 +791,7 @@
=== confirm 40x15
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -807,7 +807,7 @@
=== confirm 80x24
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
@@ -1079,7 +1079,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install B Back Y Options
@@ -1100,7 +1100,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+15 -15
View File
@@ -1,5 +1,5 @@
=== setup 40x12
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -12,7 +12,7 @@
ES-DE: files go to each emulator.
Enter Continue Esc Quit ? Help
=== setup 40x15
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -28,7 +28,7 @@
Enter Continue Esc Quit ? Help
=== setup 80x24
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -385,7 +385,7 @@
1 wrong copy: backed up, replaced.
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
Enter Install Esc Back o Options
@@ -401,7 +401,7 @@
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
Enter Install Esc Back o Options
@@ -416,7 +416,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -649,7 +649,7 @@
=== cores 40x12
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -662,7 +662,7 @@
=== cores 40x15
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -678,8 +678,8 @@
=== cores 80x24
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
@@ -811,7 +811,7 @@
=== confirm 40x12
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -824,7 +824,7 @@
=== confirm 40x15
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -840,7 +840,7 @@
=== confirm 80x24
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
@@ -1157,7 +1157,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
Enter Install Esc Back o Options
@@ -1178,7 +1178,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+15 -15
View File
@@ -1,5 +1,5 @@
=== setup 40x12
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -12,7 +12,7 @@
ES-DE: files go to each emulator.
A Continue R2 Quit
=== setup 40x15
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -28,7 +28,7 @@
A Continue R2 Quit
=== setup 80x24
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -439,7 +439,7 @@
1 wrong copy: backed up, replaced.
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install R2 Back L2 Options
@@ -455,7 +455,7 @@
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install R2 Back L2 Options
@@ -470,7 +470,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -703,7 +703,7 @@
=== cores 40x12
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -716,7 +716,7 @@
=== cores 40x15
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -732,8 +732,8 @@
=== cores 80x24
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
@@ -807,7 +807,7 @@
=== confirm 40x12
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -820,7 +820,7 @@
=== confirm 40x15
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -836,7 +836,7 @@
=== confirm 80x24
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
@@ -1153,7 +1153,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
A Install R2 Back L2 Options
@@ -1174,7 +1174,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+15 -15
View File
@@ -1,5 +1,5 @@
=== setup 40x12
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -12,7 +12,7 @@
ES-DE: files go to each emulator.
Start Continue B Quit
=== setup 40x15
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -28,7 +28,7 @@
Start Continue B Quit
=== setup 80x24
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
@@ -439,7 +439,7 @@
1 wrong copy: backed up, replaced.
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
Start Install B Back
@@ -455,7 +455,7 @@
> Install
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
Start Install B Back
@@ -470,7 +470,7 @@
> Install
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
@@ -703,7 +703,7 @@
=== cores 40x12
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -716,7 +716,7 @@
=== cores 40x15
RetroBIOS: Cores
Untick the cores you do not use: the
Untick the cores not in use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
@@ -732,8 +732,8 @@
=== cores 80x24
RetroBIOS: Cores
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
Untick the cores not in use: the platform's own files are always kept, and a
core with no extra file reads only those.
> Filter (Select shows a keyboard)
[ ] mesen 1 file, 8.0 KB
@@ -865,7 +865,7 @@
=== confirm 40x12
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -878,7 +878,7 @@
=== confirm 40x15
RetroBIOS: Confirm
Counted again for your choices.
Counted again for these choices.
Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.co.../retroarch/system
@@ -894,7 +894,7 @@
=== confirm 80x24
RetroBIOS: Confirm
Counted again for your choices. Nothing is written before Install.
Counted again for these choices. Nothing is written before Install.
1 file to download, 16.0 KB
BIOS folder: ~/.config/retroarch/system
0 in place, 1 missing, 0 wrong copies
@@ -1211,7 +1211,7 @@
Only what starts: no
Show the games
Choose systems
Copy from your old card or a folder
Copy from an old card or a folder
Options
Quit
Start Install B Back
@@ -1232,7 +1232,7 @@
Only what starts: no
Show the games
Choose systems
Copy the BIOS files from your old card or a folder
Copy the BIOS files from an old card or a folder
Options
Quit
+1 -1
View File
@@ -1,4 +1,4 @@
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
+1 -1
View File
@@ -1,4 +1,4 @@
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
+1 -1
View File
@@ -1,4 +1,4 @@
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
+1 -1
View File
@@ -1,4 +1,4 @@
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
+3 -3
View File
@@ -6221,7 +6221,7 @@ class TheRepairCommandWritesTheFileNamed(unittest.TestCase):
with self.assertRaises(DatabaseUnreadable) as caught:
load_database(str(typo))
message = str(caught.exception)
self.assertIn(f"Did you mean {typo.with_name('database.json')}?", message)
self.assertIn(f"Close match: {typo.with_name('database.json')}", message)
self.assertNotIn("generate_db.py", message)
@@ -7123,7 +7123,7 @@ class PlatformSystemTypoGetsTheClosestNames(unittest.TestCase):
)
self.assertIsNone(result)
printed = out.getvalue()
self.assertIn("Did you mean: sony-playstation", printed)
self.assertIn("Close matches: sony-playstation", printed)
self.assertIn("--platform retroarch --list-systems", printed)
self.assertNotIn("3do", printed)
@@ -7423,7 +7423,7 @@ class ATargetTypoIsAnErrorInEveryTool(unittest.TestCase):
output = proc.stdout + proc.stderr
self.assertNotEqual(proc.returncode, 0)
self.assertNotIn("Traceback", output)
self.assertIn("Did you mean: switch?", output)
self.assertIn("Close matches: switch.", output)
self.assertIn("verify.py --platform retroarch --list-targets", output)
+1 -1
View File
@@ -320,7 +320,7 @@ class CoreResolutionTests(unittest.TestCase):
self.assertEqual(cf.load_core_info_record(record), {"a": "2", "b": "1"})
with self.assertRaises(cf.InputMissing) as raised:
cf.record_core_info({"a": "2", "ghosts": "1"}, ["ghost"], record)
self.assertIn("Did you mean: ghosts?", str(raised.exception))
self.assertIn("Close matches: ghosts.", str(raised.exception))
def test_record_errors_are_one_line(self):
"""A mistyped core and an empty offline cache ended on a traceback."""
+3 -3
View File
@@ -1782,7 +1782,7 @@ class TheMuosApp(unittest.TestCase):
proc = device.run([str(app / "mux_launch.sh"), str(app)], keys="\r", FAKE_CURL="7",
RB_CONSOLE=device.console, RB_BIOS_DEST=str(sd2))
self.assertEqual(proc.returncode, 0, proc.stderr.decode())
self.assertIn("Copy the BIOS files from your other card?", device.screen)
self.assertIn("Copy the BIOS files from the other card?", device.screen)
self.assertIn(str(sd1), device.screen)
[call] = device.tui_calls()
self.assertEqual(call["args"], ["--tui", "--from", str(sd1), "--from-pack", str(pack),
@@ -1899,8 +1899,8 @@ class TheToolsEntry(unittest.TestCase):
RB_CONSOLE=device.console, RB_OTHER_CARDS=f"{roms}:{roms2}")
self.assertEqual(proc.returncode, 1)
screen = " ".join(device.screen.split())
self.assertIn(f"Copy the BIOS files from your other card? {roms} holds files", screen)
self.assertIn("with it, the files on your other card are copied too", screen)
self.assertIn(f"Copy the BIOS files from the other card? {roms} holds files", screen)
self.assertIn("with it, the files on the other card are copied too", screen)
self.assertEqual(device.tui_calls(), [])
def test_amberelec_console(self):
+6 -6
View File
@@ -5240,7 +5240,7 @@ class ATypoGetsTheClosestName(unittest.TestCase):
err = io.StringIO()
with contextlib.redirect_stderr(err), self.assertRaises(SystemExit):
install.normalize_platform("spruce")
self.assertIn("Did you mean: spruceOS?", err.getvalue())
self.assertIn("Close matches: spruceOS.", err.getvalue())
# The distinct names --list-platforms prints: Batocera is both a
# platform and a system it recognises.
names = [*install.AVAILABLE_PLATFORMS,
@@ -5254,7 +5254,7 @@ class ATypoGetsTheClosestName(unittest.TestCase):
with contextlib.redirect_stderr(err), self.assertRaises(SystemExit) as raised:
install.normalize_platform("batocra")
self.assertEqual(raised.exception.code, 2)
self.assertIn("Did you mean: batocera?", err.getvalue())
self.assertIn("Close matches: batocera.", err.getvalue())
self.assertNotIn("recalbox", err.getvalue())
def test_a_system_is_found_inside_its_full_id(self):
@@ -5272,7 +5272,7 @@ class ATypoGetsTheClosestName(unittest.TestCase):
with self.assertRaises(ValueError) as raised:
install.resolve_choices(["swanstaton"], known, "core")
text = str(raised.exception)
self.assertIn("Did you mean: swanstation?", text)
self.assertIn("Close matches: swanstation.", text)
self.assertIn("--list-cores lists all 201", text)
self.assertNotIn("core17", text)
@@ -5287,7 +5287,7 @@ class ATypoGetsTheClosestName(unittest.TestCase):
err = io.StringIO()
with contextlib.redirect_stderr(err), self.assertRaises(SystemExit):
install._unknown_target("swich", "retroarch", {"switch": {}, "desktop": {}})
self.assertIn("Did you mean: switch?", err.getvalue())
self.assertIn("Close matches: switch.", err.getvalue())
self.assertIn("--list-targets", err.getvalue())
@@ -7423,7 +7423,7 @@ class KeptFilesEndToEnd(unittest.TestCase, _SyntheticTree):
proc = _install_run(self.env, "--platform", "retroarch", "--dest", str(self.bios),
"--dry-run", "--no-input")
self.assertEqual(proc.returncode, 0, proc.stderr)
self.assertIn("Would keep 1 file you have (11 B)", proc.stdout)
self.assertIn("Would keep 1 file already there (11 B)", proc.stdout)
self.assertIn(str(self.home / install.BACKUP_DIR), proc.stdout)
self.assertFalse((self.home / install.BACKUP_DIR).exists())
self.assertEqual((self.bios / "b.bin").read_bytes(), b"other bytes")
@@ -7440,7 +7440,7 @@ class KeptFilesEndToEnd(unittest.TestCase, _SyntheticTree):
self.assertEqual((self.bios / "b.bin").read_bytes(), self.FILES["bios/A/b.bin"])
runs = list((self.home / install.BACKUP_DIR).iterdir())
self.assertEqual(len(runs), 1)
self.assertIn("Kept 1 file you had (11 B), which the collection's copies "
self.assertIn("Kept 1 file already there (11 B), which the collection's copies "
f"replaced, in {runs[0]}", proc.stdout)
self.assertIn(f"--restore {runs[0]}", proc.stdout)
# a.bin held the expected bytes: it is not among the kept files.
+1 -1
View File
@@ -442,7 +442,7 @@ class MisplacedInTheBiosFolder(Scratch):
out = self.check()
self.assertIn("4 of these files are in the BIOS folder in the wrong place: a run "
"without --check copies them where the cores open them, and leaves "
"your copies as they are.", out)
"the copies found as they are.", out)
self.assertFalse((self.dest / "scph5501.bin").exists())
def test_dry_run_counts_them_and_writes_nothing(self):
+1 -1
View File
@@ -1040,7 +1040,7 @@ class OneOfflineVocabulary(Scratch):
self.assertEqual(proc.returncode, 3, out)
self.assertNotIn("to fetch them", out)
self.assertIn("4 files need the internet, which --offline does not use.", out)
self.assertIn("Copy them from your old card or a folder (--from)", out)
self.assertIn("Copy them from an old card or a folder (--from)", out)
def test_the_screen_says_missing_not_failed(self):
"""On the full screen: "Finished with errors, 20 failed"."""
+8 -8
View File
@@ -326,7 +326,7 @@ class CommandLineChoices(unittest.TestCase):
("genesis", "sega-mega-drive"), ("gb", "nintendo-gb")):
with self.subTest(typed=typed), self.assertRaises(ValueError) as ctx:
install.resolve_choices([typed], known, "system")
self.assertIn(f"Did you mean: {meant}", str(ctx.exception))
self.assertIn(f"Close matches: {meant}", str(ctx.exception))
def test_a_short_name_for_a_system_the_list_lacks_is_not_suggested(self):
with self.assertRaises(ValueError) as ctx:
@@ -1345,7 +1345,7 @@ class ThePlatformsOwnSystemNamesAreAccepted(unittest.TestCase):
self.assertIn("nintendo-gba (gba)", listing.stdout)
typo = repo.run("--system", "psxx", "--no-input")
self.assertEqual(typo.returncode, 2)
self.assertIn("Did you mean: sony-playstation", typo.stderr)
self.assertIn("Close matches: sony-playstation", typo.stderr)
@@ -1484,7 +1484,7 @@ class SystemNamesResolveOneWay(unittest.TestCase):
with self.assertRaises(ValueError) as caught:
self._resolve("psx,psxx")
self.assertIn("unknown system psxx", str(caught.exception))
self.assertIn("Did you mean: psx?", str(caught.exception))
self.assertIn("Close matches: psx.", str(caught.exception))
class AnUnknownNativeNameIsRefusedBeforeAnyWork(unittest.TestCase):
@@ -1504,7 +1504,7 @@ class AnUnknownNativeNameIsRefusedBeforeAnyWork(unittest.TestCase):
cwd=REPO_ROOT, capture_output=True, text=True, timeout=300,
)
self.assertEqual(proc.returncode, 2, proc.stdout + proc.stderr)
self.assertIn("unknown system psxx. Did you mean: psx?", proc.stderr)
self.assertIn("unknown system psxx. Close matches: psx.", proc.stderr)
self.assertNotIn("Traceback", proc.stderr)
self.assertFalse((REPO_ROOT / "tmp" / "never").exists())
@@ -1634,7 +1634,7 @@ class ThePlatformsOwnListAlone(unittest.TestCase):
class AnIdAnotherSetupUses(unittest.TestCase):
"""The Neo Geo card offers `--system snk-neogeo`, and RetroArch, which
files neogeo.zip under arcade, answered "Did you mean: snk-neogeo-cd?"."""
files neogeo.zip under arcade, answered "Close matches: snk-neogeo-cd."."""
KNOWN = ["arcade", "snk-neogeo-cd", "sony-playstation"]
HOLDERS = {"snk-neogeo": ["arcade"]}
@@ -1649,12 +1649,12 @@ class AnIdAnotherSetupUses(unittest.TestCase):
for typed in ("snk-neogeo", "SNK-NeoGeo", "neogeo", "mvs", "aes"):
with self.subTest(typed=typed):
text = self._refusal(typed)
self.assertIn("Did you mean: arcade?", text)
self.assertIn("Close matches: arcade.", text)
self.assertIn("neogeo.zip", text)
self.assertNotIn("snk-neogeo-cd", text)
def test_a_typo_still_gets_the_closest_names(self):
self.assertIn("Did you mean: snk-neogeo-cd", self._refusal("snk-neogeo-dc", {}))
self.assertIn("Close matches: snk-neogeo-cd", self._refusal("snk-neogeo-dc", {}))
def test_holders_are_read_from_the_file_list(self):
files = [
@@ -1676,7 +1676,7 @@ class AnIdAnotherSetupUses(unittest.TestCase):
capture_output=True, text=True, timeout=120, check=False,
stdin=subprocess.DEVNULL)
self.assertEqual(proc.returncode, 2, proc.stdout + proc.stderr)
self.assertIn("Did you mean: arcade?", proc.stderr)
self.assertIn("Close matches: arcade.", proc.stderr)
self.assertNotIn("snk-neogeo-cd", proc.stderr)
self.assertFalse(never.exists())
+58 -58
View File
@@ -815,7 +815,7 @@ class PlanWarnings(unittest.TestCase):
state = checked_state({"free": 1024, "writable": False, "cores": []})
text = " ".join(install.tui_view(state, 120, 40))
self.assertIn("Not enough free space: 1.0 MB needed.", text)
self.assertIn("You cannot write to this folder: choose another one.", text)
self.assertIn("This folder cannot be written to: choose another one.", text)
# sudo changes the home folder: the advice names this one.
self.assertIn("Or run it as root, this folder named: sudo python3 install.py "
f"--platform retroarch --dest {SYSTEM_DIR}",
@@ -1549,10 +1549,10 @@ class SmallFixes(unittest.TestCase):
def test_numbers_from_before_the_options_say_so(self):
state = checked_state()
state.stack.append("systems")
self.assertNotIn("before your options", "\n".join(install.tui_view(state, 80, 24)))
self.assertNotIn("before the options", "\n".join(install.tui_view(state, 80, 24)))
state.regions = ["japan"]
footer = "\n".join(install.tui_view(state, 80, 24)[-3:])
self.assertIn("before your options", footer)
self.assertIn("before the options", footer)
def test_a_cores_folder_implies_the_installed_cores(self):
state = checked_state()
@@ -2156,7 +2156,7 @@ class CopyFromAnOldCard(unittest.TestCase):
state = checked_state()
row = next(i for i, r in enumerate(install.tui_rows(state)) if r.action == "fromcard")
self.assertEqual(install.tui_rows(state)[row].label,
"Copy the BIOS files from your old card or a folder")
"Copy the BIOS files from an old card or a folder")
state.focus["plan"] = row
state.home = old
with mock.patch.object(install, "_mounted_cards", return_value=[]):
@@ -2224,7 +2224,7 @@ class CopyFromAnOldCard(unittest.TestCase):
# a fix copies, and the screen says the user's
# copy stays.
self.assertIn("1 file is in the wrong place, it will be copied where the emulators "
"read it, your copy left as it is.", text)
"read it, the copy left as it is.", text)
row = next(i for i, r in enumerate(install.tui_rows(state)) if r.action == "misplaced")
state.focus["plan"] = row
press(state, "enter")
@@ -2245,7 +2245,7 @@ class CopyFromAnOldCard(unittest.TestCase):
state.finished = [("scph5500.bin", True, ""), ("gba_bios.bin", True, "")]
text = " ".join(" ".join(install.tui_outcome(state)[1]).split())
self.assertIn("1 file copied from the wrong place in the BIOS folder, 1 downloaded. "
"Your copies in the wrong place were left as they are.", text)
"The copies in the wrong place were left as they are.", text)
def test_a_local_copy_is_no_download_speed(self):
state = checked_state()
@@ -2681,7 +2681,7 @@ class CardsSpaceAndConfirm(unittest.TestCase):
state = self.unavailable_state()
_title, lines = install.tui_outcome(state)
self.assertIn("Not available here, and needed to start its emulator: gba_extra.bin "
"(Game Boy Advance). Your own copy goes in the BIOS folder.", lines)
"(Game Boy Advance). An owned copy goes in the BIOS folder.", lines)
self.assertNotIn("collection", " ".join(lines))
def test_it_is_left_out_when_it_does_not_concern_the_run(self):
@@ -3812,7 +3812,7 @@ class BackTicksAndSaveFolder(unittest.TestCase):
rows = [row.action for row in install.tui_rows(state)]
text = " ".join(" ".join(install.tui_view(state, 120, 40)).split())
self.assertEqual(rows, ["back"])
self.assertIn("Copy them from your old card or a folder", text)
self.assertIn("Copy them from an old card or a folder", text)
state.found = [{"event": "found", "platform": "retroarch",
"dest": FILES[0]["dest"], "folder": "/media/old",
"path": "/media/old/x", "member": "", "reason": ""}]
@@ -3843,7 +3843,7 @@ class BackTicksAndSaveFolder(unittest.TestCase):
state = checked_state()
state.stack.append("misplaced")
self.assertEqual(install._pager_items(state)[0],
"They are copied where the emulators read them. Your copies stay "
"They are copied where the emulators read them. The copies found stay "
"where they are.")
def test_the_save_folder_is_a_line_of_its_own(self):
@@ -4273,9 +4273,9 @@ class AGoesIntoASubfolder(unittest.TestCase):
with mock.patch.object(install, "_mounted_cards", return_value=[self.card]):
install._browse_to(self.state, self.home)
self.assertEqual(self.focused().label, ".cache/")
self.assertIn("No setup reads BIOS files in your home folder", self.state.status)
self.assertIn("No setup reads BIOS files in the home folder", self.state.status)
screen = " ".join(" ".join(install.tui_view(self.state, 80, 24)).split())
self.assertIn("No setup reads BIOS files in your home folder.", screen)
self.assertIn("No setup reads BIOS files in the home folder.", screen)
def test_on_windows_the_other_drives_are_passed_over(self):
"""The card rows are drive roots there (E:\\): at D:\\ the first
@@ -4850,7 +4850,7 @@ class EndToEnd(unittest.TestCase):
def test_three_presses_install_everything(self):
repo = self.repo()
term = self.start()
screen = term.wait("Where do you play?")
screen = term.wait("Where to install?")
self.assertIn("> RetroArch", screen)
term.send("\r")
screen = term.wait("files to download")
@@ -4899,7 +4899,7 @@ class EndToEnd(unittest.TestCase):
self.assertIn("6 files installed", proc.stdout)
else:
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
screen = term.wait("files to download")
self.assertIn("6 files to download", screen)
@@ -5058,7 +5058,7 @@ class EndToEnd(unittest.TestCase):
def test_ctrl_c_on_the_first_screen(self):
self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\x03")
self.assertEqual(term.close(), 130)
self.assertIn(b"\x1b[?2004l\x1b[0m\x1b[?25h\x1b[?1049l", term.raw)
@@ -5068,7 +5068,7 @@ class EndToEnd(unittest.TestCase):
self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
mark = len(term.raw)
os.kill(term.pid, signal.SIGTSTP)
end = time.monotonic() + 10
@@ -5093,11 +5093,11 @@ class EndToEnd(unittest.TestCase):
"""The terminal gone, the farewell has nowhere to go: the code is
129 (SIGHUP), not 120 from the flush failing at exit."""
self.repo()
for screen_name, keys_first in (("Where do you play?", ()),
for screen_name, keys_first in (("Where to install?", ()),
("files to download", ("\r",))):
with self.subTest(screen=screen_name):
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send(*keys_first)
term.wait(screen_name)
os.close(term.fd)
@@ -5146,12 +5146,12 @@ class EndToEnd(unittest.TestCase):
self.repo()
self.env[install.TUI_IDLE_ENV] = "1"
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
self.assertEqual(term.close(), install.QUIT_CODE)
self.assertIn("No button pressed, closing.", term.after())
# A key pressed, the screen stays: the person is there.
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send(DOWN)
end = time.monotonic() + 2.5
while time.monotonic() < end:
@@ -5181,7 +5181,7 @@ class EndToEnd(unittest.TestCase):
with self.subTest(env=env):
self.env.update(env)
term = self.start(cols=40, rows=12)
term.wait("Where do you play?")
term.wait("Where to install?")
screen = term.wait(bar)
self.assertEqual(screen.splitlines()[-1].strip(), bar)
term.send("q")
@@ -5192,7 +5192,7 @@ class EndToEnd(unittest.TestCase):
def test_resize_redraws(self):
self.repo()
term = self.start(cols=40, rows=15)
term.wait("Where do you play?")
term.wait("Where to install?")
term.resize(100, 30)
term.send(DOWN)
screen = term.wait("> Another setup or folder")
@@ -5200,7 +5200,7 @@ class EndToEnd(unittest.TestCase):
term.resize(30, 10)
term.wait("40x12 or more, now 30x10")
term.resize(40, 12)
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("q")
self.assertEqual(term.close(), install.QUIT_CODE)
@@ -5278,7 +5278,7 @@ class EndToEnd(unittest.TestCase):
self.env.pop("NO_COLOR", None)
self.env.update({"TERM": "xterm", **env})
term = self.start()
screen = term.wait("Where do you play?")
screen = term.wait("Where to install?")
self.assertIn("> RetroArch", screen)
screens[name] = screen
# pyte reads the colours drawn: RetroBIOS in the accent.
@@ -5511,7 +5511,7 @@ class TheTerminalComesBack(unittest.TestCase):
def ended(self, how) -> Pty:
self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
# Every way out below starts with the clicks asked for, written
# right after the frame.
term.settle()
@@ -5571,7 +5571,7 @@ class TheTerminalComesBack(unittest.TestCase):
job control it stops, and fg brings the screen back."""
term = self.shell()
self.typed(term, f"{shlex.quote(sys.executable)} {REPO_ROOT / 'install.py'} --tui")
term.wait("Where do you play?")
term.wait("Where to install?")
mark = len(term.raw)
term.send("\x1a")
end = time.monotonic() + 10
@@ -5586,7 +5586,7 @@ class TheTerminalComesBack(unittest.TestCase):
while b"\x1b[?1049h" not in term.raw[mark:] and time.monotonic() < end:
term._pump(0.05)
self.assertIn(b"\x1b[?1049h", term.raw[mark:])
term.wait("Where do you play?")
term.wait("Where to install?")
self.assertFalse(termios.tcgetattr(term.fd)[3] & termios.ECHO)
# The clicks come back with the screen.
term.settle()
@@ -5608,7 +5608,7 @@ class TheTerminalComesBack(unittest.TestCase):
term = Pty(["--tui"], self.env, program=program)
self.addCleanup(lambda term=term: term.status is None
and os.killpg(term.pid, 9))
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\x1a")
screen = term.wait("Ctrl-Z is ignored")
self.assertIn("no shell started this installer", " ".join(screen.split()))
@@ -5664,7 +5664,7 @@ class TheTerminalComesBack(unittest.TestCase):
self.addCleanup(lambda: term.status is None and os.killpg(term.pid, 9))
term.wait("PROMPT$")
self.typed(term, f"sh {REPO_ROOT / 'install.sh'} --jobs 1")
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("to download")
term.send("\r")
@@ -6231,7 +6231,7 @@ class ConfirmRefusalsAndCardRows(unittest.TestCase):
# Back alone, no word of an Install.
self.assertNotIn("before Install", text)
self.assertNotIn("backup folder", text)
self.assertIn("Copy them from your old card", text)
self.assertIn("Copy them from an old card", text)
# The short names at 40 columns, as every screen of that width.
self.assertEqual(view[-1].strip(), "A Back ? Help")
@@ -6756,7 +6756,7 @@ class WhatEachScreenOffers(unittest.TestCase):
self.assertIn("handhelds come after RetroArch", " ".join(text.split()))
state.pad = "keys"
text = " ".join(" ".join(install.tui_view(state, 80, 24)).split())
self.assertIn("type your device's name (/)", text)
self.assertIn("type the device's name (/)", text)
self.assertIn("Filter by setup or device name",
[what for _key, what in install._help_lines(state)])
# Something found here: the list keeps its order.
@@ -6769,7 +6769,7 @@ class WhatEachScreenOffers(unittest.TestCase):
with mock.patch.object(install, "_ask", side_effect=["bittboy"]), \
contextlib.redirect_stdout(io.StringIO()) as out:
self.assertEqual(install._choose_platform("Which?"), "MiyooCFW")
self.assertIn("your device's name", out.getvalue())
self.assertIn("the device's name", out.getvalue())
choices = install._line_setups()
onion = [name for name, _label in choices].index("Onion") + 1
with mock.patch.object(install, "_ask", side_effect=["miyoo mini+", str(onion)]), \
@@ -6841,7 +6841,7 @@ class WhatEachScreenOffers(unittest.TestCase):
self.assertIn("Not in from1: ", text)
self.assertIn("Run the installer again with a pack (--from-pack)", text)
self.assertNotIn("They are not in", text)
self.assertNotIn("Copy them from your old card", text)
self.assertNotIn("Copy them from an old card", text)
def test_the_card_browser_focuses_the_card_asked_for(self):
"""The muOS card, listed first, was focused for Onion."""
@@ -7317,7 +7317,7 @@ class _LineModeFindings(_CardFixtures):
with mock.patch.object(install, "_folder_writable", return_value=False), \
mock.patch.object(install, "_on_read_only_mount", return_value=False):
lines = install.folder_warnings("retroarch", self.root, [], hint, True, False)
self.assertIn("You cannot write to this folder: run it again with another --dest.",
self.assertIn("This folder cannot be written to: run it again with another --dest.",
lines)
self.assertNotIn("choose another one", " ".join(lines))
with mock.patch.object(install, "_folder_writable", return_value=False), \
@@ -8184,7 +8184,7 @@ class LineModeAndScreenDecideAlike(_LineModeFindings, _OutsideTextFindings,
listing = self.listing("retroarch", files)
args = _args(manifest=listing, dest=self.here, declared_only=False)
text, asked = self.line_run(args, ["c", "1"])
self.assertIn("Counted again for your choices. Nothing is written before Enter.", text)
self.assertIn("Counted again for these choices. Nothing is written before Enter.", text)
self.assertIn("RetroArch: 1 file, 3 B, for 1 of 2 systems.", text)
self.assertIn("Enter) install these", text)
self.assertEqual(asked[-1], "> ")
@@ -8517,7 +8517,7 @@ class LineModeAndScreenDecideAlike(_LineModeFindings, _OutsideTextFindings,
self.assertNotRegex(text, r"Narrowed (\d+) to \1 files")
text, _asked = self.line_run(_args(**args), ["c", "1", ""])
# The menu counted the choice again before Enter: said once.
self.assertIn("Counted again for your choices", text)
self.assertIn("Counted again for these choices", text)
self.assertNotIn("Narrowed", text)
args = _args(manifest=self.counted_list(), dest=self.here, declared_only=False,
dry_run=True, no_input=True, system=["doom"])
@@ -8857,7 +8857,7 @@ class PacksWordingAndDocs(unittest.TestCase):
state.dest = state.home
lines = " ".join(str(line) for line in install._plan_lines(state.check, state.dest,
state))
self.assertIn("No setup reads BIOS files in your home folder.", lines)
self.assertIn("No setup reads BIOS files in the home folder.", lines)
def test_systems_seen_and_left_unchanged_keep_the_exact_plan(self):
"""Opening Choose systems on a --system plan and
@@ -10688,14 +10688,14 @@ class MouseOnAPty(unittest.TestCase):
def test_taps_choose_a_row_and_press_the_bar(self):
self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.settle()
self.assertIn(install._MOUSE_ON.encode(), term.raw)
row = self.line_of(term, "Another setup")
self.click(term, 60, row)
term.settle()
self.assertTrue(term.screen.buffer[row][3].reverse, term.text())
self.assertIn("Where do you play?", term.text())
self.assertIn("Where to install?", term.text())
self.click(term, 60, row)
term.wait("Which setup?")
# The bar's ? Help, pressed by a click.
@@ -11333,7 +11333,7 @@ class TapsOnAPty(unittest.TestCase):
def test_taps_on_systems_tick_and_write_nothing(self):
repo = self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("> Install")
row = self.line_of(term, "Choose systems")
@@ -11360,7 +11360,7 @@ class TapsOnAPty(unittest.TestCase):
def test_the_result_is_left_by_a_tap_on_exit(self):
self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("files to download")
row = self.line_of(term, "> Install")
@@ -12238,7 +12238,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
def test_one_tap_on_the_bar_install_installs_nothing(self):
repo = self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("> Install")
term.settle()
@@ -12253,7 +12253,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
def test_a_double_tap_on_continue_neither_quits_nor_installs(self):
repo = self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.settle()
col, line = self.bar_entry(term, "Continue")
report = sgr(col + 1, line + 1) + sgr(col + 1, line + 1, release=True)
@@ -12275,7 +12275,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
with self.subTest(gap=gap):
repo = self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.settle()
time.sleep(install.TUI_TAP_SETTLE)
col, line = self.bar_entry(term, "Continue")
@@ -12285,7 +12285,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
time.sleep(gap)
os.write(term.fd, (press + release).encode())
screen = term.settle(0.8)
self.assertNotIn("Where do you play?", screen)
self.assertNotIn("Where to install?", screen)
self.assertNotIn("Quit?", screen)
term.wait("> Install")
self.assertEqual(repo.installed(), [])
@@ -12295,7 +12295,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
def test_continue_then_install_in_one_cell_stops_on_confirm(self):
repo = self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("> Install")
row = self.line_of(term, "Choose systems")
@@ -12321,7 +12321,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
report = sgr(col + 1, line + 1) + sgr(col + 1, line + 1, release=True)
time.sleep(install.TUI_TAP_SETTLE)
term.send(report + report)
term.wait("Counted again for your choices")
term.wait("Counted again for these choices")
screen = term.settle(0.6)
self.assertIn("RetroBIOS: Confirm", screen)
self.assertEqual(repo.installed(), [])
@@ -12338,7 +12338,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
repo = self.repo(GameDataRepository)
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("> Install")
for _step in range(8):
@@ -12381,7 +12381,7 @@ class TapsOnAPtySeeFirst(unittest.TestCase):
def test_two_taps_on_a_region_untick_it_where_it_was(self):
self.repo()
term = self.start()
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("> Install")
term.send("o")
@@ -12465,7 +12465,7 @@ class ChoiceStateInBothModes(unittest.TestCase):
text, asked = self.line_run(_args(manifest=self.game_listing(), dest=self.here,
declared_only=False),
["c", "2", "g", ""])
menu = text.rsplit("Counted again for your choices", 1)[1]
menu = text.rsplit("Counted again for these choices", 1)[1]
self.assertIn("RetroArch: sega-dreamcast holds only game data: nothing is left to "
"install.", menu)
self.assertNotIn("0 files, 0 B", menu)
@@ -12887,9 +12887,9 @@ class DriveIsACardByItsFiles(unittest.TestCase):
# The note on drives with a bios folder and no handheld's folder.
UNPROVEN_TWO = ("DATA and STICK have a bios folder but no folder a handheld system "
"writes. Pick one below if your files go there.")
"writes. Pick one below if the BIOS files go there.")
UNPROVEN_ONE = ("DATA has a bios folder but no folder a handheld system writes. Pick "
"it below if your files go there.")
"it below if the BIOS files go there.")
def test_the_layouts_handhelds_write_are_cards(self):
"""ArkOS's EASYROMS, AmberELEC's GAMES and EmuELEC's EEROMS, each
@@ -13047,7 +13047,7 @@ class TheSettleRunsFromTheFrameShown(unittest.TestCase):
env = {**self.env, "SLOW": "0.5"}
term = Pty([], env, 80, 24, program=[sys.executable, str(wrapper)])
self.addCleanup(lambda: term.status is None and os.kill(term.pid, 9))
term.wait("Where do you play?")
term.wait("Where to install?")
term.send("\r")
term.wait("> Install")
term.settle()
@@ -13816,7 +13816,7 @@ class ProvenCardsAndCounts(unittest.TestCase):
text, _asked = self.line_run(_args(manifest=listing, dest=dest, platform="retroarch",
declared_only=False, dry_run=True), [])
self.assertIn("Not available here: jazz2/Source/Anims.j2a (Jazz Jackrabbit 2), game "
"data its game reads. Copy it from your own copy of the game into "
"data its game reads. Copy it from an owned copy of the game into "
f"{dest / 'jazz2' / 'Source'}{os.sep}.", text)
self.assertEqual(install.not_installable_words(37, 1, {"not_found": 37}),
"Not installable: 37 files are not in the collection, 1 of them "
@@ -14012,7 +14012,7 @@ class ProvenCardsAndCounts(unittest.TestCase):
mounts = [data, stick]
state, text, rows = self.folder_screen(mounts)
self.assertIn("DATA and STICK have a bios folder but no folder a handheld system "
"writes. Pick one below if your files go there.", text)
"writes. Pick one below if the BIOS files go there.", text)
labels = [row.label for row in rows]
self.assertIn("DATA: bios (drive)", labels)
self.assertIn("STICK: bios (drive)", labels)
@@ -14167,7 +14167,7 @@ class ProvenCardsAndCounts(unittest.TestCase):
declared_only=False, dry_run=True),
["c", "", "2"])
self.assertIn("Every core's extra files are kept: Enter keeps them all", text)
head = text.rsplit("Counted again for your choices", 1)[1]
head = text.rsplit("Counted again for these choices", 1)[1]
self.assertIn("1 of 2 cores", head)
self.assertEqual(install.cores_words(0, 2), "0 of 2 cores")
self.assertEqual(install.cores_words(2, 2), "all cores")
@@ -14287,7 +14287,7 @@ class CoresListAndFolderFailures(unittest.TestCase):
text, _asked = self.line_run(
_args(manifest=listing, dest=self.root / "dest", declared_only=False,
dry_run=True, no_game_data=no_game_data), ["c", "", "1"])
head = text.rsplit("Counted again for your choices", 1)[1]
head = text.rsplit("Counted again for these choices", 1)[1]
self.assertIn(f"1 of {len(expected)} cores", head)
state.cores = ["mesen"]
self.assertIn(f"1 of {len(expected)}",
@@ -14443,7 +14443,7 @@ class CoresListAndFolderFailures(unittest.TestCase):
state.os_type = "android"
for cols, rows in ((40, 12), (80, 24)):
text = self.text(state, cols, rows)
self.assertIn("You cannot write to this folder", text)
self.assertIn("This folder cannot be written to", text)
self.assertNotIn("sudo", text)
# Root cause 4: every proven card named, the real marker said.
@@ -14552,7 +14552,7 @@ class CoresListAndFolderFailures(unittest.TestCase):
state = checked_state()
state.regions = ["japan"]
text = self.text(state, 100, 30)
self.assertIn("For your choice: regions ranked.", text)
self.assertIn("For this choice: regions ranked.", text)
self.assertNotIn(" --region.", text)
def test_offline_choice_of_systems_is_never_about_0_files(self):
+2 -2
View File
@@ -293,10 +293,10 @@ class RecordsNameNoLocalPath(unittest.TestCase):
def test_the_summary_names_the_options(self) -> None:
root = Path("/srv/run/tmp/pack_probe/retroarch/installer")
out = (f"Copy it from your own copy of the game into {root / 'system'}/jazz2/Source/.\n"
out = (f"Copy it from an owned copy of the game into {root / 'system'}/jazz2/Source/.\n"
f"Saves go to {root / 'saves'}.\n")
summary = pp.installer_summary(out, root / "system", root / "saves")
self.assertEqual(summary, "Copy it from your own copy of the game into <dest>/jazz2/Source/. "
self.assertEqual(summary, "Copy it from an owned copy of the game into <dest>/jazz2/Source/. "
"Saves go to <save-dir>.")
def test_no_committed_record_holds_a_local_path(self) -> None:
+1 -1
View File
@@ -440,7 +440,7 @@ class TheScreens(unittest.TestCase):
])
summary = [s for s in shown if s[:2] == ("list", "summary")][0][2]
self.assertEqual(summary["info:result"][0], "Installed: 2 files")
self.assertEqual(summary["info:kept:1"][0], "Kept 1 file you had (100 B)")
self.assertEqual(summary["info:kept:1"][0], "Kept 1 file already there (100 B)")
self.assertIn("/roms/retrobios-backup/20261022-153000", summary["info:kept:1"][1])
self.assertEqual(self.calls(), [
"--check --events",
+1 -1
View File
@@ -5639,7 +5639,7 @@ class TestSelectionNamesWhatMatchedNothing(unittest.TestCase):
def test_a_misspelt_emulator_suggests(self):
with self.assertRaises(SystemExit) as caught:
profile_sync.select_profiles(self.PROFILES, self._args(emulator="handyy"))
self.assertIn("Did you mean: handy", str(caught.exception.code))
self.assertIn("Close matches: handy", str(caught.exception.code))
def test_a_matching_filter_selects(self):
selected = profile_sync.select_profiles(self.PROFILES, self._args(system="atari-lynx"))
+2 -2
View File
@@ -1045,7 +1045,7 @@ class UnknownRegionSaysWhatToType(unittest.TestCase):
with self.assertRaises(ValueError) as caught:
region.parse_requested("uss")
message = str(caught.exception)
self.assertIn("Did you mean: us", message)
self.assertIn("Close matches: us", message)
self.assertIn("Short forms: jp", message)
def test_the_installer_says_the_same(self):
@@ -1058,7 +1058,7 @@ class UnknownRegionSaysWhatToType(unittest.TestCase):
spec.loader.exec_module(install)
with self.assertRaises(ValueError) as caught:
install.canonical_region("europ")
self.assertIn("Did you mean: europe", str(caught.exception))
self.assertIn("Close matches: europe", str(caught.exception))
self.assertIn("Short forms:", str(caught.exception))
+3 -2
View File
@@ -92,7 +92,8 @@ class TrustItemsSayWhereItWrites(unittest.TestCase):
self.assertIn("--restore", text)
def test_home_shows_the_same_items(self):
home = _page("index.md")
# A term's first use on the page carries its gloss.
home = re.sub(r"</?abbr[^>]*>", "", _page("index.md"))
for item in siteguides.TRUST_ITEMS:
self.assertIn(f"- {item}", home)
self.assertNotIn("only in your BIOS folder", home)
@@ -1036,7 +1037,7 @@ class GetIndex(unittest.TestCase):
class HomeAndWhichPack(unittest.TestCase):
def test_the_home_step_does_not_promise_a_zip(self):
text = _plain_page("index.md")
self.assertIn("**Run one command.** Some setups have a ZIP.", text)
self.assertIn("**Paste it, press Enter.** Some setups have a ZIP.", text)
self.assertNotIn("or download a ZIP file", text)
def test_which_pack_answers_ios(self):
+2 -11
View File
@@ -67,18 +67,9 @@ NAMES: dict[str, str] = {
}
# Program output quoted word for word. INSTALLER holds install.py's own
# messages, which the pass over the installer's wording rewrites, and empties
# this list with it. SOURCE holds what an emulator prints, quoted in its
# messages, empty since the installer speaks without pronouns. SOURCE holds what an emulator prints, quoted in its
# profile from the emulator's code, which this project does not write.
INSTALLER: dict[str, str] = {
"Where do you play?": "title of the installer's first screen",
"Copy the BIOS files from your old card or a folder": "installer menu row",
"copy the BIOS files from your other card": "installer menu row on a two-card handheld",
"if your files go there.": "installer hint for a card with no handheld system folder",
"See [Files you already had]": (
"link label in the generated options table of wiki/installer.md, "
"kept by generate_installer_doc"),
}
INSTALLER: dict[str, str] = {}
SOURCE: dict[str, str] = {
"You do not have a ROM image installed for Model": "sdltrs message, emulators/sdl2trs.yml",
"You might not get sound because": "lindbergh-loader message, emulators/lindbergh-loader.yml",
+3 -3
View File
@@ -129,7 +129,7 @@ class AMistypedPlatformIsNamed(unittest.TestCase):
)
self.assertNotEqual(proc.returncode, 0)
self.assertNotIn("Traceback", proc.stderr, proc.stderr)
self.assertIn("Did you mean 'batocera'?", proc.stderr)
self.assertIn("Close match: 'batocera'.", proc.stderr)
self.assertFalse(out.exists())
def test_the_names_the_site_prints_are_accepted(self):
@@ -175,7 +175,7 @@ class CrossReferenceAnswersForTheEmulatorAsked(unittest.TestCase):
proc = self._run("--emulator", "dolhpin")
self.assertNotEqual(proc.returncode, 0)
self.assertNotIn("Traceback", proc.stderr)
self.assertIn("Did you mean: dolphin", proc.stderr)
self.assertIn("Close matches: dolphin", proc.stderr)
listing = self._run("--list-emulators")
self.assertEqual(listing.returncode, 0)
self.assertIn("dolphin", listing.stdout.split())
@@ -562,7 +562,7 @@ class ATypoGetsTheNearestNames(unittest.TestCase):
def test_suggestions_follow_the_typed_name(self):
hint = common.suggest_names(["sony-playstaton"],
["3do", "apple-ii", "sony-playstation"], "--list-systems")
self.assertEqual(hint, "Did you mean: sony-playstation? --list-systems lists all 3.")
self.assertEqual(hint, "Close matches: sony-playstation. --list-systems lists all 3.")
self.assertEqual(common.suggest_names(["zzz"], ["3do"], "--list-systems"),
"Known: 3do.")
many = [f"system-{i}" for i in range(40)]
+4 -4
View File
@@ -49,7 +49,7 @@ class ABuildbotNameSelectsItsProfile(unittest.TestCase):
def test_an_unknown_name_still_gets_a_hint(self):
with self.assertRaises(common.ProfileSelectionError) as caught:
common.select_emulator_profiles(["pcsx3"], self.PROFILES)
self.assertIn("Did you mean", str(caught.exception))
self.assertIn("Close match", str(caught.exception))
def test_cross_reference_reports_the_resolved_profile(self):
"""cross_reference filtered on the typed name, found no profile under
@@ -81,7 +81,7 @@ class AMistypedTargetGetsTheClosestName(unittest.TestCase):
with self.assertRaises(ValueError) as caught:
common.load_target_config("p", "swich", tmp)
message = str(caught.exception)
self.assertIn("Did you mean: switch?", message)
self.assertIn("Close matches: switch.", message)
self.assertIn("lists all 31", message)
self.assertNotIn("board-0", message)
@@ -244,7 +244,7 @@ class AMistypedTargetAcrossAllPlatforms(unittest.TestCase):
common.build_target_cores_cache(
platforms, "swich", str(REPO_ROOT / "platforms"), is_all=True
)
self.assertIn("Did you mean: switch (", str(caught.exception))
self.assertIn("Close matches: switch (", str(caught.exception))
self.assertIn("retroarch", str(caught.exception))
self.assertEqual(out.getvalue(), "")
@@ -258,7 +258,7 @@ class AMistypedDataKeyGetsTheClosestName(unittest.TestCase):
cwd=REPO_ROOT, capture_output=True, text=True, check=False,
)
self.assertEqual(proc.returncode, 1)
self.assertIn("unknown key: dolphin-sis. Did you mean: dolphin-sys? --dry-run lists all",
self.assertIn("unknown key: dolphin-sis. Close matches: dolphin-sys. --dry-run lists all",
proc.stderr)
self.assertNotIn("ppsspp-assets", proc.stderr)
+2 -2
View File
@@ -71,7 +71,7 @@ On Batocera, Recalbox and similar setups, see
It opens a menu:
```
RetroBIOS: Where do you play?
RetroBIOS: Where to install?
Found on this machine:
> <your setup>
Another setup or folder
@@ -93,7 +93,7 @@ keep.
**Game data** (only a game reads it) has its own row.
**Old card?** In a card reader, choose **Copy the BIOS files from your old
**Old card?** In a card reader, choose **Copy the BIOS files from an old
card or a folder**, then the card.
## 4. Wait
+11 -11
View File
@@ -185,7 +185,7 @@ downloads, the folder and, for a list with files read from the frontend's save
directory, that directory. 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. **Copy the BIOS
files from your old card or a folder** opens the folder browser on the first
files from an old card or a folder** opens the folder browser on the first
mounted card, and adds [`--from`](#copy-from-an-old-card): the plan then says how
many files that folder holds and how many are left to download, or that it
holds none of them. After an install
@@ -530,7 +530,7 @@ BIOS folder: /userdata/bios
capcom-cps3 (fbneo): sfiii2a.zip
https://abdess.github.io/retrobios/emulators/fbneo/
Each emulator's page, linked above, says what these files are.
Not available here: DARK.GOB, DARKWAR.RTL, DARKWAR.WAD and 76 more, game data their games read. Copy them from your own copy of the game into /userdata/bios/, /userdata/bios/Source/, /userdata/bios/base/ and 10 more folders.
Not available here: DARK.GOB, DARKWAR.RTL, DARKWAR.WAD and 76 more, game data their games read. Copy them from an owned copy of the game into /userdata/bios/, /userdata/bios/Source/, /userdata/bios/base/ and 10 more folders.
Game data: files a game or a game engine reads, of no use to the other cores.
To check this later, run the same command with --check.
```
@@ -602,7 +602,7 @@ against a list of four files:
```
3 files to download:
2 of these files are in the BIOS folder in the wrong place: a run without --check copies them where the cores open them, and leaves your copies as they are.
2 of these files are in the BIOS folder in the wrong place: a run without --check copies them where the cores open them, and leaves the copies found as they are.
wrong copy: scph5501.bin
another region: the contents of scph5500.bin (japan)
read by beetle_psx, pcsx_rearmed at /home/me/.config/retroarch/system/scph5501.bin
@@ -666,7 +666,7 @@ nothing is replaced. The end of the run says how many files were kept, their
size, the folder, and the command that puts them back:
```
Kept 1 file you had (512.0 KB), which the collection's copies replaced, in /home/me/.config/retroarch/retrobios-backup/20261022-153000
Kept 1 file already there (512.0 KB), which the collection's copies replaced, in /home/me/.config/retroarch/retrobios-backup/20261022-153000
To put them back: python3 install.py --restore /home/me/.config/retroarch/retrobios-backup/20261022-153000
```
@@ -775,8 +775,8 @@ RetroArch: 14929 files, 6.7 GB.
3259 BIOS files (4.1 GB), 5089 game data files (2.5 GB) and 6581 data files (135.5 MB).
Game data: files a game or a game engine reads, of no use to the other cores. Data files: the files an emulator reads from a data folder of its own, such as Dolphin's Sys and PPSSPP's assets.
BIOS folder: /home/me/.config/retroarch/system
Not available here, and needed to start its emulator: sfiii2a.zip (Capcom Cps3). Your own copy goes in the BIOS folder.
Not available here: jazz2/Source/Anims.j2a (Jazz Jackrabbit 2), game data its game reads. Copy it from your own copy of the game into /home/me/.config/retroarch/system/jazz2/Source/.
Not available here, and needed to start its emulator: sfiii2a.zip (Capcom Cps3). An owned copy goes in the BIOS folder.
Not available here: jazz2/Source/Anims.j2a (Jazz Jackrabbit 2), game data its game reads. Copy it from an owned copy of the game into /home/me/.config/retroarch/system/jazz2/Source/.
Enter) install everything
c) choose systems, cores and regions
f) copy from a folder or an old card
@@ -784,13 +784,13 @@ RetroArch: 14929 files, 6.7 GB.
q) quit
> g
Counted again for your choices. Nothing is written before Enter.
Counted again for these choices. Nothing is written before Enter.
RetroArch: 9840 files, 4.2 GB.
3259 BIOS files (4.1 GB) and 6581 data files (135.5 MB). 5089 game data files left out.
Game data: files a game or a game engine reads, of no use to the other cores. Data files: the files an emulator reads from a data folder of its own, such as Dolphin's Sys and PPSSPP's assets.
BIOS folder: /home/me/.config/retroarch/system
Not available here, and needed to start its emulator: sfiii2a.zip (Capcom Cps3). Your own copy goes in the BIOS folder.
Not available here, and needed to start its emulator: sfiii2a.zip (Capcom Cps3). An owned copy goes in the BIOS folder.
Same choice without questions: python3 install.py --platform retroarch --dest /home/me/.config/retroarch/system --no-game-data
Enter) install everything
c) choose systems, cores and regions
@@ -1013,7 +1013,7 @@ what the options name, everything by default.
| <span id="option-from-pack"></span>`--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) |
| <span id="option-offline"></span>`--offline` | Make no network request. `--check`, `--from`, `--from-pack` and `--manifest` work without one, the file list stops the run at once when none of them gives it, and a file the run would download fails at once. `RETROBIOS_INSTALL_OFFLINE=1` does the same. `--target` and `--list-targets` read the core list per board a pack carries, or `targets/<platform>.json` beside `--manifest`, and are refused when neither gives one |
| <span id="option-manifest"></span>`--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) |
| <span id="option-restore"></span>`--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) |
| <span id="option-restore"></span>`--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 already in the folder](#files-you-already-had) |
| <span id="option-tui"></span>`--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) |
| <span id="option-plain"></span>`--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) |
| <span id="option-version"></span>`--version` | Print the installer's identity, the first 12 hex digits of the SHA-256 the bootstraps pin |
@@ -1329,7 +1329,7 @@ their systems`), and its `bios` folder comes first at the folder question,
under Enter, before this computer's usual folder. A drive with a `bios` folder
and none of those folders, a data drive or a stick, is numbered with a note
(`DATA has a bios folder but no folder a handheld system writes. Pick it below
if your files go there.`) and never taken under Enter. Another system's card or SHARE drive, and a
if the BIOS files go there.`) and never taken under Enter. Another system's card or SHARE drive, and a
drive two systems fit, are left out, and a line names them: each is reached
through its own setup. A folder typed is read from the current
one when it is not a full path, and named in full after. `q` quits there too
@@ -1579,7 +1579,7 @@ it names the pack and the folder. The releases carry no pack for ROCKNIX,
Knulli or AmberELEC: there RetroBIOS needs Wi-Fi, or the computer route.
On a two-card device, RetroBIOS without Wi-Fi first asks to **copy the BIOS
files from your other card**: muOS's `MUOS/bios` on the card the system does
files from the other card**: muOS's `MUOS/bios` on the card the system does
not read, or the other of `/roms/bios` and `/roms2/bios` on ArkOS and dArkOS.
A says yes, as [`--from`](#copy-from-an-old-card) does. The list of files
still comes from the pack, so the pack is needed too.