From 3a3d6d93a23be376dade1ccff194145d5b6c4051 Mon Sep 17 00:00:00 2001 From: Paul Thurlow Date: Tue, 17 Mar 2026 13:50:38 -0700 Subject: [PATCH 1/2] Add release script to wrap cargo release PR process --- scripts/release.sh | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 scripts/release.sh diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..d6ab203 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# release.sh — two-phase release wrapper around cargo-release +# +# Usage: +# scripts/release.sh prepare # steps 0-2: branch, bump, push PR +# scripts/release.sh finish # step 4: tag, publish, trigger dist + +set -euo pipefail + +COMMAND="${1:-}" +VERSION="${2:-}" + +usage() { + echo "Usage:" + echo " scripts/release.sh prepare # create release branch and open PR" + echo " scripts/release.sh finish # tag and publish from main" + exit 1 +} + +require_clean_tree() { + if ! git diff --quiet || ! git diff --cached --quiet; then + echo "error: working tree is not clean. Commit or stash your changes first." + exit 1 + fi +} + +case "$COMMAND" in + prepare) + if [ -z "$VERSION" ]; then + echo "error: version required (e.g. scripts/release.sh prepare 0.2.0)" + usage + fi + + BRANCH="release/$VERSION" + + # step 0: create release branch + echo "→ Creating branch $BRANCH" + git checkout -b "$BRANCH" + + # step 2: bump versions, commit, push branch + echo "" + echo "→ Running cargo release (no publish, no tag)..." + cargo release --no-publish --no-tag --allow-branch="$BRANCH" "$VERSION" + + echo "" + echo "→ Opening pull request..." + PR_URL=$(gh pr create \ + --title "chore: Release hotdata-cli version $VERSION" \ + --base main \ + --head "$BRANCH") + + echo "" + echo "✓ PR created: $PR_URL" + open "$PR_URL" + echo "" + echo "Next steps:" + echo " 1. Review and merge the PR (use 'Squash and merge')" + echo " 2. Run: scripts/release.sh finish" + ;; + + finish) + require_clean_tree + + CURRENT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" + if [ "$CURRENT_BRANCH" != "main" ]; then + echo "→ Switching to main..." + git checkout main + fi + + echo "→ Pulling latest main..." + git pull + + echo "" + echo "→ Running cargo release (tagging release)..." + cargo release + + echo "" + echo "✓ Release complete. Tag pushed and dist workflow triggered." + ;; + + *) + usage + ;; +esac From 4816bc72b73b10a707fc6d0b4435a9ea9f69dc7f Mon Sep 17 00:00:00 2001 From: Paul Thurlow Date: Tue, 17 Mar 2026 13:54:33 -0700 Subject: [PATCH 2/2] Update readme on release process --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index ee64173..b62fd88 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,32 @@ hotdata tables list --connection-id [--format tab hotdata query "" --workspace-id [--connection ] [--format table|json|csv] ``` +## Releasing + +Releases use a two-phase workflow wrapping [`cargo-release`](https://github.com/crate-ci/cargo-release). + +**Phase 1 — prepare** + +```sh +scripts/release.sh prepare +# e.g. scripts/release.sh prepare 0.2.0 +``` + +This will: +1. Create a `release/` branch +2. Bump the version in `Cargo.toml`, update `CHANGELOG.md`, and push the branch +3. Open a GitHub pull request and launch it in the browser + +Squash and merge the PR into `main` when ready. + +**Phase 2 — finish** + +```sh +scripts/release.sh finish +``` + +Run this from any branch after the PR is merged. It will switch to `main`, pull the latest, tag the release, and trigger the dist workflow. + ## Configuration Config is stored at `~/.hotdata/config.yml` keyed by profile (default: `default`).