109 lines
2.3 KiB
Bash
Executable File
109 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
cd "$root"
|
|
|
|
tag="${RELEASE_TAG:-}"
|
|
if [ -z "$tag" ]; then
|
|
tag="${GITHUB_REF_NAME:-}"
|
|
fi
|
|
if [ -z "$tag" ] && [ -n "${GITHUB_REF:-}" ]; then
|
|
tag="${GITHUB_REF##*/}"
|
|
fi
|
|
if [ -z "$tag" ]; then
|
|
echo "GITHUB_REF_NAME or GITHUB_REF is required" >&2
|
|
exit 1
|
|
fi
|
|
|
|
repo="${GITHUB_REPOSITORY:-agent/dataxl}"
|
|
server="${GITHUB_SERVER_URL:-https://git.rumginger.org}"
|
|
api="${server%/}/api/v1"
|
|
token="${GITEA_TOKEN:?GITEA_TOKEN is required}"
|
|
auth_header="Authorization: token ${token}"
|
|
|
|
status="$(
|
|
curl -sS -o /tmp/dataxl-release.json -w "%{http_code}" \
|
|
-H "$auth_header" \
|
|
"$api/repos/$repo/releases/tags/$tag"
|
|
)"
|
|
|
|
if [ "$status" = "200" ]; then
|
|
release_json="$(cat /tmp/dataxl-release.json)"
|
|
elif [ "$status" = "404" ]; then
|
|
body="$(
|
|
python3 - "$tag" <<'PY'
|
|
import json
|
|
import sys
|
|
|
|
tag = sys.argv[1]
|
|
print(json.dumps({
|
|
"tag_name": tag,
|
|
"name": tag,
|
|
"body": f"Automated dataxl release for {tag}.",
|
|
"draft": False,
|
|
"prerelease": any(part in tag for part in ("alpha", "beta", "rc")),
|
|
}))
|
|
PY
|
|
)"
|
|
release_json="$(
|
|
curl -fsS \
|
|
-H "$auth_header" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$body" \
|
|
"$api/repos/$repo/releases"
|
|
)"
|
|
else
|
|
echo "failed to look up release for $tag: HTTP $status" >&2
|
|
cat /tmp/dataxl-release.json >&2
|
|
exit 1
|
|
fi
|
|
|
|
release_id="$(
|
|
python3 -c 'import json, sys; print(json.load(sys.stdin)["id"])' <<<"$release_json"
|
|
)"
|
|
|
|
for file in dist/*; do
|
|
[ -f "$file" ] || continue
|
|
name="$(basename "$file")"
|
|
|
|
assets_json="$(
|
|
curl -fsS \
|
|
-H "$auth_header" \
|
|
"$api/repos/$repo/releases/$release_id/assets"
|
|
)"
|
|
existing_id="$(
|
|
python3 -c '
|
|
import json
|
|
import sys
|
|
|
|
name = sys.argv[1]
|
|
for asset in json.load(sys.stdin):
|
|
if asset.get("name") == name:
|
|
print(asset["id"])
|
|
break
|
|
' "$name" <<<"$assets_json"
|
|
)"
|
|
|
|
if [ -n "$existing_id" ]; then
|
|
curl -fsS -X DELETE \
|
|
-H "$auth_header" \
|
|
"$api/repos/$repo/releases/$release_id/assets/$existing_id"
|
|
fi
|
|
|
|
encoded_name="$(
|
|
python3 - "$name" <<'PY'
|
|
import sys
|
|
import urllib.parse
|
|
|
|
print(urllib.parse.quote(sys.argv[1]))
|
|
PY
|
|
)"
|
|
|
|
curl -fsS \
|
|
-H "$auth_header" \
|
|
-F "attachment=@${file}" \
|
|
"$api/repos/$repo/releases/$release_id/assets?name=$encoded_name" \
|
|
>/dev/null
|
|
done
|