Add channel-aware release tooling and updater recovery

This commit is contained in:
2026-09-10 00:39:37 +02:00
parent cc48bf45d2
commit 0a89323533
42 changed files with 7840 additions and 0 deletions

View File

@@ -2253,6 +2253,7 @@ def _extract_release_archive(archive: Path, destination: Path, version: str) ->
def _validate_release_directory(release: Path) -> str:
if not release.is_dir() or release.is_symlink():
raise LauncherUpdateError(f"launcher release directory is invalid: {release}")
_remove_generated_bytecode_caches(release)
for item in (release, *release.rglob("*")):
if item.is_symlink():
raise LauncherUpdateError(f"launcher release contains a symbolic link: {item}")
@@ -2302,6 +2303,43 @@ def _validate_release_directory(release: Path) -> str:
return version
def _remove_generated_bytecode_caches(release: Path) -> None:
"""Remove interpreter caches that are never part of a signed release."""
try:
cache_directories = sorted(
release.rglob("__pycache__"),
key=lambda path: len(path.parts),
reverse=True,
)
except OSError as exc:
raise LauncherUpdateError(
f"cannot inspect launcher bytecode caches in {release}: {exc}"
) from exc
for cache in cache_directories:
if cache.is_symlink() or not cache.is_dir():
raise LauncherUpdateError(f"launcher bytecode cache is unsafe: {cache}")
try:
entries = tuple(cache.iterdir())
except OSError as exc:
raise LauncherUpdateError(
f"cannot inspect launcher bytecode cache {cache}: {exc}"
) from exc
for entry in entries:
if entry.is_symlink() or not entry.is_file() or entry.suffix not in {".pyc", ".pyo"}:
raise LauncherUpdateError(
f"launcher bytecode cache contains an unexpected path: {entry}"
)
try:
for entry in entries:
entry.unlink()
cache.rmdir()
except OSError as exc:
raise LauncherUpdateError(
f"cannot remove launcher bytecode cache {cache}: {exc}"
) from exc
def _self_check_release(release: Path, expected_version: str) -> None:
check = (
"import sys; "