#!/usr/bin/env bash set -euo pipefail if [ $# -ne 1 ]; then echo "Usage: $0 <version>" echo " e.g. $0 0.2.0" exit 1 fi VERSION="$1" # Validate semver if ! echo "$VERSION" | grep -qP '^\d+\.\d+\.\d+$'; then echo "error: version must be semver (e.g. 0.2.0)" exit 1 fi # Must be on main BRANCH=$(git rev-parse --abbrev-ref HEAD) if [ "$BRANCH" != "main" ]; then echo "error: releases must be made from main (currently on $BRANCH)" exit 1 fi # Working tree must be clean if ! git diff --stat --exit-code; then echo "error: working tree has uncommitted changes" exit 1 fi if ! git diff --cached --stat --exit-code; then echo "error: staged but uncommitted changes" exit 1 fi # Tag must not already exist if git tag -l "v$VERSION" | grep -q .; then echo "error: tag v$VERSION already exists" exit 1 fi echo "==> Bumping version to $VERSION in Cargo.toml" sed -i "s/^version = \".*\"/version = \"$VERSION\"/" Cargo.toml echo "==> Running cargo test" cargo test 2>&1 | tail -5 echo "==> Running cargo build --release" cargo build --release 2>&1 | tail -3 echo "==> Committing release: v$VERSION" git add Cargo.toml Cargo.lock git commit -m "release: v$VERSION" echo "==> Tagging v$VERSION" git tag -a "v$VERSION" -m "release: v$VERSION" echo "" echo "Release v$VERSION ready." echo "To publish: git push --tags origin main" echo "To undo: git tag -d v$VERSION && git reset --soft HEAD~1"