|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +# Get the next milestone release for the given number by inspecting current tags |
| 4 | +get_next_milestone_release() { |
| 5 | + [[ -n $1 ]] || { echo "missing get_next_milestone_release() version argument" >&2; return 1; } |
| 6 | + get_next_tag_based_release "$1" "M" |
| 7 | +} |
| 8 | + |
| 9 | +# Get the next RC release for the given number by inspecting current tags |
| 10 | +get_next_rc_release() { |
| 11 | + [[ -n $1 ]] || { echo "missing get_next_rc_release() version argument" >&2; return 1; } |
| 12 | + get_next_tag_based_release "$1" "RC" |
| 13 | +} |
| 14 | + |
| 15 | +# Get the next release for the given number |
| 16 | +get_next_release() { |
| 17 | + [[ -n $1 ]] || { echo "missing get_next_release() version argument" >&2; return 1; } |
| 18 | + if [[ $1 =~ ^(.*)\.BUILD-SNAPSHOT$ ]]; then |
| 19 | + local join="." |
| 20 | + else |
| 21 | + local join="-" |
| 22 | + fi |
| 23 | + local version |
| 24 | + local result |
| 25 | + version=$( strip_snapshot_suffix "$1" ) |
| 26 | + if [[ -n $2 ]]; then |
| 27 | + result="${version}${join}${2}" |
| 28 | + else |
| 29 | + result="${version}" |
| 30 | + fi |
| 31 | + echo $result |
| 32 | +} |
| 33 | + |
| 34 | +# Get the next milestone or RC release for the given number by inspecting current tags |
| 35 | +get_next_tag_based_release() { |
| 36 | + [[ -n $1 ]] || { echo "missing get_next_tag_based_release() version argument" >&2; return 1; } |
| 37 | + [[ -n $2 ]] || { echo "missing get_next_tag_based_release() tag type argument" >&2; return 1; } |
| 38 | + if [[ $1 =~ ^(.*)\.BUILD-SNAPSHOT$ ]]; then |
| 39 | + local join="." |
| 40 | + else |
| 41 | + local join="-" |
| 42 | + fi |
| 43 | + local version |
| 44 | + local last |
| 45 | + version=$( strip_snapshot_suffix "$1" ) |
| 46 | + git fetch --tags --all > /dev/null |
| 47 | + last=$( git tag --list "v${version}${join}${2}*" | sed -E "s/^.*${2}([0-9]+)$/\1/g" | sort -rn | head -n1 ) |
| 48 | + if [[ -z $last ]]; then |
| 49 | + last="0" |
| 50 | + fi |
| 51 | + last="${version}${join}${2}${last}" |
| 52 | + bump_version_number "$last" |
| 53 | +} |
| 54 | + |
| 55 | +# Remove any "-SNAPSHOT" or ".BUILD-SNAPSHOT" suffix |
| 56 | +strip_snapshot_suffix() { |
| 57 | + [[ -n $1 ]] || { echo "missing get_relase_version() argument" >&2; return 1; } |
| 58 | + if [[ $1 =~ ^(.*)\.BUILD-SNAPSHOT$ ]]; then |
| 59 | + echo "${BASH_REMATCH[1]}" |
| 60 | + elif [[ $1 =~ ^(.*)-SNAPSHOT$ ]]; then |
| 61 | + echo "${BASH_REMATCH[1]}" |
| 62 | + else |
| 63 | + echo "$1" |
| 64 | + fi |
| 65 | +} |
| 66 | + |
| 67 | +# Bump version number by incrementing the last numeric, RC or M token |
| 68 | +bump_version_number() { |
| 69 | + local version=$1 |
| 70 | + [[ -n $version ]] || { echo "missing bump_version_number() argument" >&2; return 1; } |
| 71 | + if [[ $version =~ ^(.*(\.|-)([A-Za-z]+))([0-9]+)$ ]]; then |
| 72 | + local prefix=${BASH_REMATCH[1]} |
| 73 | + local suffix=${BASH_REMATCH[4]} |
| 74 | + (( suffix++ )) |
| 75 | + echo "${prefix}${suffix}" |
| 76 | + return 0; |
| 77 | + fi |
| 78 | + local suffix |
| 79 | + if [[ $version =~ ^(.*)(\-SNAPSHOT)$ ]]; then |
| 80 | + version=${BASH_REMATCH[1]} |
| 81 | + suffix="-SNAPSHOT" |
| 82 | + fi |
| 83 | + tokens=(${version//\./ }) |
| 84 | + local bumpIndex |
| 85 | + for i in "${!tokens[@]}"; do |
| 86 | + if [[ "${tokens[$i]}" =~ ^[0-9]+$ ]] ; then |
| 87 | + bumpIndex=$i |
| 88 | + fi |
| 89 | + done |
| 90 | + [[ -n $bumpIndex ]] || { echo "unsupported version number" >&2; return 1; } |
| 91 | + (( tokens[bumpIndex]++ )) |
| 92 | + local bumpedVersion |
| 93 | + IFS=. eval 'bumpedVersion="${tokens[*]}"' |
| 94 | + echo "${bumpedVersion}${suffix}" |
| 95 | +} |
| 96 | + |
| 97 | +# Deduce versions |
| 98 | +deduce_versions() { |
| 99 | + [[ -n ${GITHUB_OUTPUT} ]] || { echo "missing GITHUB_OUTPUT environment variable" >&2; return 1; } |
| 100 | + [[ -n ${CURRENT_VERSION} ]] || { echo "missing CURRENT_VERSION environment variable" >&2; return 1; } |
| 101 | + [[ -n ${RELEASE_TYPE} ]] || { echo "missing RELEASE_TYPE environment variable" >&2; return 1; } |
| 102 | + if [[ ${RELEASE_TYPE,,} = "milestone" ]]; then |
| 103 | + releaseVersion=$( get_next_milestone_release ${CURRENT_VERSION}) |
| 104 | + nextVersion=${CURRENT_VERSION} |
| 105 | + elif [[ ${RELEASE_TYPE,,} = "release-candidate" ]]; then |
| 106 | + releaseVersion=$( get_next_rc_release ${CURRENT_VERSION}) |
| 107 | + nextVersion=${CURRENT_VERSION} |
| 108 | + elif [[ ${RELEASE_TYPE,,} = "release" ]]; then |
| 109 | + releaseVersion=$( get_next_release ${CURRENT_VERSION}) |
| 110 | + nextVersion=$( bump_version_number ${CURRENT_VERSION}) |
| 111 | + else |
| 112 | + echo "Unknown release type '${RELEASE_TYPE}'" >&2; exit 1; |
| 113 | + fi |
| 114 | + echo "release-version=${releaseVersion}" >> "$GITHUB_OUTPUT" |
| 115 | + echo "next-version=${nextVersion}" >> "$GITHUB_OUTPUT" |
| 116 | +} |
0 commit comments