|
| 1 | +#!/usr/bin/env bash |
| 2 | +# bump-version.sh — Standardised version bumping for Allow2 Python SDK |
| 3 | +# Usage: ./scripts/bump-version.sh [prerelease|patch|minor|major] [--preid alpha|beta|rc] |
| 4 | +# |
| 5 | +# Python uses PEP 440: 2.0.0a1 (alpha), 2.0.0b1 (beta), 2.0.0rc1 (release candidate) |
| 6 | +# |
| 7 | +# Examples: |
| 8 | +# ./scripts/bump-version.sh prerelease --preid alpha # 2.0.0a1 → 2.0.0a2 |
| 9 | +# ./scripts/bump-version.sh prerelease --preid beta # 2.0.0a2 → 2.0.0b1 |
| 10 | +# ./scripts/bump-version.sh patch # 2.0.0a2 → 2.0.1 |
| 11 | +# ./scripts/bump-version.sh minor # 2.0.1 → 2.1.0 |
| 12 | +# ./scripts/bump-version.sh major # 2.1.0 → 3.0.0 |
| 13 | +set -euo pipefail |
| 14 | +cd "$(dirname "$0")/.." |
| 15 | + |
| 16 | +VERSION_FILE="pyproject.toml" |
| 17 | +BUMP="${1:-prerelease}" |
| 18 | +PREID="" |
| 19 | +if [[ "${2:-}" == "--preid" ]]; then PREID="${3:-alpha}"; fi |
| 20 | + |
| 21 | +# Map preid to PEP 440 suffix |
| 22 | +pep440_suffix() { |
| 23 | + case "$1" in |
| 24 | + alpha) echo "a" ;; |
| 25 | + beta) echo "b" ;; |
| 26 | + rc) echo "rc" ;; |
| 27 | + *) echo "a" ;; |
| 28 | + esac |
| 29 | +} |
| 30 | + |
| 31 | +# Read current version from pyproject.toml |
| 32 | +OLD=$(grep '^version = ' "$VERSION_FILE" | head -1 | sed 's/version = "\(.*\)"/\1/') |
| 33 | + |
| 34 | +# Parse version: 2.0.0a1 → major=2 minor=0 patch=0 pre_type=a pre_num=1 |
| 35 | +if [[ "$OLD" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)(a|b|rc)?([0-9]+)?$ ]]; then |
| 36 | + MAJOR="${BASH_REMATCH[1]}" |
| 37 | + MINOR="${BASH_REMATCH[2]}" |
| 38 | + PATCH="${BASH_REMATCH[3]}" |
| 39 | + PRE_TYPE="${BASH_REMATCH[4]:-}" |
| 40 | + PRE_NUM="${BASH_REMATCH[5]:-}" |
| 41 | +else |
| 42 | + echo "Cannot parse version: $OLD" >&2; exit 1 |
| 43 | +fi |
| 44 | + |
| 45 | +case "$BUMP" in |
| 46 | + prerelease) |
| 47 | + SUFFIX=$(pep440_suffix "${PREID:-alpha}") |
| 48 | + if [[ "$PRE_TYPE" == "$SUFFIX" && -n "$PRE_NUM" ]]; then |
| 49 | + NEW="${MAJOR}.${MINOR}.${PATCH}${SUFFIX}$((PRE_NUM + 1))" |
| 50 | + else |
| 51 | + NEW="${MAJOR}.${MINOR}.${PATCH}${SUFFIX}1" |
| 52 | + fi |
| 53 | + ;; |
| 54 | + patch) |
| 55 | + NEW="$MAJOR.$MINOR.$((PATCH + 1))" |
| 56 | + ;; |
| 57 | + minor) |
| 58 | + NEW="$MAJOR.$((MINOR + 1)).0" |
| 59 | + ;; |
| 60 | + major) |
| 61 | + NEW="$((MAJOR + 1)).0.0" |
| 62 | + ;; |
| 63 | + *) |
| 64 | + echo "Usage: $0 [prerelease|patch|minor|major] [--preid alpha|beta|rc]" >&2 |
| 65 | + exit 1 |
| 66 | + ;; |
| 67 | +esac |
| 68 | + |
| 69 | +# Write back |
| 70 | +sed -i "s/^version = \"${OLD}\"/version = \"${NEW}\"/" "$VERSION_FILE" |
| 71 | + |
| 72 | +echo "$OLD → $NEW" |
| 73 | +git add "$VERSION_FILE" |
| 74 | +git commit -m "v$NEW" |
| 75 | +# Tag uses semver format for CI publish workflow |
| 76 | +TAG="v${MAJOR}.${MINOR}.${PATCH}" |
| 77 | +if [[ "$NEW" != "${MAJOR}.${MINOR}.${PATCH}" ]]; then |
| 78 | + # Convert PEP 440 back to semver for tag: 2.0.0a2 → v2.0.0-alpha.2 |
| 79 | + TAG_PRE=$(echo "$NEW" | sed "s/${MAJOR}\.${MINOR}\.${PATCH}//") |
| 80 | + TAG_PRE=$(echo "$TAG_PRE" | sed 's/^a/-alpha./; s/^b/-beta./; s/^rc/-rc./') |
| 81 | + TAG="v${MAJOR}.${MINOR}.${PATCH}${TAG_PRE}" |
| 82 | +fi |
| 83 | +git tag "$TAG" |
| 84 | +echo "Tagged $TAG — push with: git push origin master --tags" |
0 commit comments