Commit Diff


commit - ea661a8f54b6407e299e1989faf0b7448ff323ac
commit + 447368a7b2cd4034ff4d4928fb1aa4ae3317fe58
blob - /dev/null
blob + 9ef832b57eb620ae4d12fe18de68505363c394aa (mode 755)
--- /dev/null
+++ hack/release
@@ -0,0 +1,54 @@
+#!/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"