fix: note a case twin only when its pair is there

This commit is contained in:
Abdessamad Derraz committed 2026-11-05 19:34:48 +01:00
1 parent 101757675b
commit 0624d9f735
5 files changed
+48 -13

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 = "02b1a66c6f9d63122c8064005ec6ae7c7504820c28e5027a5894aef209be7aa5"
$defaultInstallSha256 = "57b285ce8de68f8ece0d1adb9f3b7a7fc8cda5ab7004c3601d5ef357353ab69e"
$maximumInstallerBytes = 2MB
$installerExit = 0
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
+20 -1
View File
@@ -12168,16 +12168,35 @@ def _copy_reason(entry: dict, copy: LocalCopy, bios_path: Path, known: set[str])
return _place_reason(entry, copy.path, copy.index, expected, known)[0]
def _twin_in_place(entry: dict, files: list[dict], bios_path: Path) -> bool:
"""Whether the name a case variant shares with another entry, but for
the case (bios.col and BIOS.col), is in place."""
folded = str(entry.get("dest", "")).casefold()
for twin in files:
if twin is entry or twin.get("case_variant") or \
str(twin.get("dest", "")).casefold() != folded:
continue
try:
if _is_file(_entry_path(bios_path, twin)):
return True
except ValueError:
continue
return False
def _found_elsewhere(
entry: dict, index: FolderIndex, bios_path: Path, files: list[dict],
known: set[str], zipped: _ZippedLookup | None = None,
) -> tuple[str, str]:
"""(reason, folder too deep) for an entry missing at its place."""
dest = str(entry.get("dest", ""))
if entry.get("case_variant"):
if entry.get("case_variant") and _twin_in_place(entry, files, bios_path):
# A pack is read on Windows and macOS too, where two names that
# differ only by case are one file: it carries one of the pair. Moving
# the other copy here would take it from the core that opens it.
# Only its twin in place says a pack was used: on an empty folder the
# note named a pack never downloaded and pushed the BIOS files the
# user looked for into "... and N more".
return ("a second name the pack leaves out: Windows and macOS see it "
"as the same file. Run the command without --check to add it"), ""
name = dest.rsplit("/", 1)[-1]
+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="02b1a66c6f9d63122c8064005ec6ae7c7504820c28e5027a5894aef209be7aa5"
DEFAULT_INSTALL_SHA256="57b285ce8de68f8ece0d1adb9f3b7a7fc8cda5ab7004c3601d5ef357353ab69e"
MAX_INSTALLER_BYTES=2097152
cleanup() {
+8 -8
View File
@@ -27,8 +27,8 @@
{
"dest": "roms/ports/retrobios/install.py",
"repo_path": "install.py",
"size": 1096845,
"sha256": "02b1a66c6f9d63122c8064005ec6ae7c7504820c28e5027a5894aef209be7aa5",
"size": 1097676,
"sha256": "57b285ce8de68f8ece0d1adb9f3b7a7fc8cda5ab7004c3601d5ef357353ab69e",
"executable": false
},
{
@@ -71,8 +71,8 @@
"muos": {
"archive": {
"dest": "ARCHIVE/RetroBIOS.muxapp",
"size": 1150472,
"sha256": "b3261f3b02e6e4e14bbcba07d9f6f03b7b43e5e66bf20c770d4c68e8cb6bd277"
"size": 1151303,
"sha256": "3df4d9dd45f830736e40d80be6ff589f22c91bff93ea00570918ef53a072e826"
},
"members": [
{
@@ -92,8 +92,8 @@
{
"name": "RetroBIOS/install.py",
"repo_path": "install.py",
"size": 1096845,
"sha256": "02b1a66c6f9d63122c8064005ec6ae7c7504820c28e5027a5894aef209be7aa5",
"size": 1097676,
"sha256": "57b285ce8de68f8ece0d1adb9f3b7a7fc8cda5ab7004c3601d5ef357353ab69e",
"executable": false
},
{
@@ -166,8 +166,8 @@
{
"dest": ".config/modules/retrobios/install.py",
"repo_path": "install.py",
"size": 1096845,
"sha256": "02b1a66c6f9d63122c8064005ec6ae7c7504820c28e5027a5894aef209be7aa5",
"size": 1097676,
"sha256": "57b285ce8de68f8ece0d1adb9f3b7a7fc8cda5ab7004c3601d5ef357353ab69e",
"executable": false
},
{
+18 -2
View File
@@ -179,14 +179,30 @@ class CheckNamesWhyAFileIsRefused(Scratch):
self.skipTest("this filesystem does not keep case")
data = json.loads(self.list.read_text())
twin = next(f for f in data["files"] if f["dest"] == "gba_bios.bin")
data["case_variants"] = [{**twin, "dest": "twin/gba_bios.bin"}]
data["case_variants"] = [{**twin, "dest": "GBA_BIOS.BIN"}]
self.list.write_text(json.dumps(data))
self.complete()
out = self.check()
self.assertIn("missing: twin/gba_bios.bin", out)
self.assertIn("missing: GBA_BIOS.BIN", out)
self.assertIn("a second name the pack leaves out", out)
self.assertNotIn("wrong folder: it is at gba_bios.bin", out)
def test_a_case_twin_is_plain_missing_when_no_pack_was_used(self):
"""On an empty folder every case variant came first, uncapped, with
a note on a pack never downloaded: the BIOS files the user looked
for sat in "... and N more missing"."""
probe = self.root / "CaseProbe"
probe.write_text("x")
if (self.root / "caseprobe").exists():
self.skipTest("this filesystem does not keep case")
data = json.loads(self.list.read_text())
twin = next(f for f in data["files"] if f["dest"] == "gba_bios.bin")
data["case_variants"] = [{**twin, "dest": "GBA_BIOS.BIN"}]
self.list.write_text(json.dumps(data))
out = self.check()
self.assertIn("missing: GBA_BIOS.BIN", out)
self.assertNotIn("a second name the pack leaves out", out)
def test_a_nested_bios_folder_is_named(self):
for name, data in PAYLOAD.items():
self.place(f"system/{name}", data)