mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 08:21:02 +02:00
9147a6413e
SWBLD-05: on download failure print URL, curl/wget exit and HTTP status, and an explicit retry: scripts/build_switch.sh --fetch line. Extend the offline selftest to cover that path without a live network asset. Co-authored-by: Cursor <cursoragent@cursor.com>
130 lines
3.9 KiB
Bash
Executable File
130 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Download pinned love-nx 11.5-nx1 binaries (love.nro + love.elf) and verify SHA.
|
|
#
|
|
# Usage: scripts/switch/fetch_love_nx.sh
|
|
#
|
|
# Idempotent: if both files exist and match the manifest, exit 0 without download.
|
|
# Downloads only these two release assets — does NOT install devkitPro.
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
# shellcheck source=common.sh
|
|
. "$SCRIPT_DIR/common.sh"
|
|
|
|
LOVE_NX_TAG="11.5-nx1"
|
|
LOVE_NX_DIR="$ROOT/.bazinga/love-nx/$LOVE_NX_TAG"
|
|
MANIFEST="$ROOT/scripts/switch/love-nx-11.5-nx1.sha256"
|
|
# Override for offline selftests (never used in release/docs as the default).
|
|
BASE_URL="${GEN1_LOVE_NX_BASE_URL:-https://github.com/retronx-team/love-nx/releases/download/${LOVE_NX_TAG}}"
|
|
|
|
fail_download() {
|
|
local url="$1"
|
|
local detail="$2"
|
|
rm -f "${3:-}"
|
|
fail "download failed: $url
|
|
detail: $detail
|
|
retry: scripts/build_switch.sh --fetch
|
|
See docs/switch-build.md (mode --fetch)."
|
|
}
|
|
|
|
read_manifest_hash() {
|
|
local name="$1"
|
|
local line hash
|
|
line="$(grep -E "^${name}[[:space:]]+" "$MANIFEST" | head -1 || true)"
|
|
[ -n "$line" ] || fail "manifest missing entry for $name"
|
|
hash="$(printf '%s' "$line" | awk '{print $2}')"
|
|
case "$hash" in
|
|
TBD_*|"") fail "manifest hash for $name is not filled in ($hash)" ;;
|
|
esac
|
|
printf '%s' "$hash"
|
|
}
|
|
|
|
# Downloads url → dest. On failure prints structured error (URL, tool status, retry).
|
|
download_file() {
|
|
local url="$1"
|
|
local dest="$2"
|
|
local rc=0 http_code errf
|
|
|
|
if command -v curl >/dev/null 2>&1; then
|
|
errf="$(mktemp "${TMPDIR:-/tmp}/love-nx-curl.XXXXXX")"
|
|
http_code="$(curl -fL --retry 3 --retry-delay 1 -o "$dest" -w '%{http_code}' \
|
|
"$url" 2>"$errf")" || rc=$?
|
|
if [ "$rc" -ne 0 ]; then
|
|
fail_download "$url" \
|
|
"curl exit $rc; HTTP status ${http_code:-unknown}; $(tr '\n' ' ' <"$errf" | sed 's/[[:space:]]*$//')" \
|
|
"$dest"
|
|
fi
|
|
rm -f "$errf"
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
errf="$(mktemp "${TMPDIR:-/tmp}/love-nx-wget.XXXXXX")"
|
|
wget -O "$dest" "$url" 2>"$errf" || rc=$?
|
|
if [ "$rc" -ne 0 ]; then
|
|
fail_download "$url" \
|
|
"wget exit $rc; $(tr '\n' ' ' <"$errf" | sed 's/[[:space:]]*$//')" \
|
|
"$dest"
|
|
fi
|
|
rm -f "$errf"
|
|
else
|
|
fail "need curl or wget to download love-nx
|
|
retry: scripts/build_switch.sh --fetch
|
|
See docs/switch-build.md (mode --fetch)."
|
|
fi
|
|
}
|
|
|
|
fetch_one() {
|
|
local name="$1"
|
|
local expected actual
|
|
local url="$BASE_URL/$name"
|
|
local dest="$LOVE_NX_DIR/$name"
|
|
local tmp
|
|
|
|
expected="$(read_manifest_hash "$name")"
|
|
|
|
if [ -f "$dest" ]; then
|
|
actual="$(sha256_file "$dest")"
|
|
if [ "$actual" = "$expected" ]; then
|
|
return 0
|
|
fi
|
|
say "checksum mismatch for existing $name — re-downloading"
|
|
rm -f "$dest"
|
|
fi
|
|
|
|
mkdir -p "$LOVE_NX_DIR"
|
|
tmp="$(mktemp "${TMPDIR:-/tmp}/love-nx-${name}.XXXXXX")"
|
|
say "downloading $name"
|
|
# download_file fails the script with fail_download (URL + status + retry).
|
|
download_file "$url" "$tmp"
|
|
|
|
actual="$(sha256_file "$tmp")"
|
|
if [ "$actual" != "$expected" ]; then
|
|
rm -f "$tmp"
|
|
fail "$name checksum mismatch (expected $expected, got $actual) — $url
|
|
retry: scripts/build_switch.sh --fetch"
|
|
fi
|
|
|
|
mv "$tmp" "$dest"
|
|
say "verified $name ($actual)"
|
|
}
|
|
|
|
[ -f "$MANIFEST" ] || fail "missing love-nx manifest: $MANIFEST"
|
|
|
|
EXPECTED_NRO="$(read_manifest_hash love.nro)"
|
|
EXPECTED_ELF="$(read_manifest_hash love.elf)"
|
|
|
|
if [ -f "$LOVE_NX_DIR/love.nro" ] && [ -f "$LOVE_NX_DIR/love.elf" ]; then
|
|
ACTUAL_NRO="$(sha256_file "$LOVE_NX_DIR/love.nro")"
|
|
ACTUAL_ELF="$(sha256_file "$LOVE_NX_DIR/love.elf")"
|
|
if [ "$ACTUAL_NRO" = "$EXPECTED_NRO" ] && [ "$ACTUAL_ELF" = "$EXPECTED_ELF" ]; then
|
|
say "love-nx $LOVE_NX_TAG already present and verified — skipping download"
|
|
"$ROOT/scripts/switch/verify_love_nx.sh"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
fetch_one love.nro
|
|
fetch_one love.elf
|
|
|
|
"$ROOT/scripts/switch/verify_love_nx.sh"
|
|
say "love-nx $LOVE_NX_TAG ready at $LOVE_NX_DIR"
|