Files
MBMNET-APP/release.sh
T

109 lines
5.3 KiB
Bash
Executable File

#!/bin/bash
# Baut die App und lädt sie ins Repo "MBMNET" hoch. Danach aktualisiert sich jede
# MBMNET-App beim nächsten Start von selbst.
# Zusätzlich legt es auf Gitea ein Release "vX.Y.Z" mit .cia und .3dsx an (für Universal-Updater).
# Der MBMNET Shop (shop/) wird mitgebaut; die App installiert ihn auf Wunsch vom Server.
#
# Vorher in Makefile die VERSION erhöhen!
# ./release.sh ["Release-Notizen"] bauen, hochladen, Release anlegen
# ./release.sh --nur-release ["Notizen"] nur das Release zur aktuellen Version anlegen
set -euo pipefail
cd "$(dirname "$0")"
VERSION=$(sed -n 's/^VERSION *:= *//p' Makefile)
RELEASE=../release
GITEA=https://git.mbm.wtf
REPO=MrMaho/MBMNET
NUR_RELEASE=0
if [ "${1:-}" = "--nur-release" ]; then NUR_RELEASE=1; shift; fi
NOTIZEN=${1:-"MBMNET-App v$VERSION"}
if [ "$NUR_RELEASE" = 0 ]; then
# Build-Umgebung mit makerom und bannertool (für die CIA), wird nur beim ersten Mal gebaut
docker image inspect mbmnet-3ds-build >/dev/null 2>&1 || docker build -t mbmnet-3ds-build tools
echo "Baue MBMNET-App v$VERSION ..."
docker run --rm -v "$PWD":/app -w /app mbmnet-3ds-build bash -c \
'make clean >/dev/null && make && make cia && make -C shop clean >/dev/null && make -C shop && make -C shop cia'
cp mbmnet.3dsx mbmnet.cia shop/mbmnet-shop.3dsx shop/mbmnet-shop.cia gm9/mbmnet-installieren.gm9 "$RELEASE/"
echo "$VERSION" > "$RELEASE/version.txt"
(cd "$RELEASE" && git add mbmnet.3dsx mbmnet.cia mbmnet-shop.3dsx mbmnet-shop.cia mbmnet-installieren.gm9 version.txt && git commit -m "MBMNET-App v$VERSION" && git push)
fi
# --- MBMNET-Design fürs HOME-Menü (eigene Töne, Standard-Aussehen; für Anemone3DS) --------------
THEME_TMP=$(mktemp -d)
node theme/build-theme.js "$THEME_TMP" >/dev/null
docker run --rm -v "$PWD":/app -v "$THEME_TMP":/out -w /app mbmnet-3ds-build \
bannertool makesmdh -s "MBMNET" -l "MBMNET-Design: eigene Töne im HOME-Menü" -p "MBMNET" -i icon.png -o /out/MBMNET/info.smdh >/dev/null
DESIGNZIP="$(cd "$RELEASE" && pwd)/mbmnet-design.zip"
rm -f "$DESIGNZIP"
(cd "$THEME_TMP/MBMNET" && zip -q "$DESIGNZIP" body_LZ.bin info.smdh preview.png)
# --- SD-Karten-Paket (wie bei MSET9/Hacks-Guide: am PC auf die SD entpacken, dann GM9-Skript starten) ---
SDZIP="$(cd "$RELEASE" && pwd)/mbmnet-sd.zip"
SDTMP=$(mktemp -d)
mkdir -p "$SDTMP/cias" "$SDTMP/gm9/scripts" "$SDTMP/3ds" "$SDTMP/Themes"
cp "$RELEASE/mbmnet.cia" "$RELEASE/mbmnet-shop.cia" "$SDTMP/cias/"
cp "$RELEASE/mbmnet-installieren.gm9" "$SDTMP/gm9/scripts/"
cp "$RELEASE/mbmnet.3dsx" "$SDTMP/3ds/"
cp "$DESIGNZIP" "$SDTMP/Themes/MBMNET-Design.zip"
rm -rf "$THEME_TMP"
cat > "$SDTMP/LIESMICH.txt" <<'TXT'
MBMNET - Installation
1. Den Inhalt dieses ZIPs ins Hauptverzeichnis der SD-Karte entpacken
(Ordner "cias", "gm9" und "3ds" zusammenführen, nichts löschen).
2. SD-Karte in den 3DS, GodMode9 starten (beim Einschalten START gedrückt halten).
3. HOME-Taste > "Scripts..." > "mbmnet-installieren".
Das Skript installiert die MBMNET-App und fragt, ob der MBMNET Shop dazukommen soll.
4. GodMode9 beenden, die MBMNET-App im HOME-Menü starten und dort auf "MBMNET" tippen.
Ohne GodMode9: mbmnet.cia mit FBI installieren, oder 3ds/mbmnet.3dsx
über den Homebrew Launcher starten.
Freiwillig: Themes/MBMNET-Design.zip ist ein HOME-Menü-Design mit eigenen Tönen
(Aussehen bleibt Standard). Mit Anemone3DS installieren.
TXT
rm -f "$SDZIP"
(cd "$SDTMP" && zip -qr "$SDZIP" LIESMICH.txt cias gm9 3ds Themes)
rm -rf "$SDTMP"
echo "SD-Paket: $(du -h "$SDZIP" | cut -f1)"
# --- Gitea-Release -------------------------------------------------------------------
# Zugangsdaten wie bei git push aus dem Schlüsselbund; sie landen nur in einer curl-Konfiguration
# über stdin (nicht in der Prozessliste, nicht in der Ausgabe).
CRED=$(printf 'protocol=https\nhost=git.mbm.wtf\n\n' | git credential fill)
GUSER=$(sed -n 's/^username=//p' <<<"$CRED")
GPASS=$(sed -n 's/^password=//p' <<<"$CRED")
api() { # api METHODE PFAD [weitere curl-Argumente]
local method=$1 path=$2; shift 2
printf 'user = "%s:%s"\n' "$GUSER" "$GPASS" | curl -sS --fail-with-body -K - -X "$method" "$GITEA/api/v1/repos/$REPO$path" "$@"
}
json() { python3 -c "import json,sys; d=json.load(sys.stdin); print($1)"; }
TAG="v$VERSION"
COMMIT=$(git -C "$RELEASE" rev-parse HEAD)
if ID=$( (api GET "/releases/tags/$TAG" | json "d['id']") 2>/dev/null ); then
echo "Release $TAG gibt es schon (ID $ID), ersetze die Dateien ..."
else
BODY=$(TAG="$TAG" COMMIT="$COMMIT" NOTIZEN="$NOTIZEN" python3 -c \
'import json,os; print(json.dumps({"tag_name": os.environ["TAG"], "target_commitish": os.environ["COMMIT"], "name": "MBMNET " + os.environ["TAG"], "body": os.environ["NOTIZEN"]}))')
ID=$(api POST /releases -H 'Content-Type: application/json' -d "$BODY" | json "d['id']")
echo "Release $TAG angelegt (ID $ID)"
fi
# Vorhandene Dateien gleichen Namens löschen (bei erneutem Lauf), dann hochladen
for f in mbmnet-sd.zip mbmnet-design.zip mbmnet.cia mbmnet.3dsx mbmnet-shop.cia mbmnet-shop.3dsx mbmnet-installieren.gm9; do
[ -f "$RELEASE/$f" ] || continue
for old in $(api GET "/releases/$ID/assets" | json "' '.join(str(a['id']) for a in d if a['name']=='$f')"); do
api DELETE "/releases/$ID/assets/$old" >/dev/null
done
api POST "/releases/$ID/assets?name=$f" -F "attachment=@$RELEASE/$f" >/dev/null
echo " $f hochgeladen"
done
echo "Fertig: v$VERSION ist veröffentlicht ($GITEA/$REPO/releases/tag/$TAG)."