#!/usr/bin/env bash set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." source scripts/lib.sh need_cmd "$PY" curl unzip sha256sum BETA=0 for arg in "$@"; do case "$arg" in --beta) BETA=1 ;; *) die "unknown argument: $arg" ;; esac done API_URL="https://api.github.com/repos/exteraSquad/plugins-pysdk-builds/releases?per_page=20" RELEASE_JSON="$(mktemp)" trap 'rm -rf "$RELEASE_JSON" "$WORKDIR"' EXIT curl -fsSL "$API_URL" -o "$RELEASE_JSON" || die "failed to query GitHub releases API" read -r TAG ASSET_URL SHA_URL < <("$PY" - "$RELEASE_JSON" "$BETA" <<'PYEOF' import json, sys path, allow_beta = sys.argv[1], sys.argv[2] == "1" with open(path, encoding="utf-8") as f: releases = json.load(f) for rel in releases: if rel.get("prerelease") and not allow_beta: continue assets = {a["name"]: a["browser_download_url"] for a in rel.get("assets", [])} if "stubs.zip" in assets: sha_url = assets.get("stubs.zip.sha256", "") print(rel["tag_name"], assets["stubs.zip"], sha_url) break else: sys.exit("no release with a stubs.zip asset found") PYEOF ) || die "no release with a stubs.zip asset found" [[ -n "$TAG" ]] || die "could not determine a release to install" WORKDIR="$(mktemp -d)" curl -fsSL "$ASSET_URL" -o "$WORKDIR/stubs.zip" || die "failed to download stubs.zip" if [[ -n "$SHA_URL" ]]; then curl -fsSL "$SHA_URL" -o "$WORKDIR/stubs.zip.sha256" || die "failed to download stubs.zip.sha256" (cd "$WORKDIR" && sha256sum -c stubs.zip.sha256) || die "checksum verification failed for stubs.zip" else echo "warning: no stubs.zip.sha256 asset published for $TAG; skipping checksum verification" >&2 fi rm -rf stubs mkdir -p stubs unzip -q "$WORKDIR/stubs.zip" -d "$WORKDIR/outer" INNER="$WORKDIR/outer/pyi-files.zip" [[ -f "$INNER" ]] || die "expected pyi-files.zip inside stubs.zip, not found" unzip -q "$INNER" -d stubs echo "installed SDK stubs from release $TAG into stubs/"