#!/bin/bash # # Purpose: Check for available version updates in binaries.conf and compile.conf SCRIPT_DIR=$(dirname "$(realpath "$0")") HAMPACK_DIR="${HAMPACK_DIR:-$SCRIPT_DIR}" 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//' } # Latest release tag in a git repo, stripping leading "v". Only plain version # tags count (1.2.3 or v1.2.3), not pre-releases like 1.8-beta1. git_latest_tag() { local url="$1" git ls-remote --tags --refs "$url" 2>/dev/null \ | sed 's|.*refs/tags/||' \ | grep -E '^v?[0-9]+(\.[0-9]+)+$' \ | sed 's/^v//' \ | sort -V \ | tail -n1 } print_result() { local app="$1" local pinned="$2" local latest="$3" local manual_url="$4" local source="${5:-GitHub API}" 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 (%s unavailable)\n" "$app" "$pinned" "$source" 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" "" } # compile.conf builds git= apps from the tag matching their version, so compare # against the repo's tags rather than GitHub releases check_compiled_app() { local app="$1" local version="$2" local git_url="$3" local wget_url="$4" [ -z "$app" ] || [ -z "$version" ] && return if [ -n "$git_url" ]; then print_result "$app" "$version" "$(git_latest_tag "$git_url")" "" "version tags" else check_app "$app" "$version" "" "$wget_url" fi } check_compiled() { echo "" echo "=== compile.conf ===" local app="" name="" version="" git_url="" wget_url="" while IFS= read -r line || [ -n "$line" ]; do [[ -z "$line" || "$line" == \#* ]] && continue if [[ "$line" =~ ^\[(.+)\]$ ]]; then check_compiled_app "${name:-$app}" "$version" "$git_url" "$wget_url" app="${BASH_REMATCH[1]}" name="" version="" git_url="" wget_url="" continue fi local key="${line%%=*}" value="${line#*=}" case "$key" in name) name="$value" ;; version) version="$value" ;; git) git_url="$value" ;; wget) wget_url="$value" ;; esac done < "$COMPILE_CONF" check_compiled_app "${name:-$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."