133 lines
4.6 KiB
Bash
133 lines
4.6 KiB
Bash
# shellcheck shell=bash
|
|
# Release age helpers for Android wallet matrix.
|
|
# Source after ROOT/lib_android_env.sh (optional).
|
|
#
|
|
# BLOCKER only when a *released* app is within BLOCKER_MAX_AGE_DAYS (default 14).
|
|
# Older releases: try them, but failures are WARN only.
|
|
|
|
: "${BLOCKER_MAX_AGE_DAYS:=14}"
|
|
: "${TALER_ANDROID_SRC:=$HOME/taler/taler-android}"
|
|
|
|
# Days since git tag (tagger/committer date). Empty if unknown.
|
|
# Usage: release_age_days wallet-1.6.1 → e.g. 28
|
|
release_age_days() {
|
|
local tag="$1"
|
|
local src="${2:-$TALER_ANDROID_SRC}"
|
|
[ -d "$src/.git" ] || return 1
|
|
local epoch
|
|
epoch=$(git -C "$src" log -1 --format=%ct "refs/tags/${tag}" 2>/dev/null || true)
|
|
[ -n "$epoch" ] || epoch=$(git -C "$src" log -1 --format=%ct "$tag" 2>/dev/null || true)
|
|
[ -n "$epoch" ] || return 1
|
|
local now
|
|
now=$(date +%s)
|
|
echo $(( (now - epoch) / 86400 ))
|
|
}
|
|
|
|
# severity from age: blocker if age_days <= BLOCKER_MAX_AGE_DAYS, else warn
|
|
# Unknown age → warn (never accidental hard fail on mystery builds)
|
|
severity_from_age_days() {
|
|
local days="${1:-}"
|
|
if [ -z "$days" ] || ! [[ "$days" =~ ^[0-9]+$ ]]; then
|
|
echo warn
|
|
return
|
|
fi
|
|
if [ "$days" -le "${BLOCKER_MAX_AGE_DAYS}" ]; then
|
|
echo blocker
|
|
else
|
|
echo warn
|
|
fi
|
|
}
|
|
|
|
severity_for_tag() {
|
|
local tag="$1"
|
|
local days
|
|
days=$(release_age_days "$tag" 2>/dev/null || true)
|
|
severity_from_age_days "$days"
|
|
}
|
|
|
|
# List wallet-* release tags newest first (exclude rc/dev).
|
|
# Args: max count (default 5). Pass 0 or "all" for no limit.
|
|
list_wallet_release_tags() {
|
|
local n="${1:-5}"
|
|
local src="${TALER_ANDROID_SRC:-$HOME/taler/taler-android}"
|
|
[ -d "$src/.git" ] || return 1
|
|
git -C "$src" fetch --tags origin 2>/dev/null || true
|
|
local cmd=(git -C "$src" for-each-ref --sort=-creatordate --format='%(refname:short)' refs/tags)
|
|
if [ "$n" = "all" ] || [ "$n" = "0" ]; then
|
|
"${cmd[@]}" | grep -E '^wallet-[0-9]+\.[0-9]+(\.[0-9]+)?$'
|
|
else
|
|
"${cmd[@]}" | grep -E '^wallet-[0-9]+\.[0-9]+(\.[0-9]+)?$' | head -n "$n"
|
|
fi
|
|
}
|
|
|
|
# Pick one tag closest to each age milestone (days). Always intended as WARN samples.
|
|
# Default milestones: 3,6,9,12 months ≈ 90,180,270,365 days.
|
|
# Env: MILESTONE_DAYS="90 180 270 365" MILESTONE_TOLERANCE_DAYS=50
|
|
# Prints lines: TAG AGE_DAYS TARGET_DAYS (only when a tag within tolerance exists)
|
|
select_milestone_tags() {
|
|
local src="${TALER_ANDROID_SRC:-$HOME/taler/taler-android}"
|
|
local milestones="${MILESTONE_DAYS:-90 180 270 365}"
|
|
local tol="${MILESTONE_TOLERANCE_DAYS:-50}"
|
|
local skip="${1:-}" # optional tag to exclude (e.g. current STABLE_TAG)
|
|
local -a tags=()
|
|
mapfile -t tags < <(list_wallet_release_tags all 2>/dev/null || true)
|
|
[ "${#tags[@]}" -gt 0 ] || return 0
|
|
|
|
local target best_tag best_age best_delta age t delta
|
|
local -A used=()
|
|
for target in $milestones; do
|
|
best_tag=""
|
|
best_age=""
|
|
best_delta=99999
|
|
for t in "${tags[@]}"; do
|
|
[ -n "$t" ] || continue
|
|
[ "$t" = "$skip" ] && continue
|
|
[ -n "${used[$t]:-}" ] && continue
|
|
age=$(release_age_days "$t" "$src" 2>/dev/null || true)
|
|
[[ "$age" =~ ^[0-9]+$ ]] || continue
|
|
delta=$(( age > target ? age - target : target - age ))
|
|
if [ "$delta" -le "$tol" ] && [ "$delta" -lt "$best_delta" ]; then
|
|
best_delta=$delta
|
|
best_tag=$t
|
|
best_age=$age
|
|
fi
|
|
done
|
|
if [ -n "$best_tag" ]; then
|
|
used[$best_tag]=1
|
|
echo "$best_tag $best_age $target"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Guess F-Droid APK URL for a wallet version name (e.g. 1.6.1).
|
|
# Uses versionCode from tag's build.gradle if possible, else STABLE mapping.
|
|
# Prints: versionCode apk_url or returns 1
|
|
fdroid_apk_for_version_name() {
|
|
local vn="$1" # 1.6.1
|
|
local src="${TALER_ANDROID_SRC:-$HOME/taler/taler-android}"
|
|
local tag="wallet-${vn}"
|
|
local vc=""
|
|
if git -C "$src" cat-file -e "refs/tags/${tag}:wallet/build.gradle" 2>/dev/null; then
|
|
vc=$(git -C "$src" show "refs/tags/${tag}:wallet/build.gradle" 2>/dev/null \
|
|
| sed -n 's/^[[:space:]]*versionCode[[:space:]]\+\([0-9]\+\).*/\1/p' | head -1)
|
|
fi
|
|
# ABI x86_64 → +4 in override scheme 10*vc+abi (common F-Droid multi-apk)
|
|
# Prefer universal-style code used by F-Droid: for 1.6.1 → 854 = 10*85+4
|
|
local apk_vc=""
|
|
if [ -n "$vc" ]; then
|
|
apk_vc=$((10 * vc + 4))
|
|
fi
|
|
# Known overrides / suggested
|
|
case "$vn" in
|
|
1.6.1) apk_vc=854 ;;
|
|
esac
|
|
[ -n "$apk_vc" ] || return 1
|
|
echo "${apk_vc}|https://f-droid.org/repo/net.taler.wallet.fdroid_${apk_vc}.apk"
|
|
}
|
|
|
|
# Check HTTP HEAD/GET that APK exists (0 = ok)
|
|
fdroid_apk_exists() {
|
|
local url="$1"
|
|
curl -sfS -m 15 -o /dev/null -r 0-0 "$url" 2>/dev/null \
|
|
|| curl -sfS -m 15 -o /dev/null -I "$url" 2>/dev/null
|
|
}
|