#!/usr/bin/env sh set -eu usage() { cat <<'EOF' Usage: GITEA_TOKEN=... scripts/upload-gitea-release.sh TAG [artifact...] Environment: GITEA_URL Base URL, default https://git.palav.dev GITEA_REPO owner/repo, default Palav/dosh GITEA_TOKEN Token with release write permission GITEA_TITLE Release title, default TAG EOF } if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then usage exit 0 fi tag="${1:-}" if [ -z "$tag" ]; then usage >&2 exit 2 fi shift base="${GITEA_URL:-https://git.palav.dev}" repo="${GITEA_REPO:-Palav/dosh}" token="${GITEA_TOKEN:-}" title="${GITEA_TITLE:-$tag}" if [ -z "$token" ]; then echo "GITEA_TOKEN is required" >&2 exit 2 fi if [ "$#" -eq 0 ]; then set -- target/dosh-release/dosh-* fi api="$base/api/v1/repos/$repo" auth_header="Authorization: token $token" release_json="$(curl -fsS -H "$auth_header" "$api/releases/tags/$tag" 2>/dev/null || true)" release_id="" if [ -n "$release_json" ] && command -v jq >/dev/null 2>&1; then release_id="$(printf '%s\n' "$release_json" | jq -r '.id // empty')" elif [ -n "$release_json" ]; then release_id="$(printf '%s\n' "$release_json" | sed -n 's/^[[:space:]]*{"id":[[:space:]]*\([0-9][0-9]*\).*/\1/p' | sed -n '1p')" fi if [ -z "$release_id" ]; then payload="$(printf '{"tag_name":"%s","target_commitish":"main","name":"%s","body":"Dosh release %s","draft":false,"prerelease":false}\n' "$tag" "$title" "$tag")" release_json="$(curl -fsS -H "$auth_header" -H 'Content-Type: application/json' -X POST "$api/releases" -d "$payload")" if command -v jq >/dev/null 2>&1; then release_id="$(printf '%s\n' "$release_json" | jq -r '.id // empty')" else release_id="$(printf '%s\n' "$release_json" | sed -n 's/^[[:space:]]*{"id":[[:space:]]*\([0-9][0-9]*\).*/\1/p' | sed -n '1p')" fi fi if [ -z "$release_id" ]; then echo "could not determine Gitea release id for $tag" >&2 exit 1 fi delete_existing_asset() { name="$1" if ! command -v jq >/dev/null 2>&1; then return 0 fi printf '%s\n' "$release_json" \ | jq -r --arg name "$name" '.assets[]? | select(.name == $name) | .id' \ | while IFS= read -r asset_id; do [ -n "$asset_id" ] || continue echo "replacing $name" curl -fsS \ -H "$auth_header" \ -X DELETE \ "$api/releases/$release_id/assets/$asset_id" >/dev/null done } for artifact in "$@"; do if [ ! -f "$artifact" ]; then continue fi name="$(basename "$artifact")" delete_existing_asset "$name" echo "uploading $name" curl -fsS \ -H "$auth_header" \ -X POST \ -F "attachment=@$artifact" \ "$api/releases/$release_id/assets?name=$name" >/dev/null done