release (969B)
1 #!/usr/bin/env bash 2 set -euo pipefail 3 4 require() { command -v "$1" &>/dev/null || { 5 echo "error: $1 not found" 6 exit 1 7 }; } 8 require git 9 require git-cliff 10 require jq 11 12 # --- pre-flight --- 13 14 if [ -n "$(git status --porcelain)" ]; then 15 echo "error: working tree is dirty" 16 exit 1 17 fi 18 19 next=$(git-cliff --bumped-version 2>/dev/null | sed 's/^v//') 20 21 if git tag | grep -qx "v$next"; then 22 echo "no releasable commits since v$next" 23 exit 0 24 fi 25 26 echo "releasing -> v$next" 27 28 # --- update files --- 29 30 jq --arg v "$next" '.version = $v' package.json >package.json.tmp 31 mv package.json.tmp package.json 32 33 # --- run git-cliff --- 34 git-cliff --tag "v$next" --output CHANGELOG.md 35 36 # --- remove newlines --- 37 sed -i -e :a -e '/^\s*$/{$d;N;ba' -e '}' CHANGELOG.md 38 39 # --- commit, tag, push --- 40 41 git add package.json pnpm-lock.yaml CHANGELOG.md flake.nix 42 git commit --no-verify -m "chore: release v$next" 43 git tag -a "v$next" -m "release v$next" 44 git push 45 git push --tags 46 47 echo "released v$next"