From bc489273a01713dbbb0a2d31c9f2e71d9310c73a Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:07:25 +0100 Subject: [PATCH] fix: read a pack version past its platform part _pack_version took the text after the last underscore of the pack name. AmberELEC's prerelease-20261019_1835 read as 1835 and the page would announce a version gap that does not exist. The site now removes the platform part the builder writes (platform_pack_prefix). --- scripts/generate_pack.py | 16 ++++++++++++++-- scripts/generate_site.py | 30 +++++++++++++++++++++++++----- tests/test_site_entry.py | 15 ++++++++++++++- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/scripts/generate_pack.py b/scripts/generate_pack.py index 0aa618493..ebb3b68f9 100644 --- a/scripts/generate_pack.py +++ b/scripts/generate_pack.py @@ -369,13 +369,25 @@ def _platform_pack_stem( rep_cfg = load_platform_config(representative, platforms_dir) version = rep_cfg.get("version", rep_cfg.get("dat_version", "")) version_tag = f"_{_name_part(str(version))}" if version else "" + return platform_pack_prefix(group_platforms, representative, platforms_dir) + version_tag + + +def platform_pack_prefix( + group_platforms: list[str], representative: str, platforms_dir: str +) -> str: + """Platform part of a pack name without the version. + + The site reads a pack's version back by removing this prefix: a version + may hold an underscore (AmberELEC prerelease-20261019_1835). + """ if len(group_platforms) <= 1: - return _name_part(rep_cfg.get("platform", representative), "_") + version_tag + rep_cfg = load_platform_config(representative, platforms_dir) + return _name_part(rep_cfg.get("platform", representative), "_") names = [ load_platform_config(p, platforms_dir).get("platform", p) for p in group_platforms ] - return "_".join(_name_part(n) for n in names) + version_tag + return "_".join(_name_part(n) for n in names) def platform_list_version(config: dict, platform: str) -> str: diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 22ac647b6..39e1b5744 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -642,11 +642,26 @@ def _release_date(tag: str) -> str: return f"{moment.day} {moment.strftime('%B %Y')}" -def _pack_version(pack_name: str) -> str: +def _pack_version(pack_name: str, platforms: list[str]) -> str: """The platform version a pack was built for, from its name - (Batocera_43.1_BIOS_Pack.zip is 43.1).""" + (Batocera_43.1_BIOS_Pack.zip is 43.1). + + Read past the platform part the builder writes, not at the last + underscore: AmberELEC_prerelease-20261019_1835 read as 1835. + """ + from generate_pack import platform_pack_prefix # noqa: PLC0415 + stem = pack_name.removesuffix("_BIOS_Pack.zip") - return stem.rsplit("_", 1)[1] if "_" in stem else "" + prefix = platform_pack_prefix( + platforms, platforms[0], str(siteinputs.current().platforms) + ) + "_" + return stem[len(prefix):] if stem.startswith(prefix) else "" + + +def _pack_platforms(platform_name: str, record: dict, pack_name: str) -> list[str]: + """The platforms a release pack was built for, the one asked first.""" + listed = list(record.get("packs", {}).get(pack_name, {}).get("platforms") or []) + return listed or [platform_name] def release_line(platform_name: str, record: dict) -> list[str]: @@ -665,7 +680,9 @@ def release_line(platform_name: str, record: dict) -> list[str]: ] config = load_platform_config(platform_name, str(siteinputs.current().platforms)) page_version = str(config.get("version") or "") - pack_version = _pack_version(pack_name) + pack_version = _pack_version( + pack_name, _pack_platforms(platform_name, record, pack_name) + ) if page_version and pack_version and page_version.lstrip("v") != pack_version.lstrip("v"): display = config.get("platform", platform_name) lines.append(f"This pack was built for {display} {pack_version}. The command " @@ -692,7 +709,10 @@ def setup_version(platform_name: str, record: dict | None = None) -> str: except FileNotFoundError: return "" pack_name = release_record.pack_name_for(platform_name, record or {}) - version = (_pack_version(pack_name) if pack_name else "") or str(config.get("version") or "") + version = ( + _pack_version(pack_name, _pack_platforms(platform_name, record or {}, pack_name)) + if pack_name else "" + ) or str(config.get("version") or "") if not version: return "" return f"{config.get('platform', platform_name)} {version.removeprefix('v')}" diff --git a/tests/test_site_entry.py b/tests/test_site_entry.py index 3806438ba..89cf36e86 100644 --- a/tests/test_site_entry.py +++ b/tests/test_site_entry.py @@ -441,7 +441,8 @@ class PackNamesItsVersion(unittest.TestCase): if not release_record.pack_for("batocera", record): self.skipTest("release.json has no Batocera pack") block = generate_site._pack_buttons("batocera") - version = generate_site._pack_version(release_record.pack_name_for("batocera", record)) + name = release_record.pack_name_for("batocera", record) + version = generate_site._pack_version(name, ["batocera"]) self.assertIn(f"Made for Batocera {version}. " + generate_site.other_version("batocera"), block) @@ -452,6 +453,18 @@ class PackNamesItsVersion(unittest.TestCase): line = generate_site.version_line("retrobat", record, named=len(released) > 1) self.assertEqual(line, generate_site.other_version("retrobat")) + def test_a_version_with_an_underscore_is_read_whole(self): + """AmberELEC's prerelease-20261019_1835 read as 1835, and the page + said the pack was built for another version.""" + from generate_pack import _platform_pack_stem + + version = load_platform_config("amberelec", "platforms")["version"] + name = _platform_pack_stem(["amberelec"], "amberelec", "platforms") + "_BIOS_Pack.zip" + self.assertEqual(generate_site._pack_version(name, ["amberelec"]), version) + record = {"tag": "v2026.10.10", "packs": {name: { + "assets": [name], "platforms": ["amberelec"]}}} + self.assertEqual(len(generate_site.release_line("amberelec", record)), 1) + def test_another_version_is_sent_to_the_check_commands(self): """A ZIP reader read "Run `--check` after copying." with no command.""" line = generate_site.other_version("emudeck")