fix(hooks): 重啟閘門狀態檔改為一支 CLI 一份,修並行覆寫與全域解除 #37
+45
-25
@@ -14,8 +14,9 @@
|
|||||||
# 跑起來不出錯(缺 node、路徑錯、權限不足都只在真的執行時才現形)。
|
# 跑起來不出錯(缺 node、路徑錯、權限不足都只在真的執行時才現形)。
|
||||||
# 有分支的判定另外驗結果,不只驗跑得完:sdlc-gate.sh 的工作包歸屬比對會自備一份暫時的
|
# 有分支的判定另外驗結果,不只驗跑得完:sdlc-gate.sh 的工作包歸屬比對會自備一份暫時的
|
||||||
# $JSC_HOME 狀態檔,把「查無歸屬」「自己的工作包」「別的工作包」與逃生門各跑一次,比對結束碼。
|
# $JSC_HOME 狀態檔,把「查無歸屬」「自己的工作包」「別的工作包」與逃生門各跑一次,比對結束碼。
|
||||||
# restart-gate.sh 的部署後重啟閘門同法:狀態檔不存在、狀態檔存在、豁免技能、逃生門、
|
# restart-gate.sh 的部署後重啟閘門同法:當前 CLI 沒有狀態檔、只有別支 CLI 有狀態檔、當前
|
||||||
# 取不到技能名五條路徑各跑一次,再驗一次清除機制真的清得掉。
|
# CLI 那份存在、豁免技能、逃生門、取不到技能名各跑一次,再驗狀態檔本身在不在——清除只刪自己
|
||||||
|
# 那一份、別支那一份留著、舊格式的單一狀態檔照樣擋得下來且清得掉。
|
||||||
#
|
#
|
||||||
# 接線行為(依 CLI 而定,皆為冪等:重跑只取代既有的 jsc-hooks 標記段落,不會重複疊加):
|
# 接線行為(依 CLI 而定,皆為冪等:重跑只取代既有的 jsc-hooks 標記段落,不會重複疊加):
|
||||||
# claude — 什麼都不用寫,hooks.json 已自動接線八支 hook
|
# claude — 什麼都不用寫,hooks.json 已自動接線八支 hook
|
||||||
@@ -709,9 +710,10 @@ if [ "$action" = smoke ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# 部署後重啟閘門(restart-gate.sh):上面那支只走得到「狀態檔不存在」與「取不到技能名」,
|
# 部署後重啟閘門(restart-gate.sh):上面那支只走得到「狀態檔不存在」與「取不到技能名」,
|
||||||
# 擋人那一條完全沒跑到。這裡同樣自備一份暫時的 $JSC_HOME,把五條判定路徑各跑一次並比對
|
# 擋人那一條完全沒跑到。這裡同樣自備一份暫時的 $JSC_HOME,把每條判定路徑各跑一次並比對
|
||||||
# 結束碼,最後再驗清除機制真的把狀態檔清掉。用暫時目錄是為了不動到使用者真正的
|
# 結束碼,另外驗三件狀態檔設計本身的事:別支 CLI 那一份不影響這一支、清除只刪自己那一份、
|
||||||
# $JSC_HOME/restart-required——冒煙測試不該把別人的閘門拆掉。
|
# 舊格式的單一狀態檔照樣擋得下來。用暫時目錄是為了不動到使用者真正的
|
||||||
|
# $JSC_HOME/restart-required.d/——冒煙測試不該把別人的閘門拆掉。
|
||||||
# 一律 </dev/null:hook 模式會讀標準輸入,管線沒人關閉時整支卡死。
|
# 一律 </dev/null:hook 模式會讀標準輸入,管線沒人關閉時整支卡死。
|
||||||
smoke_rs_case() { # $1=情境 $2=技能名 $3=預期結束碼 $4=JSC_RESTART_GATE 值(可省略)
|
smoke_rs_case() { # $1=情境 $2=技能名 $3=預期結束碼 $4=JSC_RESTART_GATE 值(可省略)
|
||||||
_out=$(JSC_HOME="$rs_home" JSC_CLI="$cli" JSC_SKILL="$2" SKILL="$2" \
|
_out=$(JSC_HOME="$rs_home" JSC_CLI="$cli" JSC_SKILL="$2" SKILL="$2" \
|
||||||
@@ -724,31 +726,49 @@ if [ "$action" = smoke ]; then
|
|||||||
"$1" "$_rc" "$3" "$(printf '%s' "$_out" | tr '\n' ' ' | cut -c1-200)" >> "$smoke_out"
|
"$1" "$_rc" "$3" "$(printf '%s' "$_out" | tr '\n' ' ' | cut -c1-200)" >> "$smoke_out"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
# 狀態檔在不在也要比:一支 CLI 一份的重點就在「該留的留、該刪的刪」,只看結束碼看不出來。
|
||||||
|
smoke_rs_file() { # $1=情境 $2=狀態檔 $3=exist 或 absent
|
||||||
|
if { [ "$3" = exist ] && [ -f "$2" ]; } || { [ "$3" = absent ] && [ ! -f "$2" ]; }; then
|
||||||
|
printf '[jsc] restart-gate.sh(%s):狀態檔 %s,與預期相同。\n' "$1" "$3" >> "$smoke_out"
|
||||||
|
else
|
||||||
|
smoke_fails=$((smoke_fails + 1))
|
||||||
|
printf '[jsc] restart-gate.sh(%s):狀態檔預期 %s,實際不是,一支 CLI 一份的範圍壞了:%s\n' \
|
||||||
|
"$1" "$3" "$2" >> "$smoke_out"
|
||||||
|
fi
|
||||||
|
}
|
||||||
if rs_home=$(mktemp -d 2>/dev/null); then
|
if rs_home=$(mktemp -d 2>/dev/null); then
|
||||||
smoke_rs_case "狀態檔不存在" jsc-sdlc:implement 0
|
rs_dir="$rs_home/restart-required.d"
|
||||||
JSC_HOME="$rs_home" sh "$HOOKS/restart-gate.sh" require update hooks cli </dev/null 2>/dev/null
|
# 別支 CLI 的代號。取一個不在五支之列的固定值,才不會跟這一輪的 $cli 撞在一起。
|
||||||
smoke_rs_case "狀態檔存在,技能 jsc-sdlc:implement" jsc-sdlc:implement 2
|
rs_other=smoke-other
|
||||||
smoke_rs_case "狀態檔存在,豁免技能 jsc-cli:deploy" jsc-cli:deploy 0
|
smoke_rs_case "當前 CLI 沒有狀態檔" jsc-sdlc:implement 0
|
||||||
smoke_rs_case "狀態檔存在,豁免技能 jsc-gitea:wiki" jsc-gitea:wiki 0
|
JSC_HOME="$rs_home" JSC_CLI="$rs_other" \
|
||||||
smoke_rs_case "狀態檔存在,豁免技能 jsc-log:worklog" jsc-log:worklog 0
|
sh "$HOOKS/restart-gate.sh" require update hooks </dev/null 2>/dev/null
|
||||||
smoke_rs_case "狀態檔存在,豁免技能 jsc-meta:skill-check" jsc-meta:skill-check 0
|
smoke_rs_case "只有別支 CLI 有狀態檔" jsc-sdlc:implement 0
|
||||||
|
JSC_HOME="$rs_home" JSC_CLI="$cli" \
|
||||||
|
sh "$HOOKS/restart-gate.sh" require update hooks cli </dev/null 2>/dev/null
|
||||||
|
smoke_rs_file "require 寫出當前 CLI 那一份" "$rs_dir/$cli" exist
|
||||||
|
smoke_rs_case "當前 CLI 那份存在,技能 jsc-sdlc:implement" jsc-sdlc:implement 2
|
||||||
|
smoke_rs_case "當前 CLI 那份存在,豁免技能 jsc-cli:deploy" jsc-cli:deploy 0
|
||||||
|
smoke_rs_case "當前 CLI 那份存在,豁免技能 jsc-gitea:wiki" jsc-gitea:wiki 0
|
||||||
|
smoke_rs_case "當前 CLI 那份存在,豁免技能 jsc-log:worklog" jsc-log:worklog 0
|
||||||
|
smoke_rs_case "當前 CLI 那份存在,豁免技能 jsc-meta:skill-check" jsc-meta:skill-check 0
|
||||||
smoke_rs_case "逃生門 JSC_RESTART_GATE=off" jsc-sdlc:implement 0 off
|
smoke_rs_case "逃生門 JSC_RESTART_GATE=off" jsc-sdlc:implement 0 off
|
||||||
smoke_rs_case "取不到技能名" "" 0
|
smoke_rs_case "取不到技能名" "" 0
|
||||||
# 清除機制:session-timer.sh 判定為新工作階段時會呼叫 restart-gate.sh clear。
|
# 清除機制:session-timer.sh 判定為新工作階段時會呼叫 restart-gate.sh clear。
|
||||||
# 這裡走的就是那條路徑(暫時 $JSC_HOME 底下沒有起始檔,等同行程新起的第一次)。
|
# 這裡走的就是那條路徑(暫時 $JSC_HOME 底下沒有起始檔,等同行程新起的第一次)。
|
||||||
if [ -f "$rs_home/restart-required" ]; then
|
JSC_HOME="$rs_home" JSC_CLI="$cli" JSC_SESSION_ID=smoke-restart \
|
||||||
JSC_HOME="$rs_home" JSC_SESSION_ID=smoke-restart \
|
sh "$HOOKS/session-timer.sh" start </dev/null 2>/dev/null
|
||||||
sh "$HOOKS/session-timer.sh" start </dev/null 2>/dev/null
|
smoke_rs_file "新工作階段開始後清掉自己那一份" "$rs_dir/$cli" absent
|
||||||
if [ -f "$rs_home/restart-required" ]; then
|
smoke_rs_file "清除不動別支 CLI 那一份" "$rs_dir/$rs_other" exist
|
||||||
smoke_fails=$((smoke_fails + 1))
|
smoke_rs_case "清除後放行" jsc-sdlc:implement 0
|
||||||
printf '[jsc] restart-gate.sh(清除機制):新工作階段開始後狀態檔還在,閘門會一直擋。\n' >> "$smoke_out"
|
# 舊格式的單一狀態檔(過渡相容):沒有 per-CLI 資訊,所以一律擋,clear 一併刪掉。
|
||||||
else
|
printf 'at=%s\nmode=update\ndomains=hooks\ncli=%s\n' "$(now_iso)" "$rs_other" \
|
||||||
printf '[jsc] restart-gate.sh(清除機制):新工作階段開始後狀態檔已清除,與預期相同。\n' >> "$smoke_out"
|
> "$rs_home/restart-required" 2>/dev/null
|
||||||
fi
|
smoke_rs_case "舊格式單一狀態檔存在" jsc-sdlc:implement 2
|
||||||
else
|
JSC_HOME="$rs_home" JSC_CLI="$cli" JSC_SESSION_ID=smoke-restart-legacy \
|
||||||
smoke_fails=$((smoke_fails + 1))
|
sh "$HOOKS/session-timer.sh" restart </dev/null 2>/dev/null
|
||||||
printf '[jsc] restart-gate.sh(清除機制):require 沒有寫出狀態檔,清除機制沒驗到。\n' >> "$smoke_out"
|
smoke_rs_file "清除一併刪掉舊格式狀態檔" "$rs_home/restart-required" absent
|
||||||
fi
|
smoke_rs_case "舊格式狀態檔清除後放行" jsc-sdlc:implement 0
|
||||||
rm -rf "$rs_home"
|
rm -rf "$rs_home"
|
||||||
else
|
else
|
||||||
smoke_fails=$((smoke_fails + 1))
|
smoke_fails=$((smoke_fails + 1))
|
||||||
|
|||||||
Reference in New Issue
Block a user