#!/bin/bash # # Purpose: Check for available version updates in binaries.conf and compile.conf HAMPACK_DIR="${HAMPACK_DIR:-$HOME/.local/share/HamPack}" BINARIES_CONF="${HAMPACK_BINARIES_CONF:-$HAMPACK_DIR/binaries.conf}" COMPILE_CONF="${HAMPACK_COMPILE_CONF:-$HAMPACK_DIR/compile.conf}" # Extract "owner/repo" from a GitHub URL, or empty string if not GitHub github_repo_from_url() { local url="$1" if [[ "$url" =~ github\.com/([^/]+)/([^/]+) ]]; then echo "${BASH_REMATCH[1]}/${BASH_REMATCH[2]%.git}" fi } # Fetch latest release tag via GitHub API, stripping leading "v" github_latest() { local repo="$1" curl -sf "https://api.github.com/repos/$repo/releases/latest" \ | grep '"tag_name"' \ | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/' \ | sed 's/^v//' } print_result() { local app="$1" local pinned="$2" local latest="$3" local manual_url="$4" if [ -n "$manual_url" ]; then printf " %-20s pinned=%-15s (manual check: %s)\n" "$app" "$pinned" "$manual_url" elif [ -z "$latest" ]; then printf " %-20s pinned=%-15s (GitHub API unavailable)\n" "$app" "$pinned" elif [ "$pinned" = "$latest" ]; then printf " %-20s up to date (%s)\n" "$app" "$pinned" else printf " %-20s pinned=%-15s latest=%-15s ** UPDATE AVAILABLE **\n" "$app" "$pinned" "$latest" fi } check_app() { local app="$1" local version="$2" local url="$3" # git= or url= field (may be GitHub) local fallback="$4" # wget= or non-GitHub url for manual check [ -z "$app" ] || [ -z "$version" ] && return local gh_repo gh_repo=$(github_repo_from_url "$url") if [ -n "$gh_repo" ]; then print_result "$app" "$version" "$(github_latest "$gh_repo")" "" else print_result "$app" "$version" "" "${fallback:-$url}" fi } check_binaries() { echo "=== binaries.conf ===" local app="" version="" url="" while IFS= read -r line || [ -n "$line" ]; do [[ -z "$line" || "$line" == \#* ]] && continue if [[ "$line" =~ ^\[(.+)\]$ ]]; then check_app "$app" "$version" "$url" "" app="${BASH_REMATCH[1]}" version="" url="" continue fi local key="${line%%=*}" value="${line#*=}" case "$key" in version) version="$value" ;; url) url="$value" ;; esac done < "$BINARIES_CONF" check_app "$app" "$version" "$url" "" } check_compiled() { echo "" echo "=== compile.conf ===" local app="" version="" git_url="" wget_url="" while IFS= read -r line || [ -n "$line" ]; do [[ -z "$line" || "$line" == \#* ]] && continue if [[ "$line" =~ ^\[(.+)\]$ ]]; then check_app "$app" "$version" "$git_url" "$wget_url" app="${BASH_REMATCH[1]}" version="" git_url="" wget_url="" continue fi local key="${line%%=*}" value="${line#*=}" case "$key" in version) version="$value" ;; git) git_url="$value" ;; wget) wget_url="$value" ;; esac done < "$COMPILE_CONF" check_app "$app" "$version" "$git_url" "$wget_url" } # --- Main --- for conf in "$BINARIES_CONF" "$COMPILE_CONF"; do if [ ! -f "$conf" ]; then echo "Error: $conf not found." exit 1 fi done echo "Checking HamPack application versions..." check_binaries check_compiled echo "" echo "Done."