Brings the workflows, scripts and fastlane setup up to Agendula's
v1.1.0-beta.1 state:
- beta.yaml: a release/** branch carrying X.Y.Z-beta.N publishes a
Gitea + Codeberg pre-release with the signed APK. Never F-Droid or Play.
- scripts/version_info.sh derives versionCode from versionName for every
workflow and CI step. Clockula has no shipped 1.0.x codes, so it uses one
scheme: X*1000000 + Y*10000 + Z*100 + (beta N, or 99 for stable).
- CI checks the committed versionCode, blocks a beta from reaching main,
enforces the 500-char What's New and validates the store listing.
- Shared publish_gitea_release.sh / publish_codeberg_release.sh /
release_notes.sh replace the inline steps in release.yaml.
- Renovate also runs on every push to main to rebase conflicted PRs.
- jniLibs keepDebugSymbols, which the reproducibility guard now requires.
Fixes a bug present in Agendula too: the Codeberg tag lookups used
/git/refs/tags/{tag}, which matches by prefix, so v1.0.0 would have
"existed" as soon as v1.0.0-beta.1 did. That would have refused every
later beta and skipped the stable release. Both now use /tags/{tag}.
78 lines
3.1 KiB
Bash
Executable File
78 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# The one place that turns the committed versionName into a versionCode and a
|
|
# release channel. The release and beta pipelines, the changelog sync and the
|
|
# store-listing check all read it from here, so the scheme can't drift between
|
|
# them.
|
|
#
|
|
# versionName channel versionCode
|
|
# X.Y.Z-beta.N beta X*1000000 + Y*10000 + Z*100 + N (N = 1..98)
|
|
# X.Y.Z stable X*1000000 + Y*10000 + Z*100 + 99
|
|
#
|
|
# A beta's code sits below its own stable release and above everything before
|
|
# it, so a beta install updates in place to the next beta and then to the
|
|
# stable version: 1.0.0-beta.1 -> 1000001, 1.0.0 -> 1000099.
|
|
#
|
|
# scripts/version_info.sh print version, version_code, base_version,
|
|
# channel and prerelease as key=value lines
|
|
# (ready for $GITHUB_OUTPUT)
|
|
# scripts/version_info.sh <key> print just that value
|
|
# scripts/version_info.sh --check also fail unless the committed versionCode
|
|
# matches; the official F-Droid repo builds
|
|
# the tag as committed, so it must
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.." # repo root
|
|
|
|
GRADLE="app/build.gradle.kts"
|
|
NAME=$(grep -oP 'versionName\s*=\s*"\K[^"]+' "$GRADLE" || true)
|
|
COMMITTED=$(grep -oP 'versionCode\s*=\s*\K[0-9]+' "$GRADLE" || true)
|
|
[ -n "$NAME" ] || { echo "No versionName in $GRADLE" >&2; exit 1; }
|
|
|
|
if [[ ! "$NAME" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)(-beta\.([0-9]+))?$ ]]; then
|
|
echo "versionName '$NAME' is neither X.Y.Z nor X.Y.Z-beta.N" >&2
|
|
exit 1
|
|
fi
|
|
MAJOR=$((10#${BASH_REMATCH[1]})); MINOR=$((10#${BASH_REMATCH[2]})); PATCH=$((10#${BASH_REMATCH[3]}))
|
|
BETA=${BASH_REMATCH[5]:+$((10#${BASH_REMATCH[5]}))}
|
|
BASE="$MAJOR.$MINOR.$PATCH"
|
|
|
|
if [ "$MINOR" -gt 99 ] || [ "$PATCH" -gt 99 ]; then
|
|
echo "versionName '$NAME': MINOR and PATCH each have room for 0-99" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$BETA" ]; then
|
|
if [ "$BETA" -lt 1 ] || [ "$BETA" -gt 98 ]; then
|
|
echo "versionName '$NAME': beta number must be 1-98 (99 is the stable release)" >&2
|
|
exit 1
|
|
fi
|
|
CHANNEL=beta
|
|
CODE=$(( MAJOR * 1000000 + MINOR * 10000 + PATCH * 100 + BETA ))
|
|
else
|
|
CHANNEL=stable
|
|
CODE=$(( MAJOR * 1000000 + MINOR * 10000 + PATCH * 100 + 99 ))
|
|
fi
|
|
|
|
# Betas are always pre-releases; so was everything before 1.0.0.
|
|
if [ "$CHANNEL" = beta ] || [ "$MAJOR" = 0 ]; then PRERELEASE=true; else PRERELEASE=false; fi
|
|
|
|
case "${1:-}" in
|
|
"")
|
|
printf 'version=%s\nversion_code=%s\nbase_version=%s\nchannel=%s\nprerelease=%s\n' \
|
|
"$NAME" "$CODE" "$BASE" "$CHANNEL" "$PRERELEASE"
|
|
;;
|
|
--check)
|
|
if [ "$COMMITTED" != "$CODE" ]; then
|
|
echo "ERROR: $GRADLE has versionCode = ${COMMITTED:-<none>}, but versionName '$NAME' needs $CODE." >&2
|
|
echo "Set versionCode = $CODE (see docs/RELEASING.md for the scheme)." >&2
|
|
exit 1
|
|
fi
|
|
echo "OK: versionName $NAME -> versionCode $CODE ($CHANNEL)."
|
|
;;
|
|
version) echo "$NAME" ;;
|
|
version_code) echo "$CODE" ;;
|
|
base_version) echo "$BASE" ;;
|
|
channel) echo "$CHANNEL" ;;
|
|
prerelease) echo "$PRERELEASE" ;;
|
|
*) echo "Unknown key '$1'" >&2; exit 2 ;;
|
|
esac
|