ci / test (push) Has been cancelled
ci / fuzz-smoke (push) Has been cancelled
ci / windows-client (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
126 lines
3.3 KiB
Bash
Executable File
126 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
set -eu
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage:
|
|
scripts/publish-gitea-release.sh [TAG]
|
|
|
|
Publishes the current Dosh release to Gitea.
|
|
|
|
Defaults:
|
|
TAG v<Cargo.toml version>
|
|
DOSH_PUBLISH_BUILD 1: run scripts/package-release.sh first
|
|
DOSH_PUBLISH_PUSH 1: push TAG to origin
|
|
DOSH_PUBLISH_PRUNE 1: remove stale dosh-<version>-* duplicate assets
|
|
|
|
Environment:
|
|
GITEA_URL, GITEA_REPO, GITEA_TOKEN: same as upload-gitea-release.sh
|
|
DOSH_PUBLISH_ALLOW_DIRTY=1 allow uncommitted changes
|
|
EOF
|
|
}
|
|
|
|
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
|
|
usage
|
|
exit 0
|
|
fi
|
|
|
|
repo_root="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
|
|
cd "$repo_root"
|
|
|
|
version="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | sed -n '1p')"
|
|
tag="${1:-v$version}"
|
|
base="${GITEA_URL:-https://git.palav.dev}"
|
|
repo="${GITEA_REPO:-Palav/dosh}"
|
|
token="${GITEA_TOKEN:-}"
|
|
build="${DOSH_PUBLISH_BUILD:-1}"
|
|
push_tag="${DOSH_PUBLISH_PUSH:-1}"
|
|
prune="${DOSH_PUBLISH_PRUNE:-1}"
|
|
|
|
if [ -z "$token" ] && [ -f "$HOME/.config/dosh/gitea-token" ]; then
|
|
token="$(tr -d '\r\n' <"$HOME/.config/dosh/gitea-token")"
|
|
fi
|
|
|
|
need() {
|
|
if ! command -v "$1" >/dev/null 2>&1; then
|
|
echo "missing required command: $1" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
need git
|
|
need curl
|
|
|
|
if [ "${DOSH_PUBLISH_ALLOW_DIRTY:-0}" != "1" ] && [ -n "$(git status --porcelain)" ]; then
|
|
echo "refusing to publish with uncommitted changes" >&2
|
|
echo "commit first, or set DOSH_PUBLISH_ALLOW_DIRTY=1" >&2
|
|
exit 1
|
|
fi
|
|
|
|
head="$(git rev-parse HEAD)"
|
|
if git rev-parse -q --verify "refs/tags/$tag" >/dev/null; then
|
|
tagged="$(git rev-list -n 1 "$tag")"
|
|
if [ "$tagged" != "$head" ]; then
|
|
echo "tag $tag points at $tagged, not HEAD $head" >&2
|
|
exit 1
|
|
fi
|
|
else
|
|
git tag "$tag" "$head"
|
|
fi
|
|
|
|
if [ "$push_tag" = "1" ]; then
|
|
git push origin "$tag"
|
|
fi
|
|
|
|
if [ "$build" = "1" ]; then
|
|
sh scripts/package-release.sh
|
|
fi
|
|
|
|
scripts/upload-gitea-release.sh "$tag"
|
|
|
|
api="$base/api/v1/repos/$repo"
|
|
auth_header="Authorization: token $token"
|
|
release_json="$(curl -fsS -H "$auth_header" "$api/releases/tags/$tag")"
|
|
release_id=""
|
|
if command -v jq >/dev/null 2>&1; then
|
|
release_id="$(printf '%s\n' "$release_json" | jq -r '.id // empty')"
|
|
fi
|
|
|
|
if [ "$prune" = "1" ] && [ -n "$release_id" ] && command -v jq >/dev/null 2>&1; then
|
|
printf '%s\n' "$release_json" \
|
|
| jq -r '.assets[]? | select(.name | test("^dosh-[0-9]")) | [.id, .name] | @tsv' \
|
|
| while IFS="$(printf '\t')" read -r asset_id name; do
|
|
[ -n "$asset_id" ] || continue
|
|
echo "deleting duplicate $name"
|
|
curl -fsS -H "$auth_header" -X DELETE "$api/releases/$release_id/assets/$asset_id" >/dev/null
|
|
done
|
|
release_json="$(curl -fsS -H "$auth_header" "$api/releases/tags/$tag")"
|
|
fi
|
|
|
|
web_repo="${base%/}/${repo}"
|
|
failed=0
|
|
for artifact in target/dosh-release/dosh-linux-*.tar.gz target/dosh-release/dosh-macos-*.tar.gz target/dosh-release/dosh-windows-*.zip; do
|
|
[ -f "$artifact" ] || continue
|
|
name="$(basename "$artifact")"
|
|
case "$name" in
|
|
dosh-[0-9]*)
|
|
continue
|
|
;;
|
|
esac
|
|
url="$web_repo/releases/download/$tag/$name"
|
|
if curl -fsSI "$url" >/dev/null; then
|
|
echo "verified $url"
|
|
else
|
|
echo "missing release asset: $url" >&2
|
|
failed=1
|
|
fi
|
|
done
|
|
|
|
if [ "$failed" != "0" ]; then
|
|
exit 1
|
|
fi
|
|
|
|
if command -v jq >/dev/null 2>&1; then
|
|
printf '%s\n' "$release_json" | jq -r '"assets=\(.assets|length)", (.assets[] | "\(.name) \(.size)")'
|
|
fi
|