commit - ea661a8f54b6407e299e1989faf0b7448ff323ac
commit + 447368a7b2cd4034ff4d4928fb1aa4ae3317fe58
blob - /dev/null
blob + 9ef832b57eb620ae4d12fe18de68505363c394aa (mode 755)
--- /dev/null
+++ hack/release
+#!/usr/bin/env bash
+set -euo pipefail
+
+require() {
+ command -v "$1" &>/dev/null || {
+ echo "error: $1 not found"
+ exit 1
+ }
+}
+require git
+require git-cliff
+
+# --- pre-flight ---
+
+if [ "$(git rev-parse --abbrev-ref HEAD)" != "master" ]; then
+ echo "error: not on master branch"
+ exit 1
+fi
+
+if [ -n "$(git status --porcelain)" ]; then
+ echo "error: working tree is dirty"
+ exit 1
+fi
+
+# --- version calculation ---
+
+next=$(git-cliff --bumped-version | sed 's/^v//')
+
+if git tag | grep -qx "v$next"; then
+ echo "no releasable commits since v$next"
+ exit 0
+fi
+
+echo "releasing -> v$next"
+
+# --- update build.zig.zon ---
+
+sed -i "s/\.version = \"[^\"]*\"/.version = \"$next\"/" build.zig.zon
+git add build.zig.zon
+
+# --- changelog ---
+
+git-cliff --tag "v$next" --output CHANGELOG.md
+sed -i -e :a -e '/^\s*$/{$d;N;ba' -e '}' CHANGELOG.md
+git add CHANGELOG.md
+
+git commit -m "chore: release v$next"
+
+# --- tag and push ---
+
+git tag "v$next"
+git push origin master --tags
+
+echo "released v$next successfully"