#!/bin/bash # check-versions.sh — Compare pinned versions in Dockerfile against latest releases # Run before tagging a release to see what can be bumped. set -euo pipefail BOLD="\033[1m"; DIM="\033[2m"; GREEN="\033[32m"; YELLOW="\033[33m"; RESET="\033[0m" DOCKERFILE="${1:-Dockerfile}" if [[ ! -f "$DOCKERFILE" ]]; then echo "Usage: $0 [Dockerfile]" exit 1 fi get_pinned() { grep "^ARG $1=" "$DOCKERFILE" | head -1 | cut -d= -f2 } get_latest_github() { local repo="$1" local tag tag=$(curl -s "https://api.github.com/repos/${repo}/releases/latest" | jq -r '.tag_name // empty') # Strip leading 'v' if present echo "${tag#v}" } get_latest_go() { curl -s "https://go.dev/dl/?mode=json" | jq -r '.[0].version' | sed 's/^go//' } get_latest_npm() { npm view "$1" version 2>/dev/null } check() { local name="$1" current="$2" latest="$3" if [[ -z "$latest" ]]; then printf " ${DIM}%-20s %-12s (could not check)${RESET}\n" "$name" "$current" elif [[ "$current" == "$latest" ]]; then printf " ${GREEN}%-20s %-12s ✓ up to date${RESET}\n" "$name" "$current" else printf " ${YELLOW}${BOLD}%-20s %-12s → %s available${RESET}\n" "$name" "$current" "$latest" fi } echo "" echo -e "${BOLD}Version check for $DOCKERFILE${RESET}" echo "" # GitHub-sourced binaries check "opencode" "$(get_pinned OPENCODE_VERSION)" "$(get_latest_npm opencode-ai)" check "gosu" "$(get_pinned GOSU_VERSION)" "$(get_latest_github tianon/gosu)" check "fzf" "$(get_pinned FZF_VERSION)" "$(get_latest_github junegunn/fzf)" check "git-lfs" "$(get_pinned GIT_LFS_VERSION)" "$(get_latest_github git-lfs/git-lfs)" check "neovim" "$(get_pinned NVIM_VERSION)" "$(get_latest_github neovim/neovim)" check "bat" "$(get_pinned BAT_VERSION)" "$(get_latest_github sharkdp/bat)" check "eza" "$(get_pinned EZA_VERSION)" "$(get_latest_github eza-community/eza)" check "zoxide" "$(get_pinned ZOXIDE_VERSION)" "$(get_latest_github ajeetdsouza/zoxide)" check "uv" "$(get_pinned UV_VERSION)" "$(get_latest_github astral-sh/uv)" check "Go (opt)" "$(get_pinned GO_VERSION)" "$(get_latest_go)" echo "" echo -e "${DIM}Node.js uses major version ($(get_pinned NODE_VERSION)) — auto-updates via nodesource.${RESET}" echo -e "${DIM}rustup-init uses latest from static.rust-lang.org — no pinned version.${RESET}" echo -e "${DIM}Debian apt packages update on each build via apt-get update.${RESET}" echo ""