mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-31 08:07:19 -05:00
fix: settle round 3 checks across packages
This commit is contained in:
1 parent
f0e7d87def
commit
2a29ca309c
4 files changed
+18
-12
No files matched your search
@@ -14,23 +14,29 @@ from pathlib import Path
|
|||||||
API = "https://abdess.github.io/retrobios/api/v1/platforms/"
|
API = "https://abdess.github.io/retrobios/api/v1/platforms/"
|
||||||
|
|
||||||
|
|
||||||
|
# The digest each check mode compares. A mode missing here (existence) only
|
||||||
|
# asks that the file be present.
|
||||||
|
DIGESTS = {"md5": "md5", "sha1": "sha1"}
|
||||||
|
|
||||||
|
|
||||||
def accepts(entry: dict, path: Path, mode: str) -> bool:
|
def accepts(entry: dict, path: Path, mode: str) -> bool:
|
||||||
"""Whether the platform's own check passes the file at path."""
|
"""Whether the platform's own check passes the file at path."""
|
||||||
|
digest = DIGESTS.get(mode)
|
||||||
raw = entry.get(mode) or ""
|
raw = entry.get(mode) or ""
|
||||||
values = raw if isinstance(raw, list) else str(raw).split(",")
|
values = raw if isinstance(raw, list) else str(raw).split(",")
|
||||||
declared = [value.strip().lower() for value in values if value.strip()]
|
declared = [value.strip().lower() for value in values if value.strip()]
|
||||||
if mode == "existence" or not declared:
|
if digest is None or not declared:
|
||||||
return path.is_file() # nothing to compare: the platform checks presence
|
return path.is_file() # nothing to compare: the platform checks presence
|
||||||
try:
|
try:
|
||||||
if entry.get("zipped_file"): # the hash of one member, its name casefolded
|
if entry.get("zipped_file"): # the hash of one member, its name casefolded
|
||||||
with zipfile.ZipFile(path) as archive:
|
with zipfile.ZipFile(path) as archive:
|
||||||
names = {name.casefold(): name for name in archive.namelist()}
|
names = {name.casefold(): name for name in archive.namelist()}
|
||||||
member = names.get(entry["zipped_file"].casefold())
|
member = names.get(entry["zipped_file"].casefold())
|
||||||
return bool(member) and hashlib.new(mode, archive.read(member)).hexdigest() in declared
|
return bool(member) and hashlib.new(digest, archive.read(member)).hexdigest() in declared
|
||||||
actual = hashlib.new(mode, path.read_bytes()).hexdigest()
|
actual = hashlib.new(digest, path.read_bytes()).hexdigest()
|
||||||
if entry.get("zip_digest") != "composite" and any(actual.startswith(d) for d in declared):
|
if entry.get("zip_digest") != "composite" and any(actual.startswith(d) for d in declared):
|
||||||
return True # a truncated md5 (Batocera) compares by its prefix
|
return True # a truncated md5 (Batocera) compares by its prefix
|
||||||
if mode == "md5" and path.suffix.lower() == ".zip": # Recalbox: members in name order
|
if digest == DIGESTS["md5"] and path.suffix.lower() == ".zip": # Recalbox: members in name order
|
||||||
with zipfile.ZipFile(path) as archive:
|
with zipfile.ZipFile(path) as archive:
|
||||||
names = sorted(name for name in archive.namelist() if not name.endswith("/"))
|
names = sorted(name for name in archive.namelist() if not name.endswith("/"))
|
||||||
return hashlib.md5(b"".join(map(archive.read, names))).hexdigest() in declared
|
return hashlib.md5(b"".join(map(archive.read, names))).hexdigest() in declared
|
||||||
|
|||||||
@@ -6100,7 +6100,6 @@ def _directory_copies(entry: dict, consumers: FileConsumers) -> list[str]:
|
|||||||
f"([browse]({tree}))"]
|
f"([browse]({tree}))"]
|
||||||
|
|
||||||
|
|
||||||
ROMSET_FAQ = "../wiki/technical-faq.md#which-mame-version-do-the-arcade-bios-sets-match"
|
|
||||||
_MAME_RELEASE = re.compile(r"^0\.\d")
|
_MAME_RELEASE = re.compile(r"^0\.\d")
|
||||||
|
|
||||||
|
|
||||||
@@ -8473,7 +8472,7 @@ def generate_which_pack() -> str:
|
|||||||
*setup_picker(registry, display),
|
*setup_picker(registry, display),
|
||||||
"## Folders and ZIP files { #manual-download }",
|
"## Folders and ZIP files { #manual-download }",
|
||||||
"",
|
"",
|
||||||
"- A big ZIP comes in parts. Download every part.",
|
"- A big ZIP comes in parts, like `Pack.part1of2.zip`. Download every part.",
|
||||||
"- Unzip them into your BIOS folder. Put the files straight in it, "
|
"- Unzip them into your BIOS folder. Put the files straight in it, "
|
||||||
"not in a new folder.",
|
"not in a new folder.",
|
||||||
"- Leave the ZIPs inside, like `neogeo.zip`, as they are.",
|
"- Leave the ZIPs inside, like `neogeo.zip`, as they are.",
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ class PlatformShareCards(unittest.TestCase):
|
|||||||
def test_other_pages_keep_their_section_card(self):
|
def test_other_pages_keep_their_section_card(self):
|
||||||
self.assertEqual(sitestarlight.og_image("platforms/index.md", "setup"),
|
self.assertEqual(sitestarlight.og_image("platforms/index.md", "setup"),
|
||||||
f"{sitestarlight.SITE_URL}assets/og/setup.png")
|
f"{sitestarlight.SITE_URL}assets/og/setup.png")
|
||||||
# A manufacturer page has its own card since round 3 (6.6); one
|
# A manufacturer page has its own card since round 3 (6.6). One
|
||||||
# without a rendered card keeps its section's.
|
# without a rendered card keeps its section's.
|
||||||
self.assertEqual(sitestarlight.og_image("systems/sony.md", "explore"),
|
self.assertEqual(sitestarlight.og_image("systems/sony.md", "explore"),
|
||||||
f"{sitestarlight.SITE_URL}assets/og/systems/sony.png")
|
f"{sitestarlight.SITE_URL}assets/og/systems/sony.png")
|
||||||
|
|||||||
+6
-5
@@ -15,7 +15,7 @@ order: 50
|
|||||||
|
|
||||||
## How do I know which BIOS I need?
|
## How do I know which BIOS I need?
|
||||||
|
|
||||||
Run the command with `--dry-run`. It lists the files and changes nothing.
|
Run the command with `--dry-run`. It lists the files, changing nothing.
|
||||||
|
|
||||||
<!-- os-tabs -->
|
<!-- os-tabs -->
|
||||||
```sh
|
```sh
|
||||||
@@ -34,8 +34,8 @@ Flycast's **Language** option.
|
|||||||
|
|
||||||
## Zip or unzip? { #zip-or-unzip }
|
## Zip or unzip? { #zip-or-unzip }
|
||||||
|
|
||||||
Unzip the ZIP you downloaded into the folder your setup's page names. Leave
|
Unzip the ZIP you downloaded into the folder your setup's page names. Keep
|
||||||
the ZIPs inside as they are, like `neogeo.zip`.
|
the ZIPs inside zipped, like `neogeo.zip`.
|
||||||
|
|
||||||
## Does a BIOS work on every setup?
|
## Does a BIOS work on every setup?
|
||||||
|
|
||||||
@@ -60,9 +60,10 @@ Sometimes. Some emulators carry a stand-in, and some games then fail.
|
|||||||
|
|
||||||
## Is the command safe? { #is-piping-the-installer-into-a-shell-safe }
|
## Is the command safe? { #is-piping-the-installer-into-a-shell-safe }
|
||||||
|
|
||||||
- It checks the installer's fingerprint, then each file before saving it.
|
- It stops if the installer does not match its expected fingerprint, then
|
||||||
|
checks each file before saving it.
|
||||||
- It writes in your BIOS folder, and for some emulators in your save folder.
|
- It writes in your BIOS folder, and for some emulators in your save folder.
|
||||||
- It never changes or deletes a game or a save.
|
- It never touches a game or a save.
|
||||||
- It keeps any file it replaces in `retrobios-backup`, next to your BIOS
|
- It keeps any file it replaces in `retrobios-backup`, next to your BIOS
|
||||||
folder. `--restore` puts it back.
|
folder. `--restore` puts it back.
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user