ci / test (push) Has been cancelled
ci / fuzz-smoke (push) Has been cancelled
ci / package-release (linux-x86_64, ubuntu-latest) (push) Has been cancelled
ci / package-release (macos-aarch64, macos-14) (push) Has been cancelled
ci / package-release (macos-x86_64, macos-13) (push) Has been cancelled
ci / package-release (windows-x86_64, windows-latest) (push) Has been cancelled
ci / remote-bench (push) Has been cancelled
99 lines
2.6 KiB
Bash
Executable File
99 lines
2.6 KiB
Bash
Executable File
#!/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
|