WAI toolchain decision 11: joule-moq-relay builds wai-relay, joule-moq-room wai-room, and joule-moq-ingest wai-ingest. wai dev finds them by those names (WAI_RELAY_BIN, WAI_ROOM_BIN), and the quickstart archive, the release workflow, the examples' workflow, the browser tests, the interop scripts, the example host script, the Scoop manifest and the crates' READMEs and example configurations name them so. Wire and record identifiers that carry a crate's name (joule-moq-relay/session-summary/2, joule-moq-ingest/session/1, the relay's MOQT implementation string) and the log variables (JOULE_MOQ_*_LOG) are unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]>
34 lines
2.1 KiB
Shell
Executable file
34 lines
2.1 KiB
Shell
Executable file
#!/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 <tag> <title> <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
|