fix: name release assets as GitHub serves them

This commit is contained in:
Abdessamad Derraz committed 2026-10-18 14:49:00 +02:00
1 parent a08827257d
commit dbd47886ce
4 files changed
+35 -4

No files matched your search

+9 -3
View File
@@ -76,7 +76,7 @@ import slot as slot_mod
import slots
import split_pack
from deterministic_zip import _FIXED_DATE_TIME, rebuild_zip_deterministic
from largefiles import asset_name, load_registered_paths
from largefiles import asset_name, load_registered_paths, published_asset_name
from nativemode import (
digest_algorithm,
hash_mismatch_excludes_file,
@@ -3226,8 +3226,14 @@ def _repo_relative(local_path: str, repo_root: str) -> str:
def _release_asset_name(local_path: str, repo_root: str) -> str:
"""The large-files asset install.py downloads for a gitignored file."""
return asset_name(_repo_relative(local_path, repo_root), sorted(_registered(repo_root)))
"""The large-files asset install.py downloads for a gitignored file.
The name GitHub serves, not the one uploaded: a space in the path came
back as a 404 for an installer asking for it verbatim.
"""
return published_asset_name(
asset_name(_repo_relative(local_path, repo_root), sorted(_registered(repo_root)))
)
def _get_repo_path(sha1: str, db: dict) -> str:
+2 -1
View File
@@ -2018,11 +2018,12 @@ def _fetch_url(path: str) -> str:
LARGE_FILES_RELEASE,
asset_names,
load_registered_paths,
published_asset_name,
)
_RELEASE_ASSET_NAMES = {
registered: f"{REPO_URL}/releases/download/{LARGE_FILES_RELEASE}/"
+ urllib.parse.quote(name.replace(" ", "."))
+ urllib.parse.quote(published_asset_name(name))
for registered, name in asset_names(load_registered_paths()).items()
}
return _RELEASE_ASSET_NAMES.get(path) or (
+5
View File
@@ -88,6 +88,11 @@ def asset_name(path: str, registered: Iterable[str]) -> str:
return asset_names([*registered, path])[path]
def published_asset_name(name: str) -> str:
"""The name GitHub serves an asset under: it publishes a space as a dot."""
return name.replace(" ", ".")
def asset_candidates(name: str, registered: Iterable[str]) -> list[str]:
"""Assets that may hold *name*, a registered path or a bare file name.
+19
View File
@@ -1993,6 +1993,25 @@ class ReleaseAssetCriterion(unittest.TestCase):
finally:
generate_pack._registered.cache_clear()
def test_the_manifest_names_the_asset_as_github_serves_it(self):
# GitHub publishes a space as a dot; the site linked the dotted
# name while the manifest gave install.py the spaced one, a 404.
from scripts import generate_pack
with tempfile.TemporaryDirectory(dir=TMP_ROOT) as directory:
root = self._repo(directory, "bios/MAME/MAME 0.174 Arcade XML.dat")
target = Path(root, "bios", "MAME", "MAME 0.174 Arcade XML.dat")
target.parent.mkdir(parents=True)
target.write_bytes(b"x")
generate_pack._registered.cache_clear()
try:
self.assertEqual(
generate_pack._release_asset_name(str(target), root),
"MAME.0.174.Arcade.XML.dat",
)
finally:
generate_pack._registered.cache_clear()
def test_a_gitignored_file_is_served_by_the_release_whatever_its_size(self):
from scripts import generate_pack