feat: offline flavor without sync or network access (#39)

This commit is contained in:
2026-10-06 18:34:33 +02:00
parent 7fde7ae290
commit 84bb1116ec
107 changed files with 779 additions and 433 deletions
+13 -3
View File
@@ -15,7 +15,8 @@
# TAG, SHA vX.Y.Z[-beta.N] and the commit it marks
# PRERELEASE true | false
# NOTES_FILE release notes (scripts/release_notes.sh)
# APK the signed release APK
# APK the signed release APK (full flavor)
# APK_OFFLINE optional: the signed offline-flavor APK (issue #39)
set -euo pipefail
if [ -z "${TOKEN:-}" ]; then
echo "CODEBERG_RELEASE_TOKEN not set — skipping Codeberg publish."
@@ -27,10 +28,19 @@ if [ ! -f "$APK" ]; then echo "No release APK at $APK." >&2; exit 1; fi
WORK=$(mktemp -d)
trap 'rm -rf "$WORK"' EXIT
# The full APK keeps its historical name: Obtainium filters point at it.
ASSET_APK="agendula_${TAG}.apk"
ASSET_SUM="${ASSET_APK}.sha256"
cp "$APK" "$WORK/$ASSET_APK"
( cd "$WORK" && sha256sum "$ASSET_APK" > "$ASSET_SUM" )
ASSETS=("$ASSET_APK" "$ASSET_SUM")
if [ -n "${APK_OFFLINE:-}" ]; then
if [ ! -f "$APK_OFFLINE" ]; then echo "No offline APK at $APK_OFFLINE." >&2; exit 1; fi
ASSET_OFFLINE="agendula-offline_${TAG}.apk"
cp "$APK_OFFLINE" "$WORK/$ASSET_OFFLINE"
( cd "$WORK" && sha256sum "$ASSET_OFFLINE" > "$ASSET_OFFLINE.sha256" )
ASSETS+=("$ASSET_OFFLINE" "$ASSET_OFFLINE.sha256")
fi
# Push the tag to Codeberg ourselves. Under Codeberg-canonical the mirror runs
# Codeberg -> Gitea, so waiting for a tag to arrive from Gitea (what 0.3.2 did)
@@ -84,8 +94,8 @@ for attempt in 1 2 3 4 5 6; do
done
if [ -z "$ID" ]; then echo "Could not resolve Codeberg release id after retries." >&2; exit 1; fi
# Attach APK + checksum, replacing any prior asset of the same name.
for A in "$ASSET_APK" "$ASSET_SUM"; do
# Attach APKs + checksums, replacing any prior asset of the same name.
for A in "${ASSETS[@]}"; do
OLD=$(curl -s -H "Authorization: token $TOKEN" "$API/releases/$ID/assets" \
| jq -r --arg n "$A" '.[] | select(.name==$n) | .id')
[ -n "$OLD" ] && curl -s -X DELETE -H "Authorization: token $TOKEN" "$API/releases/$ID/assets/$OLD" >/dev/null || true
+10 -4
View File
@@ -11,7 +11,8 @@
# TAG, SHA vX.Y.Z[-beta.N] and the commit it marks
# PRERELEASE true | false
# NOTES_FILE release notes (scripts/release_notes.sh)
# MAPPING optional path to R8's mapping.txt
# MAPPING optional path to R8's mapping.txt (full flavor)
# MAPPING_OFFLINE optional path to the offline flavor's mapping.txt
set -euo pipefail
: "${TOKEN:?}" "${API:?}" "${TAG:?}" "${SHA:?}" "${PRERELEASE:?}" "${NOTES_FILE:?}"
@@ -57,8 +58,8 @@ echo "Created/updated Gitea release $TAG at $SHA"
# so it fits the no-binaries rule for this release. Best-effort: never fail a
# release over it.
attach_mapping() {
local asset="mapping-${TAG#v}.txt.gz" old
gzip -c "$MAPPING" > "$WORK/$asset"
local mapping=$1 asset=$2 old
gzip -c "$mapping" > "$WORK/$asset"
# Replace any prior asset of the same name (re-run safe).
old=$(curl -s -H "Authorization: token $TOKEN" "$API/releases/$ID/assets" \
| jq -r --arg n "$asset" '.[] | select(.name==$n) | .id')
@@ -72,5 +73,10 @@ attach_mapping() {
if [ -z "${MAPPING:-}" ] || [ ! -f "$MAPPING" ]; then
echo "No mapping.txt (R8 off?) — skipping."
else
attach_mapping || echo "warning: could not attach the R8 mapping to $TAG" >&2
attach_mapping "$MAPPING" "mapping-${TAG#v}.txt.gz" \
|| echo "warning: could not attach the R8 mapping to $TAG" >&2
fi
if [ -n "${MAPPING_OFFLINE:-}" ] && [ -f "$MAPPING_OFFLINE" ]; then
attach_mapping "$MAPPING_OFFLINE" "mapping-offline-${TAG#v}.txt.gz" \
|| echo "warning: could not attach the offline R8 mapping to $TAG" >&2
fi
+11 -5
View File
@@ -11,16 +11,22 @@
# unminified debug build — or a device that already holds the permission —
# silently hides.
#
# Usage: scripts/verify-release.sh
# Usage: scripts/verify-release.sh [full|offline] (default: full)
set -euo pipefail
cd "$(dirname "$0")/.."
PKG="de.jeanlucmakiola.agendula.releasetest"
APK="app/build/outputs/apk/releaseTest/app-releaseTest.apk"
FLAVOR="${1:-full}"
case "$FLAVOR" in
full) PKG="de.jeanlucmakiola.agendula.releasetest" ;;
offline) PKG="de.jeanlucmakiola.agendula.offline.releasetest" ;;
*) echo "Unknown flavor '$FLAVOR' (full|offline)." >&2; exit 2 ;;
esac
TASK="assemble${FLAVOR^}ReleaseTest"
APK="app/build/outputs/apk/$FLAVOR/releaseTest/app-$FLAVOR-releaseTest.apk"
echo "==> Building release-candidate APK (releaseTest, R8 minified)…"
./gradlew :app:assembleReleaseTest
echo "==> Building release-candidate APK ($FLAVOR releaseTest, R8 minified)…"
./gradlew ":app:$TASK"
echo "==> Installing $PKG …"
adb install -r "$APK"