Files
CleanMM/scripts/atlas/prepare-release.sh
2026-03-14 22:41:05 +08:00

106 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
PROJECT_FILE="$ROOT_DIR/project.yml"
APP_MODEL_FILE="$ROOT_DIR/Apps/AtlasApp/Sources/AtlasApp/AtlasAppModel.swift"
CHANGELOG_FILE="$ROOT_DIR/CHANGELOG.md"
usage() {
cat <<'EOF'
Usage:
./scripts/atlas/prepare-release.sh <version> [build-number] [release-date]
Examples:
./scripts/atlas/prepare-release.sh 1.0.2
./scripts/atlas/prepare-release.sh 1.0.2 3
./scripts/atlas/prepare-release.sh 1.0.2 3 2026-03-14
Behavior:
- updates MARKETING_VERSION and CURRENT_PROJECT_VERSION in project.yml
- updates AtlasApp fallback version/build strings
- inserts a changelog section for the requested version if it does not already exist
EOF
}
if [[ $# -lt 1 || $# -gt 3 ]]; then
usage >&2
exit 1
fi
VERSION="$1"
BUILD_NUMBER="${2:-}"
RELEASE_DATE="${3:-$(date +%F)}"
if [[ ! "$VERSION" =~ ^[0-9]+(\.[0-9]+){1,2}([.-][0-9A-Za-z.-]+)?$ ]]; then
echo "Invalid version: $VERSION" >&2
exit 1
fi
if [[ -n "$BUILD_NUMBER" && ! "$BUILD_NUMBER" =~ ^[0-9]+$ ]]; then
echo "Build number must be numeric: $BUILD_NUMBER" >&2
exit 1
fi
if [[ ! "$RELEASE_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "Release date must use YYYY-MM-DD: $RELEASE_DATE" >&2
exit 1
fi
if [[ ! -f "$PROJECT_FILE" || ! -f "$APP_MODEL_FILE" || ! -f "$CHANGELOG_FILE" ]]; then
echo "Expected release files are missing." >&2
exit 1
fi
if [[ -z "$BUILD_NUMBER" ]]; then
current_build="$(
sed -n 's/.*CURRENT_PROJECT_VERSION: \([0-9][0-9]*\).*/\1/p' "$PROJECT_FILE" | head -1
)"
if [[ -z "$current_build" ]]; then
echo "Could not determine current build number from project.yml" >&2
exit 1
fi
BUILD_NUMBER="$((current_build + 1))"
fi
current_version="$(
sed -n 's/.*MARKETING_VERSION: "\(.*\)"/\1/p' "$PROJECT_FILE" | head -1
)"
perl -0pi -e 's/MARKETING_VERSION: "[^"]+"/MARKETING_VERSION: "'"$VERSION"'"/g' "$PROJECT_FILE"
perl -0pi -e 's/CURRENT_PROJECT_VERSION: \d+/CURRENT_PROJECT_VERSION: '"$BUILD_NUMBER"'/g' "$PROJECT_FILE"
perl -0pi -e 's/(CFBundleShortVersionString"\] as\? String \?\? )"[^"]+"/${1}"'"$VERSION"'"/' "$APP_MODEL_FILE"
perl -0pi -e 's/(CFBundleVersion"\] as\? String \?\? )"[^"]+"/${1}"'"$BUILD_NUMBER"'"/' "$APP_MODEL_FILE"
if ! grep -Fq "## [$VERSION] - $RELEASE_DATE" "$CHANGELOG_FILE"; then
tmpfile="$(mktemp "${TMPDIR:-/tmp}/atlas-changelog.XXXXXX")"
awk -v version="$VERSION" -v date="$RELEASE_DATE" '
BEGIN { inserted = 0 }
{
print
if (!inserted && $0 == "## [Unreleased]") {
print ""
print "## [" version "] - " date
print ""
print "### Added"
print ""
print "### Changed"
print ""
print "### Fixed"
print ""
inserted = 1
}
}
' "$CHANGELOG_FILE" > "$tmpfile"
mv "$tmpfile" "$CHANGELOG_FILE"
fi
printf 'Prepared Atlas release files\n'
printf 'Previous version: %s\n' "${current_version:-UNKNOWN}"
printf 'New version: %s\n' "$VERSION"
printf 'Build number: %s\n' "$BUILD_NUMBER"
printf 'Release date: %s\n' "$RELEASE_DATE"
printf 'Updated: %s\n' "$PROJECT_FILE"
printf 'Updated: %s\n' "$APP_MODEL_FILE"
printf 'Updated: %s\n' "$CHANGELOG_FILE"