#!/bin/bash set -euo pipefail REMOTE="github" BRANCH="master" REMOTE_BRANCH="main" usage() { echo "Usage: $0 [options]" echo "" echo "Commands:" echo " commit Commit and push" echo " release [message] Bump version, commit, tag, push" echo "" echo "Examples:" echo " $0 commit \"fix: some bug\"" echo " $0 release 0.3.0" echo " $0 release 0.3.0 \"add new feature\"" exit 1 } current_version() { grep '^version' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/' } bump_version() { local new_ver="$1" sed -i '' "s/^version = \".*\"/version = \"$new_ver\"/" Cargo.toml echo "Version bumped: $(current_version) -> $new_ver" } cmd_commit() { local msg="$1" git add -A if git diff --cached --quiet; then echo "Nothing to commit." return fi git commit -m "$msg" git push "$REMOTE" "$BRANCH:$REMOTE_BRANCH" echo "Pushed to $REMOTE:$REMOTE_BRANCH" } cmd_release() { local ver="$1" local msg="${2:-release v$ver}" local tag="v$ver" if git tag -l "$tag" | grep -q .; then echo "Tag $tag already exists!" exit 1 fi git add -A if ! git diff --cached --quiet; then echo "Staged changes detected, committing first..." git commit -m "$msg" fi bump_version "$ver" if command -v git-cliff &>/dev/null; then git-cliff --tag "$tag" -o CHANGELOG.md echo "Changelog generated" fi git add -A git commit -m "release: v$ver" git tag "$tag" git push "$REMOTE" "$BRANCH:$REMOTE_BRANCH" git push "$REMOTE" "$tag" echo "Released $tag and pushed to $REMOTE" } if [ $# -lt 1 ]; then usage fi case "$1" in commit) [ $# -lt 2 ] && usage cmd_commit "$2" ;; release) [ $# -lt 2 ] && usage cmd_release "$2" "${3:-}" ;; *) usage ;; esac