pulumi/.github/scripts/update-versions

112 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
>&2 echo "::group::Update versions"
trap ">&2 echo '::endgroup::'" EXIT # bash equivalent of defer func()
INPUT_VERSION="$1"
BUILD="$(cut -d'+' -f2 <<< "$INPUT_VERSION")" # may not be present
VERSION_PRERELEASE="$(cut -d'+' -f1 <<< "$INPUT_VERSION")"
VERSION="$(cut -d'-' -f1 <<< "$VERSION_PRERELEASE")"
PRERELEASE="$(cut -d'-' -f2 <<< "$VERSION_PRERELEASE")" # may not be present
MAJOR="$(cut -d'.' -f1 <<< "$VERSION")"
MINOR="$(cut -d'.' -f2 <<< "$VERSION")"
PATCH="$(cut -d'.' -f3 <<< "$VERSION")"
>&2 echo "::debug::INPUT_VERSION=$INPUT_VERSION"
>&2 echo "::debug::VERSION=$VERSION"
>&2 echo "::debug::PRERELEASE=$PRERELEASE"
>&2 echo "::debug::MAJOR=$MAJOR"
>&2 echo "::debug::MAJOR=$MINOR"
>&2 echo "::debug::MINOR=$PATCH"
>&2 echo "::debug::BUILD=$BUILD"
PIPX_MISSING=false
if ! command -v pipx &>/dev/null; then
>&2 echo "::error::pipx not installed, install pipx via pypi or homebrew"
PIPX_MISSING=true
fi
JQ_MISSING=false
if ! command -v jq &>/dev/null; then
>&2 echo "::error::yq not installed, install jq via your OS package manager"
JQ_MISSING=true
fi
if $JQ_MISSING || $PIPX_MISSING; then
exit 1;
fi
yq() {
pipx run yq==3.0.2 "$@"
}
N=$(yq '.replacements | length' .github/scripts/versions.yaml)
for n in $(seq 0 1 "$((N-1))"); do
replacement=$(yq ".replacements[$n]" .github/scripts/versions.yaml)
type=$(yq -r '.type' <<< "$replacement")
case "$type" in
"file")
file=$(yq -r '.file' <<< "$replacement")
fileFormat=$(yq -r '.fileFormat' <<< "$replacement")
updatePath=$(yq -r '.updatePath' <<< "$replacement")
versionFormat=$(yq -r '.versionFormat' <<< "$replacement")
TOOL="jq"
TOOL_ARGS=""
SPONGE=false
case "$fileFormat" in
"sed") TOOL="sed";;
"json") TOOL="jq" TOOL_ARGS="--in-place";;
"yaml") TOOL="yq" TOOL_ARGS="--in-place";;
*)
>&2 echo "::error::Unknown file format $fileFormat; unable to update file $file"
exit 1
esac
tool() {
if $SPONGE; then
TEMP="$("$TOOL" "$@")"
echo -n "$TEMP" > "$file"
else
"$TOOL" "$@"
fi
}
# Use a subshell to avoid mutating our caller's environment.
# envsubst requires exported variables
(
export SEMVER="$INPUT_VERSION"
export VERSION
export MAJOR
export MINOR
export PATCH
export PRERELEASE
export BUILD
# We do not want to expand vars to envsubst, we're listing the ones we want to allow.
# shellcheck disable=SC2016
versionString=$(envsubst '$SEMVER,$VERSION,$MAJOR,$MINOR,$PATCH,$PRERELEASE,$BUILD' <<< "$versionFormat")
if [ "$TOOL" == "sed" ]; then
sed --in-place -E "s/$updatePath/$versionString/" "$file"
else
tool $TOOL_ARGS "$updatePath = \"$versionString\"" "$file"
fi
)
;;
"command")
command=$(yq -r '.command' <<< "$replacement")
eval "${command}"
;;
*)
>&2 echo "::error::Unknown replacement type $type"
exit 1
;;
esac
done