#!/usr/bin/env bash # Attach files to the forge release for a tag, creating the release if there is # none, and replacing an asset of the same name: # # FORGE_API=http://host:3400/api/v1 FORGE_REPO=owner/repo FORGE_TOKEN=... \ # bash wai/quickstart/publish.sh <file>... # # Uploads go to FORGE_API directly (over the private network), never through the # public tunnel, whose request size cap a large asset would hit. set -euo pipefail if [ $# -lt 3 ]; then echo "usage: bash wai/quickstart/publish.sh <tag> <title> <file>..." >&2 exit 2 fi TAG="$1"; TITLE="$2"; shift 2 : "${FORGE_API:?}" "${FORGE_REPO:?}" "${FORGE_TOKEN:?}" AUTH="Authorization: token $FORGE_TOKEN" BASE="$FORGE_API/repos/$FORGE_REPO/releases" release_id() { curl -fsS -H "$AUTH" "$BASE/tags/$TAG" 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin).get("id", ""))' 2>/dev/null || true; } ID="$(release_id)" if [ -z "$ID" ]; then BODY="$(python3 -c 'import json,sys; print(json.dumps({"tag_name": sys.argv[1], "name": sys.argv[2], "body": "The WAI command line and what `wai dev` runs, for macOS, Linux and Windows: each archive holds bin/ (wai, wai-relay, wai-room, wai-remote-host, wai-pack), share/wai/web/ (the room client), a README and the licence; each .sha256 file checks its archive (`shasum -a 256 -c`)."}))' "$TAG" "$TITLE")" curl -fsS -H "$AUTH" -H 'content-type: application/json' -X POST "$BASE" -d "$BODY" > /dev/null 2>&1 || true # Builds run side by side; one of them created it if this did not. for _ in 1 2 3 4 5 6; do ID="$(release_id)"; [ -n "$ID" ] && break; sleep 3; done fi [ -n "$ID" ] || { echo "::error::no release for $TAG"; exit 1; } for f in "$@"; do name="$(basename "$f")" for old in $(curl -fsS -H "$AUTH" "$BASE/$ID/assets" | NAME="$name" python3 -c 'import json,os,sys; print(" ".join(str(a["id"]) for a in json.load(sys.stdin) if a["name"] == os.environ["NAME"]))'); do curl -fsS -H "$AUTH" -X DELETE "$BASE/$ID/assets/$old" > /dev/null done curl -fsS -H "$AUTH" -X POST "$BASE/$ID/assets?name=$name" -F "attachment=@$f;type=application/octet-stream" -o /dev/null -w "uploaded $name: http %{http_code}\n" done