Add channel-aware release tooling and updater recovery
This commit is contained in:
@@ -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; "
|
||||
|
||||
Reference in New Issue
Block a user