| @@ -0,0 +1,60 @@ |
| +#!/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" |