NuvioStreaming/scripts/set-version.sh
2026-06-09 21:46:48 +05:30

218 lines
5.4 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BASE_VERSION_FILE="$ROOT_DIR/iosApp/Configuration/Version.xcconfig"
DESKTOP_VERSION_FILE="$ROOT_DIR/composeApp/Configuration/DesktopVersion.properties"
BASE_VERSION=""
BASE_CODE=""
DESKTOP_VERSION=""
DESKTOP_CODE=""
DRY_RUN=false
SHOW=false
usage() {
cat <<'EOF'
Usage:
./scripts/set-version.sh --desktop 0.1.0 --desktop-code 1
./scripts/set-version.sh --base 0.2.4 --base-code 75
./scripts/set-version.sh --base 0.2.4 --base-code 75 --desktop 0.1.0 --desktop-code 1
./scripts/set-version.sh --show
Options:
--base VERSION Set the upstream/mobile Nuvio version.
--base-code CODE Set the upstream/mobile build code.
--desktop VERSION Set the desktop app release version.
--desktop-code CODE Set the desktop app build code.
--dry-run Print changes without writing files.
--show Print current configured versions.
-h, --help Show this help.
The base version is stored in iosApp/Configuration/Version.xcconfig.
The desktop version is stored in composeApp/Configuration/DesktopVersion.properties.
EOF
}
die() {
echo "error: $*" >&2
exit 1
}
read_key() {
local file="$1"
local key="$2"
[[ -f "$file" ]] || return 0
awk -F '=' -v target="$key" '
{
raw_key = $1
gsub(/^[[:space:]]+|[[:space:]]+$/, "", raw_key)
if (raw_key == target) {
sub(/^[^=]*=/, "", $0)
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0)
print $0
exit
}
}
' "$file"
}
validate_version() {
local label="$1"
local value="$2"
[[ "$value" =~ ^[0-9]+(\.[0-9]+){1,3}([._-][0-9A-Za-z][0-9A-Za-z._-]*)?$ ]] ||
die "$label must look like 0.1.0 or 0.1.0-alpha.1"
}
validate_code() {
local label="$1"
local value="$2"
[[ "$value" =~ ^[0-9]+$ ]] || die "$label must be a positive integer"
(( 10#$value > 0 )) || die "$label must be greater than 0"
}
write_key() {
local file="$1"
local key="$2"
local value="$3"
mkdir -p "$(dirname "$file")"
local tmp
tmp="$(mktemp "${TMPDIR:-/tmp}/nuvio-version.XXXXXX")"
if [[ -f "$file" ]]; then
awk -v key="$key" -v value="$value" '
BEGIN { seen = 0 }
{
raw_key = $0
sub(/[[:space:]]*=.*/, "", raw_key)
gsub(/^[[:space:]]+|[[:space:]]+$/, "", raw_key)
if (raw_key == key) {
print key "=" value
seen = 1
next
}
print
}
END {
if (!seen) print key "=" value
}
' "$file" > "$tmp"
else
printf '%s=%s\n' "$key" "$value" > "$tmp"
fi
mv "$tmp" "$file"
}
print_current_versions() {
local base_version base_code desktop_version desktop_code
base_version="$(read_key "$BASE_VERSION_FILE" "MARKETING_VERSION")"
base_code="$(read_key "$BASE_VERSION_FILE" "CURRENT_PROJECT_VERSION")"
desktop_version="$(read_key "$DESKTOP_VERSION_FILE" "VERSION_NAME")"
desktop_code="$(read_key "$DESKTOP_VERSION_FILE" "VERSION_CODE")"
echo "Base/mobile: ${base_version:-unset} (${base_code:-unset})"
echo "Desktop: ${desktop_version:-unset} (${desktop_code:-unset})"
}
queue_change() {
local file="$1"
local key="$2"
local value="$3"
local current
current="$(read_key "$file" "$key")"
if [[ "$current" == "$value" ]]; then
echo "unchanged: $key=$value"
return 0
fi
echo "set: $key ${current:-unset} -> $value"
if [[ "$DRY_RUN" == false ]]; then
write_key "$file" "$key" "$value"
fi
}
while [[ $# -gt 0 ]]; do
case "$1" in
--base)
[[ $# -ge 2 ]] || die "--base requires a value"
BASE_VERSION="$2"
shift 2
;;
--base-code)
[[ $# -ge 2 ]] || die "--base-code requires a value"
BASE_CODE="$2"
shift 2
;;
--desktop)
[[ $# -ge 2 ]] || die "--desktop requires a value"
DESKTOP_VERSION="$2"
shift 2
;;
--desktop-code)
[[ $# -ge 2 ]] || die "--desktop-code requires a value"
DESKTOP_CODE="$2"
shift 2
;;
--dry-run)
DRY_RUN=true
shift
;;
--show)
SHOW=true
shift
;;
-h|--help)
usage
exit 0
;;
*)
die "unknown argument: $1"
;;
esac
done
if [[ "$SHOW" == true ]]; then
print_current_versions
if [[ -z "$BASE_VERSION$BASE_CODE$DESKTOP_VERSION$DESKTOP_CODE" ]]; then
exit 0
fi
echo
fi
[[ -n "$BASE_VERSION$BASE_CODE$DESKTOP_VERSION$DESKTOP_CODE" ]] ||
die "nothing to change; pass --base/--base-code/--desktop/--desktop-code or --show"
if [[ -n "$BASE_VERSION" ]]; then
validate_version "base version" "$BASE_VERSION"
fi
if [[ -n "$BASE_CODE" ]]; then
validate_code "base code" "$BASE_CODE"
fi
if [[ -n "$DESKTOP_VERSION" ]]; then
validate_version "desktop version" "$DESKTOP_VERSION"
fi
if [[ -n "$DESKTOP_CODE" ]]; then
validate_code "desktop code" "$DESKTOP_CODE"
fi
if [[ -n "$BASE_VERSION$BASE_CODE" ]]; then
echo "Base/mobile version file: $BASE_VERSION_FILE"
[[ -z "$BASE_VERSION" ]] || queue_change "$BASE_VERSION_FILE" "MARKETING_VERSION" "$BASE_VERSION"
[[ -z "$BASE_CODE" ]] || queue_change "$BASE_VERSION_FILE" "CURRENT_PROJECT_VERSION" "$BASE_CODE"
fi
if [[ -n "$DESKTOP_VERSION$DESKTOP_CODE" ]]; then
echo "Desktop version file: $DESKTOP_VERSION_FILE"
[[ -z "$DESKTOP_VERSION" ]] || queue_change "$DESKTOP_VERSION_FILE" "VERSION_NAME" "$DESKTOP_VERSION"
[[ -z "$DESKTOP_CODE" ]] || queue_change "$DESKTOP_VERSION_FILE" "VERSION_CODE" "$DESKTOP_CODE"
fi
echo
print_current_versions