#!/usr/bin/env sh # latest-version.sh — 查詢套件最新且穩定的版本號。 # 用法:latest-version.sh # ecosystem:nodejs | python | dotnet # 輸出:版本號一行。 # 結束碼(慣例見 README「工具」章的結束碼總表): # 0 查到版本號 # 1 參數個數不對 # 2 ecosystem 不認識 # 4 登錄站上查不到這個套件——呼叫方跳過這個套件 # 5 需要的指令不存在(curl、python3) # 本工具不收專案目錄,所以沒有 6。 set -u if [ "$#" -ne 2 ]; then echo "用法:latest-version.sh " >&2 exit 1 fi eco="$1" name="$2" # 回應靠 curl 取得、靠 python3 解析。少了任一支會解出空字串,被誤判成查不到套件,所以先擋。 for c in curl python3; do command -v "$c" >/dev/null 2>&1 || { echo "$c not found" >&2; exit 5; } done case "$eco" in nodejs) v=$(curl -sSf "https://registry.npmjs.org/$name/latest" 2>/dev/null \ | python3 2>/dev/null -c 'import json,sys;print(json.load(sys.stdin).get("version",""))') ;; python) v=$(curl -sSf "https://pypi.org/pypi/$name/json" 2>/dev/null \ | python3 2>/dev/null -c 'import json,sys;print(json.load(sys.stdin)["info"]["version"])') ;; dotnet) lname=$(printf '%s' "$name" | tr '[:upper:]' '[:lower:]') v=$(curl -sSf "https://api.nuget.org/v3-flatcontainer/$lname/index.json" 2>/dev/null \ | python3 2>/dev/null -c ' import json,sys,re vs=json.load(sys.stdin).get("versions",[]) stable=[x for x in vs if re.match(r"^[0-9]+(\.[0-9]+)*$",x)] print((stable or vs)[-1] if (stable or vs) else "")') ;; *) echo "unknown ecosystem: $eco" >&2; exit 2 ;; esac [ -n "${v:-}" ] || { echo "not found: $eco/$name" >&2; exit 4; } printf '%s\n' "$v"