#!/usr/bin/env bash # ============================================================ # PedScribe release helper — one command to tag a new version. # # Usage: # scripts/release.sh 6.1.1 # bump to 6.1.1 # scripts/release.sh 6.1.1 --push # also git push + tag push # scripts/release.sh 6.2.0 --push --gh # also create GitHub release # # What it does: # 1. Updates version in root package.json # 2. Updates version in mobile/package.json # 3. Updates versionName + bumps versionCode in Android build.gradle # 4. Commits the version bump # 5. (optional) git push + push the new tag # 6. (optional) create a GitHub release via gh CLI # # It does NOT: # - Build the Docker image (run `docker compose build`/`up -d` yourself # or wire it to a deploy script / CI hook) # - Build the Android APK (run `cd mobile/android && ./gradlew ...` # yourself). This script just marks the version so the build tags # correctly. # ============================================================ set -euo pipefail VERSION="${1:-}" PUSH=false DO_RELEASE=false for arg in "${@:2}"; do case "$arg" in --push) PUSH=true ;; --gh) DO_RELEASE=true ;; esac done if [[ -z "$VERSION" ]]; then echo "usage: $0 [--push] [--gh]" echo " example: $0 6.1.1 --push --gh" exit 1 fi if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "ERROR: version must be semver X.Y.Z (e.g. 6.1.1). got: $VERSION" >&2 exit 1 fi ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" if [[ -n "$(git status --porcelain)" ]]; then echo "ERROR: working tree has uncommitted changes. commit or stash first." >&2 git status --short >&2 exit 1 fi echo "==> Bumping to v$VERSION" # Bump a package.json "version" field without needing node/jq. # Only touches the first top-level "version": "…" line, which is the # canonical location npm puts it. Fragile only if someone hand-wrote # a nested "version" ABOVE the top-level one. bump_pkg_version() { local file="$1" new="$2" sed -i -E "0,/(\"version\"[[:space:]]*:[[:space:]]*\")[^\"]+(\")/ s//\1${new}\2/" "$file" } bump_pkg_version package.json "$VERSION" echo " updated package.json" bump_pkg_version mobile/package.json "$VERSION" echo " updated mobile/package.json" # Android build.gradle # versionCode: encode X.Y.Z as X*100000 + Y*1000 + Z (room for 999 patches) IFS='.' read -r MAJ MIN PAT <<< "$VERSION" ANDROID_CODE=$(( MAJ * 100000 + MIN * 1000 + PAT )) sed -i -E \ -e "s/versionCode +[0-9]+/versionCode ${ANDROID_CODE}/" \ -e "s/versionName +\"[^\"]+\"/versionName \"${VERSION}\"/" \ mobile/android/app/build.gradle echo " updated mobile/android/app/build.gradle (code=$ANDROID_CODE, name=$VERSION)" # Commit git add package.json mobile/package.json mobile/android/app/build.gradle git commit -m "Release v${VERSION}" echo " committed" # Tag git tag -a "v${VERSION}" -m "Release v${VERSION}" echo " tagged v${VERSION}" if $PUSH; then git push origin HEAD git push origin "v${VERSION}" echo " pushed to origin" fi if $DO_RELEASE; then if ! command -v gh >/dev/null; then echo "WARN: gh CLI not installed, skipping GitHub release creation" >&2 else APK="mobile/android/app/build/outputs/apk/release/app-release.apk" if [[ -f "$APK" ]]; then gh release create "v${VERSION}" "$APK" \ --title "PedScribe ${VERSION}" \ --notes "Release ${VERSION}" \ --latest echo " created GitHub release with APK" else gh release create "v${VERSION}" \ --title "PedScribe ${VERSION}" \ --notes "Release ${VERSION}" \ --latest echo " created GitHub release (no APK attached — run gradle first then gh release upload)" fi fi fi echo "==> Done. v$VERSION."