# 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 }