Files
sendico/ci/scripts/common/bump_version.sh
2026-03-17 21:25:16 +01:00

139 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)"
cd "${REPO_ROOT}"
VERSION_FILE="./version"
PUBSPEC_FILE="./frontend/pweb/pubspec.yaml"
INTERFACE_API_FILE="./interface/api.yaml"
if [[ ! -f "${PUBSPEC_FILE}" && -f "./frontend/pweb/pubspec.yml" ]]; then
PUBSPEC_FILE="./frontend/pweb/pubspec.yml"
fi
if [[ ! -f "${VERSION_FILE}" ]]; then
echo "[bump-version] missing ${VERSION_FILE}" >&2
exit 1
fi
if [[ ! -f "${PUBSPEC_FILE}" ]]; then
echo "[bump-version] missing frontend pubspec file" >&2
exit 1
fi
if [[ ! -f "${INTERFACE_API_FILE}" ]]; then
echo "[bump-version] missing ${INTERFACE_API_FILE}" >&2
exit 1
fi
current_version="$(tr -d '[:space:]' < "${VERSION_FILE}")"
if [[ -z "${current_version}" ]]; then
echo "[bump-version] ${VERSION_FILE} is empty" >&2
exit 1
fi
new_version="$(printf '%s\n' "${current_version}" | awk -F. -v OFS=. '
NF == 1 { print ++$NF; next }
{ $NF = sprintf("%0*d", length($NF), ($NF + 1)); print }
')"
current_pubspec_version="$(
awk '/^version:[[:space:]]*/ {
sub(/^version:[[:space:]]*/, "", $0)
print
exit
}' "${PUBSPEC_FILE}"
)"
if [[ -z "${current_pubspec_version}" ]]; then
echo "[bump-version] could not find version line in ${PUBSPEC_FILE}" >&2
exit 1
fi
current_interface_version="$(
awk '
/^info:[[:space:]]*$/ { in_info = 1; next }
in_info && /^[[:space:]]+version:[[:space:]]*/ {
sub(/^[[:space:]]+version:[[:space:]]*/, "", $0)
print
exit
}
in_info && /^[^[:space:]]/ { in_info = 0 }
' "${INTERFACE_API_FILE}"
)"
if [[ -z "${current_interface_version}" ]]; then
echo "[bump-version] could not find info.version in ${INTERFACE_API_FILE}" >&2
exit 1
fi
build_number=0
if [[ "${current_pubspec_version}" == *+* ]]; then
build_number="${current_pubspec_version##*+}"
fi
if [[ ! "${build_number}" =~ ^[0-9]+$ ]]; then
echo "[bump-version] invalid build number in ${PUBSPEC_FILE}: ${current_pubspec_version}" >&2
exit 1
fi
next_build_number=$((build_number + 1))
version_tmp="${VERSION_FILE}.tmp.$$"
pubspec_tmp="${PUBSPEC_FILE}.tmp.$$"
interface_tmp="${INTERFACE_API_FILE}.tmp.$$"
cleanup() {
rm -f "${version_tmp}" "${pubspec_tmp}" "${interface_tmp}"
}
trap cleanup EXIT INT TERM
printf '%s\n' "${new_version}" > "${version_tmp}"
awk -v version="${new_version}" -v build="${next_build_number}" '
BEGIN { updated = 0 }
/^version:[[:space:]]*/ && !updated {
print "version: " version "+" build
updated = 1
next
}
{ print }
END {
if (!updated) {
exit 1
}
}
' "${PUBSPEC_FILE}" > "${pubspec_tmp}"
awk -v version="${new_version}" '
BEGIN { in_info = 0; updated = 0 }
/^info:[[:space:]]*$/ {
in_info = 1
print
next
}
in_info && /^[[:space:]]+version:[[:space:]]*/ && !updated {
print " version: " version
updated = 1
next
}
in_info && /^[^[:space:]]/ {
in_info = 0
}
{ print }
END {
if (!updated) {
exit 1
}
}
' "${INTERFACE_API_FILE}" > "${interface_tmp}"
mv "${version_tmp}" "${VERSION_FILE}"
mv "${pubspec_tmp}" "${PUBSPEC_FILE}"
mv "${interface_tmp}" "${INTERFACE_API_FILE}"
echo "===================================="
echo "Release version bumped"
echo "===================================="
echo "version: ${current_version} -> ${new_version}"
echo "${PUBSPEC_FILE}: ${current_pubspec_version} -> ${new_version}+${next_build_number}"
echo "${INTERFACE_API_FILE}: ${current_interface_version} -> ${new_version}"