#!/usr/bin/env bash set -euo pipefail root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" artifact_dir="${ARTIFACT_DIR:-$root_dir/artifacts}" GITEA_SERVER_URL="${GITEA_SERVER_URL:?GITEA_SERVER_URL is required}" GITEA_REPOSITORY="${GITEA_REPOSITORY:?GITEA_REPOSITORY is required}" GITEA_RELEASE_TAG="${GITEA_RELEASE_TAG:?GITEA_RELEASE_TAG is required}" GITEA_TOKEN="${GITEA_TOKEN:?GITEA_TOKEN is required}" [[ "$GITEA_REPOSITORY" =~ ^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$ ]] || { echo "Invalid GITEA_REPOSITORY: $GITEA_REPOSITORY" >&2 exit 1 } owner="${GITEA_REPOSITORY%%/*}" repository="${GITEA_REPOSITORY#*/}" api="${GITEA_SERVER_URL%/}/api/v1/repos/$owner/$repository" metadata="$(mktemp)" response="$(mktemp)" existing_names="$(mktemp)" trap 'rm -f "$metadata" "$response" "$existing_names"' EXIT auth_header="Authorization: token $GITEA_TOKEN" status="$(curl --silent --show-error --output "$metadata" --write-out '%{http_code}' \ --header "$auth_header" "$api/releases/tags/$GITEA_RELEASE_TAG")" [[ "$status" == 200 ]] || { echo "Unable to find release $GITEA_RELEASE_TAG (HTTP $status)" >&2 cat "$metadata" >&2 exit 1 } release_id="$(python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])' < "$metadata")" python3 -c 'import json,sys; [print(a["name"]) for a in json.load(sys.stdin).get("assets", [])]' \ < "$metadata" > "$existing_names" shopt -s nullglob assets=("$artifact_dir"/*.deb "$artifact_dir"/*.apk) checksums=("$artifact_dir"/SHA256SUMS*) assets+=("${checksums[@]}") ((${#assets[@]} > 0)) || { echo "No release assets found in $artifact_dir" >&2 exit 1 } for asset in "${assets[@]}"; do name="$(basename "$asset")" if grep -Fxq -- "$name" "$existing_names"; then echo "Release asset already exists; keeping it: $name" continue fi encoded_name="$(python3 -c 'import sys,urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$name")" echo "Uploading release asset: $name" status="$(curl --silent --show-error --output "$response" --write-out '%{http_code}' \ --request POST --header "$auth_header" --form "attachment=@$asset" \ "$api/releases/$release_id/assets?name=$encoded_name")" [[ "$status" == 201 ]] || { echo "Gitea returned HTTP $status while uploading $name" >&2 cat "$response" >&2 exit 1 } : > "$response" done