#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" REMOTE_NAME="${1:-origin}" QUIET_RELEASE="${QUIET_RELEASE:-1}" RELEASE_LOG="${RELEASE_LOG:-$ROOT_DIR/build/release.log}" if [[ -n "${SKIP_RELEASE:-}" ]]; then echo "release: skipped (SKIP_RELEASE=1)" exit 0 fi should_release=false release_local_ref="" release_remote_ref="" while read -r local_ref local_sha remote_ref remote_sha; do [[ -z "${local_ref:-}" ]] && continue if [[ "$local_ref" == "refs/heads/master" || "$remote_ref" == "refs/heads/master" ]]; then should_release=true release_local_ref="$local_ref" release_remote_ref="${remote_ref:-refs/heads/master}" fi done if [[ "$should_release" != true ]]; then current_branch="$(git -C "$ROOT_DIR" symbolic-ref --short -q HEAD || true)" if [[ "$current_branch" == "master" ]]; then should_release=true release_local_ref="refs/heads/master" release_remote_ref="refs/heads/master" fi fi if [[ "$should_release" != true ]]; then exit 0 fi if [[ "$QUIET_RELEASE" == "1" ]]; then mkdir -p "$(dirname "$RELEASE_LOG")" : >"$RELEASE_LOG" fi run_logged() { if [[ "$QUIET_RELEASE" == "1" ]]; then "$@" >>"$RELEASE_LOG" 2>&1 else "$@" fi } if [[ "$QUIET_RELEASE" == "1" ]]; then NEW_VERSION="$("$ROOT_DIR/scripts/bump_version.sh" 2>>"$RELEASE_LOG" | tee -a "$RELEASE_LOG")" else NEW_VERSION="$("$ROOT_DIR/scripts/bump_version.sh")" fi run_logged "$ROOT_DIR/scripts/sync_version.sh" git -C "$ROOT_DIR" add "$ROOT_DIR/version.json" "$ROOT_DIR/iKeyMon.xcodeproj/project.pbxproj" echo "release: building v${NEW_VERSION}..." if ! run_logged "$ROOT_DIR/scripts/build_release.sh"; then echo "release: failed (log: $RELEASE_LOG)" exit 1 fi git -C "$ROOT_DIR" add "$ROOT_DIR/version.json" "$ROOT_DIR/iKeyMon.xcodeproj/project.pbxproj" "$ROOT_DIR/Sparkle/appcast.xml" if git -C "$ROOT_DIR" diff --cached --quiet; then echo "release: no changes detected; skipping commit" else run_logged git -C "$ROOT_DIR" commit -m "chore: release ${NEW_VERSION}" || { echo "release: commit failed (log: $RELEASE_LOG)" exit 1 } fi if SKIP_RELEASE=1 git -C "$ROOT_DIR" push --quiet "$REMOTE_NAME" "${release_local_ref:-refs/heads/master}:${release_remote_ref:-refs/heads/master}"; then echo "release: success v${NEW_VERSION}" exit 1 else echo "release: push failed (log: $RELEASE_LOG)" exit 1 fi