#!/usr/bin/env bash # gstack-update-check — daily version check for all skills. # # Output (one line, or nothing): # JUST_UPGRADED — marker found from recent upgrade # UPGRADE_AVAILABLE — remote VERSION differs from local # (nothing) — up to date or check skipped # # Env overrides (for testing): # GSTACK_DIR — override auto-detected gstack root # GSTACK_REMOTE_URL — override remote VERSION URL # GSTACK_STATE_DIR — override ~/.gstack state directory set -euo pipefail GSTACK_DIR="${GSTACK_DIR:-$(cd "$(dirname "$0")/.." && pwd)}" STATE_DIR="${GSTACK_STATE_DIR:-$HOME/.gstack}" CACHE_FILE="$STATE_DIR/last-update-check" MARKER_FILE="$STATE_DIR/just-upgraded-from" VERSION_FILE="$GSTACK_DIR/VERSION" REMOTE_URL="${GSTACK_REMOTE_URL:-https://raw.githubusercontent.com/garrytan/gstack/main/VERSION}" # ─── Step 1: Read local version ────────────────────────────── LOCAL="" if [ -f "$VERSION_FILE" ]; then LOCAL="$(cat "$VERSION_FILE" 2>/dev/null | tr -d '[:space:]')" fi if [ -z "$LOCAL" ]; then exit 0 # No VERSION file → skip check fi # ─── Step 2: Check "just upgraded" marker ───────────────────── if [ -f "$MARKER_FILE" ]; then OLD="$(cat "$MARKER_FILE" 2>/dev/null | tr -d '[:space:]')" rm -f "$MARKER_FILE" mkdir -p "$STATE_DIR" echo "UP_TO_DATE $LOCAL" > "$CACHE_FILE" if [ -n "$OLD" ]; then echo "JUST_UPGRADED $OLD $LOCAL" fi exit 0 fi # ─── Step 3: Check cache freshness (24h = 1440 min) ────────── if [ -f "$CACHE_FILE" ]; then # Cache is fresh if modified within 1440 minutes STALE=$(find "$CACHE_FILE" -mmin +1440 2>/dev/null || true) if [ -z "$STALE" ]; then # Cache is fresh — read it CACHED="$(cat "$CACHE_FILE" 2>/dev/null || true)" case "$CACHED" in UP_TO_DATE*) exit 0 ;; UPGRADE_AVAILABLE*) # Verify local version still matches cached old version CACHED_OLD="$(echo "$CACHED" | awk '{print $2}')" if [ "$CACHED_OLD" = "$LOCAL" ]; then echo "$CACHED" exit 0 fi # Local version changed (manual upgrade?) — fall through to re-check ;; esac fi fi # ─── Step 4: Slow path — fetch remote version ──────────────── mkdir -p "$STATE_DIR" REMOTE="" REMOTE="$(curl -sf --max-time 5 "$REMOTE_URL" 2>/dev/null || true)" REMOTE="$(echo "$REMOTE" | tr -d '[:space:]')" # Validate: must look like a version number (reject HTML error pages) if ! echo "$REMOTE" | grep -qE '^[0-9]+\.[0-9.]+$'; then # Invalid or empty response — assume up to date echo "UP_TO_DATE $LOCAL" > "$CACHE_FILE" exit 0 fi if [ "$LOCAL" = "$REMOTE" ]; then echo "UP_TO_DATE $LOCAL" > "$CACHE_FILE" exit 0 fi # Versions differ — upgrade available echo "UPGRADE_AVAILABLE $LOCAL $REMOTE" > "$CACHE_FILE" echo "UPGRADE_AVAILABLE $LOCAL $REMOTE"