|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# ============================================================================ |
| 4 | +# merge-to-release.sh |
| 5 | +# |
| 6 | +# Creates a PR to merge a development branch into its corresponding release |
| 7 | +# branch. Used after a version bump PR has been merged. |
| 8 | +# |
| 9 | +# Usage: |
| 10 | +# ./scripts/merge-to-release.sh <version> [--preview] |
| 11 | +# |
| 12 | +# Examples: |
| 13 | +# ./scripts/merge-to-release.sh 2.5.0 # test-main → test-release/stable/v2 |
| 14 | +# ./scripts/merge-to-release.sh 2.5.1-preview --preview # test-preview → test-release/v2 |
| 15 | +# |
| 16 | +# Prerequisites: |
| 17 | +# - git and gh (GitHub CLI) must be installed and authenticated |
| 18 | +# ============================================================================ |
| 19 | + |
| 20 | +set -euo pipefail |
| 21 | + |
| 22 | +# ── Helpers ────────────────────────────────────────────────────────────────── |
| 23 | + |
| 24 | +usage() { |
| 25 | + cat <<EOF |
| 26 | +Usage: $(basename "$0") <version> [--preview] |
| 27 | +
|
| 28 | +Arguments: |
| 29 | + version The version that was just bumped (used to determine major version) |
| 30 | + --preview Merge test-preview → test-release/v{major} instead of |
| 31 | + test-main → test-release/stable/v{major} |
| 32 | +
|
| 33 | +Examples: |
| 34 | + $(basename "$0") 2.5.0 # test-main → test-release/stable/v2 |
| 35 | + $(basename "$0") 2.5.1-preview --preview # test-preview → test-release/v2 |
| 36 | +EOF |
| 37 | + exit 1 |
| 38 | +} |
| 39 | + |
| 40 | +error() { |
| 41 | + echo "ERROR: $1" >&2 |
| 42 | + exit 1 |
| 43 | +} |
| 44 | + |
| 45 | +info() { |
| 46 | + echo "── $1" |
| 47 | +} |
| 48 | + |
| 49 | +# ── Parse arguments ────────────────────────────────────────────────────────── |
| 50 | + |
| 51 | +VERSION="" |
| 52 | +IS_PREVIEW=false |
| 53 | + |
| 54 | +while [[ $# -gt 0 ]]; do |
| 55 | + case "$1" in |
| 56 | + --preview) |
| 57 | + IS_PREVIEW=true |
| 58 | + shift |
| 59 | + ;; |
| 60 | + -h|--help) |
| 61 | + usage |
| 62 | + ;; |
| 63 | + *) |
| 64 | + if [[ -z "$VERSION" ]]; then |
| 65 | + VERSION="$1" |
| 66 | + else |
| 67 | + error "Unexpected argument: $1" |
| 68 | + fi |
| 69 | + shift |
| 70 | + ;; |
| 71 | + esac |
| 72 | +done |
| 73 | + |
| 74 | +[[ -z "$VERSION" ]] && usage |
| 75 | + |
| 76 | +# Validate version format |
| 77 | +if ! echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(-preview)?$'; then |
| 78 | + error "Invalid version format '$VERSION'. Expected: X.Y.Z or X.Y.Z-preview" |
| 79 | +fi |
| 80 | + |
| 81 | +# ── Determine branches ────────────────────────────────────────────────────── |
| 82 | + |
| 83 | +# Extract major version (e.g. "2" from "2.5.0" or "2.5.1-preview") |
| 84 | +MAJOR_VERSION=$(echo "$VERSION" | cut -d. -f1) |
| 85 | + |
| 86 | +if [[ "$IS_PREVIEW" == true ]]; then |
| 87 | + SOURCE_BRANCH="test-preview" |
| 88 | + TARGET_BRANCH="test-release/v${MAJOR_VERSION}" |
| 89 | + PR_TITLE="Merge test-preview to test-release/v${MAJOR_VERSION}" |
| 90 | +else |
| 91 | + SOURCE_BRANCH="test-main" |
| 92 | + TARGET_BRANCH="test-release/stable/v${MAJOR_VERSION}" |
| 93 | + PR_TITLE="Merge test-main to test-release/stable/v${MAJOR_VERSION}" |
| 94 | +fi |
| 95 | + |
| 96 | +info "Source branch : $SOURCE_BRANCH" |
| 97 | +info "Target branch : $TARGET_BRANCH" |
| 98 | +info "PR title : $PR_TITLE" |
| 99 | +echo "" |
| 100 | + |
| 101 | +# ── Confirm with user ──────────────────────────────────────────────────────── |
| 102 | + |
| 103 | +read -rp "Proceed? [y/N] " confirm |
| 104 | +if [[ ! "$confirm" =~ ^[Yy]$ ]]; then |
| 105 | + echo "Aborted." |
| 106 | + exit 0 |
| 107 | +fi |
| 108 | + |
| 109 | +echo "" |
| 110 | + |
| 111 | +# ── Resolve project directory ──────────────────────────────────────────────── |
| 112 | + |
| 113 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 114 | +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" |
| 115 | +cd "$PROJECT_DIR" |
| 116 | + |
| 117 | +# ── Fetch latest branches ─────────────────────────────────────────────────── |
| 118 | + |
| 119 | +info "Fetching latest branches..." |
| 120 | +git fetch origin "$SOURCE_BRANCH" |
| 121 | +git fetch origin "$TARGET_BRANCH" |
| 122 | + |
| 123 | +# ── Create PR ──────────────────────────────────────────────────────────────── |
| 124 | + |
| 125 | +info "Creating pull request..." |
| 126 | +PR_URL=$(gh pr create \ |
| 127 | + --base "$TARGET_BRANCH" \ |
| 128 | + --head "$SOURCE_BRANCH" \ |
| 129 | + --title "$PR_TITLE" \ |
| 130 | + --body "Merge \`$SOURCE_BRANCH\` into \`$TARGET_BRANCH\` after version bump \`$VERSION\`. |
| 131 | +
|
| 132 | +> **Important**: Use **Merge commit** (not squash) when merging this PR to preserve commit history. |
| 133 | +
|
| 134 | +--- |
| 135 | +*This PR was created automatically by \`scripts/merge-to-release.sh\`.*") |
| 136 | + |
| 137 | +echo "" |
| 138 | +info "Done! PR created: $PR_URL" |
| 139 | +echo "" |
| 140 | +echo "⚠️ Remember: Use \"Merge commit\" (not squash) when merging this PR." |
0 commit comments