fix(version-guard): 依 CLI 分離遠端版本快取

This commit is contained in:
2026-08-28 09:30:12 +08:00
parent 852d8553b4
commit f6335180fa
2 changed files with 45 additions and 9 deletions
+27 -6
View File
@@ -33,8 +33,9 @@
#
# 逃生門:JSC_VERSION_GUARD=off 完全略過檢查(離線工作時用)。
#
# 快取:$JSC_HOME/version-cache/{domain},單行「{版本} {epoch}」,
# 預設 600 秒內不重查(JSC_VERSION_TTL 可調)。hook 與 report 共用同一份。
# 快取:$JSC_HOME/version-cache/{CLI 代號}/{domain},單行「{版本} {epoch}」,
# 預設 600 秒內不重查(JSC_VERSION_TTL 可調)。hook 與 report 在同一支 CLI 內共用。
# 舊路徑 $JSC_HOME/version-cache/{domain} 會在第一次讀取時複製到當前 CLI 的新路徑。
#
# 另有一個非 hook 的子指令:
# version-guard.sh report 把每個已安裝 jsc-* plugin 的版本比對印成 TSV,每行
@@ -106,13 +107,33 @@ remote_version() { # $1=domain $2=host $3=owner
}
TTL="${JSC_VERSION_TTL:-600}"
cache_dir="$JSC_HOME/version-cache"
cache_root="$JSC_HOME/version-cache"
cache_cli() {
_cli=$(cli_name | sed 's/[^A-Za-z0-9._-]/_/g')
[ -n "$_cli" ] || _cli=unknown
printf '%s' "$_cli"
}
cache_file() { # $1=domain
printf '%s/%s/%s' "$cache_root" "$(cache_cli)" "$1"
}
legacy_cache_file() { # $1=domain
printf '%s/%s' "$cache_root" "$1"
}
# 帶快取的遠端版本查詢。hook 與 report 共用同一份快取與同一個 TTL:
# report 每個 domain 各打一次網路(還帶重試),/jsc-cli:deploy 一跑就是全部 domain,
# 不共用快取等於每次部署都付一輪網路成本。
# 不共用快取等於每次部署都付一輪網路成本。同主機的不同 CLI 不共用快取,避免其中一支
# 讀到另一支留下的檢查紀錄。
cached_remote_version() { # $1=domain $2=host $3=owner
_cache="$cache_dir/$1"
_cache=$(cache_file "$1")
_legacy=$(legacy_cache_file "$1")
if [ ! -f "$_cache" ] && [ -f "$_legacy" ]; then
mkdir -p "${_cache%/*}" 2>/dev/null || true
cat "$_legacy" > "$_cache" 2>/dev/null || true
fi
_now=$(now_epoch)
if [ -f "$_cache" ]; then
_cv=$(cut -d' ' -f1 "$_cache" 2>/dev/null)
@@ -123,7 +144,7 @@ cached_remote_version() { # $1=domain $2=host $3=owner
fi
_rv=$(remote_version "$1" "$2" "$3")
if [ -n "$_rv" ]; then
mkdir -p "$cache_dir" 2>/dev/null || true
mkdir -p "${_cache%/*}" 2>/dev/null || true
printf '%s %s\n' "$_rv" "$_now" > "$_cache" 2>/dev/null || true
fi
printf '%s' "$_rv"