ccdesign-update-check
1 #!/usr/bin/env bash 2 set -euo pipefail 3 4 CCDESIGN_DIR="${CCDESIGN_DIR:-$(cd "$(dirname "$0")/.." && pwd)}" 5 STATE_DIR="${CCDESIGN_STATE_DIR:-$HOME/.ccdesign}" 6 CACHE_FILE="$STATE_DIR/last-update-check" 7 VERSION_FILE="$CCDESIGN_DIR/VERSION" 8 REMOTE_URL="${CCDESIGN_REMOTE_URL:-https://raw.githubusercontent.com/ZeroZ-lab/claritas-design/master/VERSION}" 9 10 if [ "${1:-}" = "--force" ]; then 11 rm -f "$CACHE_FILE" 12 fi 13 14 LOCAL="" 15 if [ -f "$VERSION_FILE" ]; then 16 LOCAL="$(tr -d '[:space:]' < "$VERSION_FILE" 2>/dev/null || true)" 17 fi 18 if [ -z "$LOCAL" ]; then 19 exit 0 20 fi 21 22 mkdir -p "$STATE_DIR" 23 24 if [ -f "$CACHE_FILE" ]; then 25 CACHED="$(cat "$CACHE_FILE" 2>/dev/null || true)" 26 case "$CACHED" in 27 UP_TO_DATE*) CACHE_TTL=60 ;; 28 UPGRADE_AVAILABLE*) CACHE_TTL=720 ;; 29 *) CACHE_TTL=0 ;; 30 esac 31 32 STALE=$(find "$CACHE_FILE" -mmin +"$CACHE_TTL" 2>/dev/null || true) 33 if [ -z "$STALE" ] && [ "$CACHE_TTL" -gt 0 ]; then 34 case "$CACHED" in 35 UP_TO_DATE*) 36 CACHED_VER="$(echo "$CACHED" | awk '{print $2}')" 37 if [ "$CACHED_VER" = "$LOCAL" ]; then 38 exit 0 39 fi 40 ;; 41 UPGRADE_AVAILABLE*) 42 CACHED_OLD="$(echo "$CACHED" | awk '{print $2}')" 43 # Always re-verify UPGRADE_AVAILABLE against the remote. 44 # A cached "upgrade" may be stale if the remote version was reverted. 45 # Skip the network call only for UP_TO_DATE (where local == remote). 46 ;; 47 esac 48 fi 49 fi 50 51 REMOTE="$(curl -fsSL --max-time 5 "$REMOTE_URL" 2>/dev/null || true)" 52 REMOTE="$(echo "$REMOTE" | tr -d '[:space:]')" 53 54 if ! echo "$REMOTE" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+([.-][A-Za-z0-9]+)?$'; then 55 echo "UP_TO_DATE $LOCAL" > "$CACHE_FILE" 56 exit 0 57 fi 58 59 if [ "$LOCAL" = "$REMOTE" ]; then 60 echo "UP_TO_DATE $LOCAL" > "$CACHE_FILE" 61 exit 0 62 fi 63 64 echo "UPGRADE_AVAILABLE $LOCAL $REMOTE" > "$CACHE_FILE" 65 echo "UPGRADE_AVAILABLE $LOCAL $REMOTE"