diff --git a/.github/workflows/prep-plugin-releases.yml b/.github/workflows/prep-plugin-releases.yml index 5b06fe5..c46825e 100644 --- a/.github/workflows/prep-plugin-releases.yml +++ b/.github/workflows/prep-plugin-releases.yml @@ -34,7 +34,7 @@ on: default: true env: - GITHUB_TOKEN: ${{ secrets.MOBILE_PLUGIN_RELEASE_PAT }} + GH_TOKEN: ${{ secrets.MOBILE_PLUGIN_RELEASE_PAT }} jobs: centralized-plugin-releases: @@ -82,7 +82,7 @@ jobs: "${{ github.event.inputs.android_version }}" \ $PLUGIN_ARGS env: - GITHUB_TOKEN: ${{ secrets.MOBILE_PLUGIN_RELEASE_PAT }} + GH_TOKEN: ${{ secrets.MOBILE_PLUGIN_RELEASE_PAT }} GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} - name: Display release summary diff --git a/.github/workflows/prep-proxy-release.yml b/.github/workflows/prep-proxy-release.yml index e83fe1c..5d96fc0 100644 --- a/.github/workflows/prep-proxy-release.yml +++ b/.github/workflows/prep-proxy-release.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: env: - BUNDLE_PATH: vendor/bundle + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: prepare-release: @@ -16,10 +16,7 @@ jobs: - name: Detect SDK versions id: detect - run: | - ./scripts/detect_sdk_versions.sh - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: ./scripts/detect_sdk_versions.sh - name: Display version summary run: | @@ -40,8 +37,7 @@ jobs: EOF - name: Prepare release - run: | - ./scripts/prep_proxy_release.sh + run: ./scripts/prep_proxy_release.sh - name: Create Pull Request id: cpr diff --git a/.gitignore b/.gitignore index aaad1fb..e0a9204 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ AirshipConfig.plist docs/ # Typescript -lib/ +/lib/ # Yarn yarn-error.log diff --git a/AirshipFrameworkProxy.podspec b/AirshipFrameworkProxy.podspec index 279533a..c1ad2ff 100644 --- a/AirshipFrameworkProxy.podspec +++ b/AirshipFrameworkProxy.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| - s.version = "15.0.1" + s.version = "15.0.2" s.name = "AirshipFrameworkProxy" s.summary = "Airship iOS mobile framework proxy" s.documentation_url = "https://docs.airship.com/platform/mobile" diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index ab8b1b4..30b9442 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] # Airship -airshipProxy = '15.0.1' -airship = '20.0.4' +airshipProxy = '15.0.2' +airship = '20.0.6' # Gradle plugins androidGradlePlugin = '8.13.1' diff --git a/scripts/detect_sdk_versions.sh b/scripts/detect_sdk_versions.sh index 65cc1b9..e6b877f 100755 --- a/scripts/detect_sdk_versions.sh +++ b/scripts/detect_sdk_versions.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e # Detect SDK versions and calculate proxy version bump @@ -7,6 +7,9 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +# Source shared utilities +source "$SCRIPT_DIR/lib/version_utils.sh" + # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' @@ -36,45 +39,24 @@ echo -e "Current iOS SDK: ${BOLD}$CURRENT_IOS_VERSION${NC}" CURRENT_ANDROID_VERSION=$(grep "airship =" "$REPO_ROOT/android/gradle/libs.versions.toml" | grep -o "[0-9]*\.[0-9]*\.[0-9]*") echo -e "Current Android SDK: ${BOLD}$CURRENT_ANDROID_VERSION${NC}" -echo -e "\n${BLUE}Fetching latest SDK tags...${NC}" +echo -e "\n${BLUE}Fetching latest SDK versions...${NC}" -# Fetch latest iOS SDK tag -LATEST_IOS_VERSION=$(gh api repos/urbanairship/ios-library/tags --jq '.[0].name' 2>/dev/null || echo "") -LATEST_IOS_VERSION="${LATEST_IOS_VERSION#v}" # Strip 'v' prefix if present -if [ -z "$LATEST_IOS_VERSION" ]; then - echo -e "${RED}Failed to fetch iOS SDK tags${NC}" +# Fetch latest iOS SDK version +LATEST_IOS_VERSION=$(get_latest_release_version "urbanairship/ios-library") +if [ $? -ne 0 ] || [ -z "$LATEST_IOS_VERSION" ]; then + echo -e "${RED}Failed to fetch iOS SDK version${NC}" exit 1 fi echo -e "Latest iOS SDK: ${BOLD}$LATEST_IOS_VERSION${NC}" -# Fetch latest Android SDK tag -LATEST_ANDROID_VERSION=$(gh api repos/urbanairship/android-library/tags --jq '.[0].name' 2>/dev/null || echo "") -LATEST_ANDROID_VERSION="${LATEST_ANDROID_VERSION#v}" # Strip 'v' prefix if present -if [ -z "$LATEST_ANDROID_VERSION" ]; then - echo -e "${RED}Failed to fetch Android SDK tags${NC}" +# Fetch latest Android SDK version +LATEST_ANDROID_VERSION=$(get_latest_release_version "urbanairship/android-library") +if [ $? -ne 0 ] || [ -z "$LATEST_ANDROID_VERSION" ]; then + echo -e "${RED}Failed to fetch Android SDK version${NC}" exit 1 fi echo -e "Latest Android SDK: ${BOLD}$LATEST_ANDROID_VERSION${NC}" -# Function to determine bump type (major, minor, patch) -determine_bump_type() { - local old=$1 - local new=$2 - - IFS='.' read -r old_major old_minor old_patch <<< "$old" - IFS='.' read -r new_major new_minor new_patch <<< "$new" - - if [ "$new_major" -gt "$old_major" ]; then - echo "major" - elif [ "$new_minor" -gt "$old_minor" ]; then - echo "minor" - elif [ "$new_patch" -gt "$old_patch" ]; then - echo "patch" - else - echo "none" - fi -} - # Determine bump types for each SDK IOS_BUMP=$(determine_bump_type "$CURRENT_IOS_VERSION" "$LATEST_IOS_VERSION") ANDROID_BUMP=$(determine_bump_type "$CURRENT_ANDROID_VERSION" "$LATEST_ANDROID_VERSION") diff --git a/scripts/lib/changelog_prompt.txt b/scripts/lib/changelog_prompt.txt index 0184ce9..a796e8d 100644 --- a/scripts/lib/changelog_prompt.txt +++ b/scripts/lib/changelog_prompt.txt @@ -44,5 +44,5 @@ IMPORTANT INSTRUCTIONS: 2. Decide SIMPLE or DETAILED based on criteria above 3. Return ONLY the formatted changelog (no explanations, no preamble) 4. If unsure or SDK changelogs lack substance, use SIMPLE -5. Ensure all version numbers in links match exactly (no 'v' prefix in URLs) +5. Do not include 'v' prefix in version numbers within URLs 6. Use release type: "Major" for X.0.0, "Minor" for X.Y.0, "Patch" for X.Y.Z diff --git a/scripts/lib/generate_changelog.sh b/scripts/lib/generate_changelog.sh index d4e82eb..86e404a 100755 --- a/scripts/lib/generate_changelog.sh +++ b/scripts/lib/generate_changelog.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Intelligent changelog generation using Gemini CLI # Fetches SDK changelogs, analyzes them, and generates appropriate format @@ -6,6 +6,9 @@ LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROMPT_TEMPLATE="$LIB_DIR/changelog_prompt.txt" +# Source shared utilities +source "$LIB_DIR/version_utils.sh" + # Fetch SDK changelog from GitHub release notes fetch_github_changelog() { local repo="$1" @@ -131,7 +134,7 @@ validate_and_fix() { # 1. Fix version format (remove 'v' prefix if present) if echo "$changelog_content" | grep -q "Version v[0-9]"; then - sed -i '' 's/Version v\([0-9]\)/Version \1/g' "$changelog_file" + sedi 's/Version v\([0-9]\)/Version \1/g' "$changelog_file" echo " ✓ Fixed version format (removed 'v' prefix)" >&2 fixes_made=true fi @@ -145,14 +148,14 @@ validate_and_fix() { # 3. Fix malformed GitHub links if echo "$changelog_content" | grep -q "github.com/urbanairship/.*releases/tag/[^)]*[^0-9.)]"; then # Remove any trailing characters after version number in links - sed -i '' -E 's|(https://github.com/urbanairship/[^/]+/releases/tag/[0-9.]+)[^)]*|\1|g' "$changelog_file" + sedi -E 's|(https://github.com/urbanairship/[^/]+/releases/tag/[0-9.]+)[^)]*|\1|g' "$changelog_file" echo " ✓ Fixed malformed GitHub release links" >&2 fixes_made=true fi # 4. Remove trailing whitespace if grep -q "[[:space:]]$" "$changelog_file"; then - sed -i '' 's/[[:space:]]*$//' "$changelog_file" + sedi 's/[[:space:]]*$//' "$changelog_file" echo " ✓ Removed trailing whitespace" >&2 fixes_made=true fi @@ -254,10 +257,11 @@ validate_pr() { local pr_title=$(echo "$pr_data" | jq -r '.title') local pr_body=$(echo "$pr_data" | jq -r '.body') - # Expected title format: "Release X.Y.Z" + # Expected title format: "Release X.Y.Z" or "[TEST] Release X.Y.Z" local expected_title="Release ${plugin_version}" + local expected_test_title="[TEST] Release ${plugin_version}" - if [ "$pr_title" != "$expected_title" ]; then + if [ "$pr_title" != "$expected_title" ] && [ "$pr_title" != "$expected_test_title" ]; then echo " ⚠️ WARNING: PR title is '$pr_title', expected '$expected_title'" >&2 fi diff --git a/scripts/lib/version_utils.sh b/scripts/lib/version_utils.sh new file mode 100755 index 0000000..5dfc6ad --- /dev/null +++ b/scripts/lib/version_utils.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Shared utilities for version management scripts + +# Portable sed -i (macOS vs GNU) +sedi() { + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' "$@" + else + sed -i "$@" + fi +} + +# Determine bump type (major, minor, patch) +determine_bump_type() { + local old=$1 + local new=$2 + + IFS='.' read -r old_major old_minor old_patch <<< "$old" + IFS='.' read -r new_major new_minor new_patch <<< "$new" + + if [ "$new_major" -gt "$old_major" ]; then + echo "major" + elif [ "$new_minor" -gt "$old_minor" ]; then + echo "minor" + elif [ "$new_patch" -gt "$old_patch" ]; then + echo "patch" + else + echo "none" + fi +} + +# Get highest semver version from a GitHub repo +# Uses releases API (preferred), falls back to tags +# Filters for valid semver, strips 'v' prefix, sorts semantically +get_latest_release_version() { + local repo="$1" + local error_file=$(mktemp) + local versions + + # Try releases API first (preferred - explicitly published versions) + versions=$(gh api "repos/${repo}/releases" --paginate --jq '.[].tag_name' 2>"$error_file") + + # Fallback to tags if no releases found + if [ -z "$versions" ]; then + versions=$(gh api "repos/${repo}/tags" --paginate --jq '.[].name' 2>"$error_file") + fi + + # Check for API errors + if [ -z "$versions" ] && [ -s "$error_file" ]; then + echo " API error: $(cat "$error_file")" >&2 + rm -f "$error_file" + return 1 + fi + rm -f "$error_file" + + # Filter to valid semver, strip 'v' prefix, sort semantically, get highest + local result=$(echo "$versions" | \ + grep -E '^v?[0-9]+\.[0-9]+\.[0-9]+$' | \ + sed 's/^v//' | \ + sort -t. -k1,1n -k2,2n -k3,3n | \ + tail -1) + + # Validate result is a proper version + if ! [[ "$result" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo " No valid semver releases found" >&2 + return 1 + fi + + echo "$result" +} diff --git a/scripts/prep_proxy_release.sh b/scripts/prep_proxy_release.sh index c932868..19b3fe3 100755 --- a/scripts/prep_proxy_release.sh +++ b/scripts/prep_proxy_release.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e # Prepare proxy release: update versions, dependencies, changelog @@ -7,6 +7,9 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +# Source shared utilities +source "$SCRIPT_DIR/lib/version_utils.sh" + # Parse arguments TEST_MODE=false if [ "$1" = "--test" ]; then @@ -44,8 +47,8 @@ echo -e "${BLUE}Updating files...${NC}" # Update AirshipFrameworkProxy.podspec if [ "$TEST_MODE" = "false" ]; then - sed -i '' "s/s.version[[:space:]]*=[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.version = \"${PROXY_VERSION}\"/" "$REPO_ROOT/AirshipFrameworkProxy.podspec" - sed -i '' "s/s.dependency[[:space:]]*'Airship',[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.dependency 'Airship', \"${IOS_VERSION}\"/" "$REPO_ROOT/AirshipFrameworkProxy.podspec" + sedi "s/s.version[[:space:]]*=[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.version = \"${PROXY_VERSION}\"/" "$REPO_ROOT/AirshipFrameworkProxy.podspec" + sedi "s/s.dependency[[:space:]]*'Airship',[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.dependency 'Airship', \"${IOS_VERSION}\"/" "$REPO_ROOT/AirshipFrameworkProxy.podspec" echo "✓ Updated AirshipFrameworkProxy.podspec" else echo " Would update AirshipFrameworkProxy.podspec:" @@ -55,7 +58,7 @@ fi # Update Package.swift if [ "$TEST_MODE" = "false" ]; then - sed -i '' "s/from: \"[0-9]*\.[0-9]*\.[0-9]*\"/from: \"${IOS_VERSION}\"/" "$REPO_ROOT/Package.swift" + sedi "s/from: \"[0-9]*\.[0-9]*\.[0-9]*\"/from: \"${IOS_VERSION}\"/" "$REPO_ROOT/Package.swift" echo "✓ Updated Package.swift" else echo " Would update Package.swift:" @@ -64,8 +67,8 @@ fi # Update android/gradle/libs.versions.toml if [ "$TEST_MODE" = "false" ]; then - sed -i '' "s/airshipProxy = '[0-9]*\.[0-9]*\.[0-9]*'/airshipProxy = '${PROXY_VERSION}'/" "$REPO_ROOT/android/gradle/libs.versions.toml" - sed -i '' "s/airship = '[0-9]*\.[0-9]*\.[0-9]*'/airship = '${ANDROID_VERSION}'/" "$REPO_ROOT/android/gradle/libs.versions.toml" + sedi "s/airshipProxy = '[0-9]*\.[0-9]*\.[0-9]*'/airshipProxy = '${PROXY_VERSION}'/" "$REPO_ROOT/android/gradle/libs.versions.toml" + sedi "s/airship = '[0-9]*\.[0-9]*\.[0-9]*'/airship = '${ANDROID_VERSION}'/" "$REPO_ROOT/android/gradle/libs.versions.toml" echo "✓ Updated android/gradle/libs.versions.toml" else echo " Would update android/gradle/libs.versions.toml:" diff --git a/scripts/update_all_plugins.sh b/scripts/update_all_plugins.sh index 625db5a..bbfd763 100755 --- a/scripts/update_all_plugins.sh +++ b/scripts/update_all_plugins.sh @@ -19,6 +19,9 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +# Source shared utilities +source "$SCRIPT_DIR/lib/version_utils.sh" + # Colors RED='\033[0;31m' GREEN='\033[0;32m' @@ -238,25 +241,6 @@ validate_inputs() { fi } -# Determine bump type (major, minor, patch) -determine_bump_type() { - local old=$1 - local new=$2 - - IFS='.' read -r old_major old_minor old_patch <<< "$old" - IFS='.' read -r new_major new_minor new_patch <<< "$new" - - if [ "$new_major" -gt "$old_major" ]; then - echo "major" - elif [ "$new_minor" -gt "$old_minor" ]; then - echo "minor" - elif [ "$new_patch" -gt "$old_patch" ]; then - echo "patch" - else - echo "none" - fi -} - # Calculate new plugin versions calculate_plugin_versions() { echo -e "${BLUE}Calculating plugin versions...${NC}" @@ -279,16 +263,14 @@ calculate_plugin_versions() { for plugin in "${PLUGIN_KEYS[@]}"; do local repo=$(get_repo_name "$plugin") - # Fetch latest tag - local latest_tag=$(gh api "repos/urbanairship/${repo}/tags" --jq '.[0].name' 2>/dev/null || echo "") - latest_tag="${latest_tag#v}" # Strip 'v' prefix if present - - if [ -z "$latest_tag" ]; then + # Fetch latest version (uses shared function from version_utils.sh) + local latest_version=$(get_latest_release_version "urbanairship/${repo}") + if [ $? -ne 0 ] || [ -z "$latest_version" ]; then echo -e "${RED}Failed to fetch version for ${repo}${NC}" exit 1 fi - IFS='.' read -r major minor patch <<< "$latest_tag" + IFS='.' read -r major minor patch <<< "$latest_version" # Apply bump type case "$BUMP_TYPE" in @@ -308,7 +290,7 @@ calculate_plugin_versions() { local new_version="${major}.${minor}.${patch}" set_new_version "$plugin" "$new_version" - echo -e "${plugin}: ${latest_tag} → ${BOLD}${new_version}${NC}" + echo -e "${plugin}: ${latest_version} → ${BOLD}${new_version}${NC}" done echo "" } @@ -334,6 +316,17 @@ clone_plugins() { if [ $clone_count -gt 0 ]; then wait echo -e "${GREEN}✓ Repositories cloned${NC}" + + # Configure git credential helper for each repo to use gh + for plugin in "${PLUGIN_KEYS[@]}"; do + if should_skip_plugin "$plugin"; then + continue + fi + local repo="$(get_repo_name "$plugin")" + if [ -d "$repo" ]; then + git -C "$repo" config credential.helper '!gh auth git-credential' + fi + done else echo -e "${YELLOW}No plugins selected to update${NC}" fi @@ -351,7 +344,7 @@ update_react_native_files() { npm version "$version" --no-git-tag-version # Update iOS Swift version constant - sed -i '' "s/\(version:\ String *= *\)\".*\"/\1\"$version\"/g" ios/AirshipReactNative.swift + sedi "s/\(version:\ String *= *\)\".*\"/\1\"$version\"/g" ios/AirshipReactNative.swift } # Update Cordova plugin files @@ -368,13 +361,13 @@ update_cordova_files() { npm --prefix cordova-airship-hms version "$version" --no-git-tag-version # Update plugin.xml files - sed -i '' "s///" cordova-airship-hms/plugin.xml + sedi "s///" cordova-airship-hms/plugin.xml # Update version constants - sed -i '' "s/var version = \"[-0-9.a-zA-Z]*\"/var version = \"$version\"/" cordova-airship/src/android/AirshipCordovaVersion.kt - sed -i '' "s/static let version = \"[-0-9.a-zA-Z]*\"/static let version = \"$version\"/" cordova-airship/src/ios/AirshipCordovaVersion.swift + sedi "s/var version = \"[-0-9.a-zA-Z]*\"/var version = \"$version\"/" cordova-airship/src/android/AirshipCordovaVersion.kt + sedi "s/static let version = \"[-0-9.a-zA-Z]*\"/static let version = \"$version\"/" cordova-airship/src/ios/AirshipCordovaVersion.swift } # Update Flutter plugin files @@ -385,14 +378,14 @@ update_flutter_files() { cd "$repo_path" # Update pubspec.yaml - sed -i '' "s/\(^version: *\).*/\1$version/g" pubspec.yaml + sedi "s/\(^version: *\).*/\1$version/g" pubspec.yaml # Update podspec - sed -i '' "s/\(^AIRSHIP_FLUTTER_VERSION *= *\)\".*\"/\1\"$version\"/g" ios/airship_flutter.podspec + sedi "s/\(^AIRSHIP_FLUTTER_VERSION *= *\)\".*\"/\1\"$version\"/g" ios/airship_flutter.podspec # Update version constants - sed -i '' "s/\(pluginVersion *= *\)\".*\"/\1\"$version\"/g" ios/airship_flutter/Sources/airship_flutter/AirshipPluginVersion.swift - sed -i '' "s/\(AIRSHIP_PLUGIN_VERSION *= *\)\".*\"/\1\"$version\"/g" android/src/main/kotlin/com/airship/flutter/AirshipPluginVersion.kt + sedi "s/\(pluginVersion *= *\)\".*\"/\1\"$version\"/g" ios/airship_flutter/Sources/airship_flutter/AirshipPluginVersion.swift + sedi "s/\(AIRSHIP_PLUGIN_VERSION *= *\)\".*\"/\1\"$version\"/g" android/src/main/kotlin/com/airship/flutter/AirshipPluginVersion.kt } # Update Capacitor plugin files @@ -406,8 +399,8 @@ update_capacitor_files() { npm version "$version" --no-git-tag-version # Update version constants - sed -i '' "s/var version = \"[-0-9.a-zA-Z]*\"/var version = \"$version\"/" android/src/main/java/com/airship/capacitor/AirshipCapacitorVersion.kt - sed -i '' "s/static let version = \"[-0-9.a-zA-Z]*\"/static let version = \"$version\"/" ios/Plugin/AirshipCapacitorVersion.swift + sedi "s/var version = \"[-0-9.a-zA-Z]*\"/var version = \"$version\"/" android/src/main/java/com/airship/capacitor/AirshipCapacitorVersion.kt + sedi "s/static let version = \"[-0-9.a-zA-Z]*\"/static let version = \"$version\"/" ios/Plugin/AirshipCapacitorVersion.swift } # Update proxy dependencies @@ -417,24 +410,24 @@ update_proxy_dependencies() { case "$plugin" in react-native) - sed -i '' -E "s/(Airship_airshipProxyVersion=)([^$]*)/\1$proxy_version/" android/gradle.properties - sed -i '' -E "s/(s\.dependency *\"AirshipFrameworkProxy\", *\")([^\"]*)(\")/\1$proxy_version\3/" react-native-airship.podspec + sedi -E "s/(Airship_airshipProxyVersion=)([^$]*)/\1$proxy_version/" android/gradle.properties + sedi -E "s/(s\.dependency *\"AirshipFrameworkProxy\", *\")([^\"]*)(\")/\1$proxy_version\3/" react-native-airship.podspec ;; cordova) - sed -i '' -E "s/(pod name=\"AirshipFrameworkProxy\" spec=\")[^\"]*\"/\1$proxy_version\"/" cordova-airship/plugin.xml - sed -i '' -E "s/(api \"com.urbanairship.android:airship-framework-proxy:)[^\"]*\"/\1$proxy_version\"/" cordova-airship/src/android/build-extras.gradle - sed -i '' -E "s/(implementation \"com.urbanairship.android:airship-framework-proxy-hms:)[^\"]*\"/\1$proxy_version\"/" cordova-airship-hms/src/android/build-extras.gradle + sedi -E "s/(pod name=\"AirshipFrameworkProxy\" spec=\")[^\"]*\"/\1$proxy_version\"/" cordova-airship/plugin.xml + sedi -E "s/(api \"com.urbanairship.android:airship-framework-proxy:)[^\"]*\"/\1$proxy_version\"/" cordova-airship/src/android/build-extras.gradle + sedi -E "s/(implementation \"com.urbanairship.android:airship-framework-proxy-hms:)[^\"]*\"/\1$proxy_version\"/" cordova-airship-hms/src/android/build-extras.gradle ;; flutter) - sed -i '' -E "s/(ext\.airship_framework_proxy_version *= *')([^']*)(')/\1$proxy_version\3/" android/build.gradle - sed -i '' -E "s/(s\.dependency *\"AirshipFrameworkProxy\", *\")([^\"]*)(\")/\1$proxy_version\3/" ios/airship_flutter.podspec - sed -i '' -E "s/(\.package\(name: *\"AirshipFrameworkProxy\", *url: *\"[^\"]+\", *from: *\")([^\"]*)(\")/\1$proxy_version\3/" ios/airship_flutter/Package.swift + sedi -E "s/(ext\.airship_framework_proxy_version *= *')([^']*)(')/\1$proxy_version\3/" android/build.gradle + sedi -E "s/(s\.dependency *\"AirshipFrameworkProxy\", *\")([^\"]*)(\")/\1$proxy_version\3/" ios/airship_flutter.podspec + sedi -E "s/(\.package\(name: *\"AirshipFrameworkProxy\", *url: *\"[^\"]+\", *from: *\")([^\"]*)(\")/\1$proxy_version\3/" ios/airship_flutter/Package.swift ;; capacitor) - sed -i '' "s/s\.dependency.*AirshipFrameworkProxy.*$/s.dependency \"AirshipFrameworkProxy\", \"$proxy_version\"/" UaCapacitorAirship.podspec - sed -i '' "s/airshipProxyVersion = project\.hasProperty('airshipProxyVersion') ? rootProject\.ext\.airshipProxyVersion : '.*'/airshipProxyVersion = project.hasProperty('airshipProxyVersion') ? rootProject.ext.airshipProxyVersion : '$proxy_version'/" android/build.gradle - sed -i '' "s/pod 'AirshipFrameworkProxy'.*$/pod 'AirshipFrameworkProxy', '$proxy_version'/" ios/Podfile - sed -i '' "s/\.package(url: \"https:\/\/github\.com\/urbanairship\/airship-mobile-framework-proxy\.git\", from: \".*\")/.package(url: \"https:\/\/github.com\/urbanairship\/airship-mobile-framework-proxy.git\", from: \"$proxy_version\")/" Package.swift + sedi "s/s\.dependency.*AirshipFrameworkProxy.*$/s.dependency \"AirshipFrameworkProxy\", \"$proxy_version\"/" UaCapacitorAirship.podspec + sedi "s/airshipProxyVersion = project\.hasProperty('airshipProxyVersion') ? rootProject\.ext\.airshipProxyVersion : '.*'/airshipProxyVersion = project.hasProperty('airshipProxyVersion') ? rootProject.ext.airshipProxyVersion : '$proxy_version'/" android/build.gradle + sedi "s/pod 'AirshipFrameworkProxy'.*$/pod 'AirshipFrameworkProxy', '$proxy_version'/" ios/Podfile + sedi "s/\.package(url: \"https:\/\/github\.com\/urbanairship\/airship-mobile-framework-proxy\.git\", from: \".*\")/.package(url: \"https:\/\/github.com\/urbanairship\/airship-mobile-framework-proxy.git\", from: \"$proxy_version\")/" Package.swift ;; esac } @@ -505,7 +498,7 @@ Automated release preparation for $(get_display_name "$plugin") v${version} ## Changed Files \`\`\` -$(git diff --name-only HEAD~1 2>/dev/null || echo "Unable to determine changed files") +$(git diff --name-only HEAD~1 2>/dev/null || git diff --name-only --cached 2>/dev/null || echo "See commit for changed files") \`\`\` ## Next Steps @@ -700,14 +693,16 @@ main() { echo "" # Update plugin (with error handling) - if pr_url=$(update_plugin "$plugin" "$(get_new_version "$plugin")" "$WORK_DIR/$(get_repo_name "$plugin")" 2>&1); then + local error_file=$(mktemp) + if pr_url=$(update_plugin "$plugin" "$(get_new_version "$plugin")" "$WORK_DIR/$(get_repo_name "$plugin")" 2>"$error_file"); then set_pr_url "$plugin" "$pr_url" echo -e " ${GREEN}✓ PR created: $pr_url${NC}" else echo -e " ${RED}✗ Failed to update ${plugin}${NC}" - echo -e " Error: $pr_url" + echo -e " Error: $(cat "$error_file")" set_pr_url "$plugin" "FAILED" fi + rm -f "$error_file" done # Re-enable exit-on-error set -e @@ -742,6 +737,22 @@ main() { done fi + # Check if any plugins succeeded + local any_success=false + for plugin in "${PLUGIN_KEYS[@]}"; do + local url="$(get_pr_url "$plugin")" + if [ "$url" != "FAILED" ] && [ "$url" != "SKIPPED" ] && [ -n "$url" ]; then + any_success=true + break + fi + done + + if [ "$any_success" = false ]; then + echo -e "${RED}All plugins failed to update${NC}" + [ -n "$WORK_DIR" ] && rm -rf "$WORK_DIR" + exit 1 + fi + # Cleanup [ -n "$WORK_DIR" ] && rm -rf "$WORK_DIR" } diff --git a/scripts/version_bump.sh b/scripts/version_bump.sh index 2ad62a0..2bfe308 100755 --- a/scripts/version_bump.sh +++ b/scripts/version_bump.sh @@ -1,9 +1,14 @@ -#!/bin/bash +#!/usr/bin/env bash # Script to update version numbers in Airship Mobile Framework Proxy set -e +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Source shared utilities +source "$SCRIPT_DIR/lib/version_utils.sh" + # ANSI color codes RED='\033[0;31m' GREEN='\033[0;32m' @@ -73,33 +78,33 @@ update_versions() { # Podspec file if [ -f "AirshipFrameworkProxy.podspec" ]; then echo -e "${INFO} Updating AirshipFrameworkProxy.podspec" - sed -i '' "s/s.version[[:space:]]*=[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.version = \"${proxy_version}\"/" AirshipFrameworkProxy.podspec - sed -i '' "s/s.dependency[[:space:]]*'Airship',[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.dependency 'Airship', \"${ios_sdk_version}\"/" AirshipFrameworkProxy.podspec + sedi "s/s.version[[:space:]]*=[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.version = \"${proxy_version}\"/" AirshipFrameworkProxy.podspec + sedi "s/s.dependency[[:space:]]*'Airship',[[:space:]]*\"[0-9]*\.[0-9]*\.[0-9]*\"/s.dependency 'Airship', \"${ios_sdk_version}\"/" AirshipFrameworkProxy.podspec else echo -e "${WARN} AirshipFrameworkProxy.podspec not found" fi - + # Package.swift if [ -f "Package.swift" ]; then echo -e "${INFO} Updating Package.swift" - sed -i '' "s/from: \"[0-9]*\.[0-9]*\.[0-9]*\"/from: \"${ios_sdk_version}\"/" Package.swift + sedi "s/from: \"[0-9]*\.[0-9]*\.[0-9]*\"/from: \"${ios_sdk_version}\"/" Package.swift else echo -e "${WARN} Package.swift not found" fi - + # iOS Podfile if [ -f "ios/Podfile" ]; then echo -e "${INFO} Updating ios/Podfile" - sed -i '' "s/pod 'Airship', '[0-9]*\.[0-9]*\.[0-9]*'/pod 'Airship', '${ios_sdk_version}'/" ios/Podfile + sedi "s/pod 'Airship', '[0-9]*\.[0-9]*\.[0-9]*'/pod 'Airship', '${ios_sdk_version}'/" ios/Podfile else echo -e "${WARN} ios/Podfile not found" fi - + # Android libs.versions.toml if [ -f "android/gradle/libs.versions.toml" ]; then echo -e "${INFO} Updating android/gradle/libs.versions.toml" - sed -i '' "s/airshipProxy = '[0-9]*\.[0-9]*\.[0-9]*'/airshipProxy = '${proxy_version}'/" android/gradle/libs.versions.toml - sed -i '' "s/airship = '[0-9]*\.[0-9]*\.[0-9]*'/airship = '${android_sdk_version}'/" android/gradle/libs.versions.toml + sedi "s/airshipProxy = '[0-9]*\.[0-9]*\.[0-9]*'/airshipProxy = '${proxy_version}'/" android/gradle/libs.versions.toml + sedi "s/airship = '[0-9]*\.[0-9]*\.[0-9]*'/airship = '${android_sdk_version}'/" android/gradle/libs.versions.toml else echo -e "${WARN} android/gradle/libs.versions.toml not found" fi