測試沙盒傳錯參數時,會把整個 tech_projects 複製進暫存區(inkstone/ISEP#122)
本輪跑迴歸測試時實撞兩次,兩次都把這台機器的磁碟寫滿:
$ bash hooks/tests/main-and-prod-push-guard.test.sh "$PWD"
REAL="$1" 要的是「那支 hook 的檔案路徑」,我傳了 repo 根目錄
⇒ hook_sandbox 不驗參數,直接 cp -R "$(dirname "$1")"
⇒ dirname 變成 ~/Documents/tech_projects(上一層)
⇒ 整個 tech_projects(所有 repo、所有 worktree)被搬進 mktemp
實測:第一次 13 GB + 10 GB,第二次 23 GB。
磁碟可用 25 GB → 462 MB,cp 一路吐 "No space left on device"。
兩次都是我手動 rm -rf 才回來的(27 GB)。
🔴 而它印出來的只有一句「❌ 沙盒建不起來」——
沒說是參數傳錯,也沒說它已經把磁碟寫滿了。
⇒ 這跟本票在講的是同一句話:**閘/工具給的下一步,沒有人照著打過一次**,
差別只在這次壞的不是逃生門,是「它壞掉時說的話」。
改法(判準是「要求某個東西在場」,不是關鍵字比對):
① $1 要指到一個真的檔案(空字串、目錄、不存在的路徑都不算)
② 它的上一層目錄名要叫 hooks(沙盒的前提就是複製一整個 hooks/)
任一不成立 ⇒ 在 mktemp 之前 return 1,並印出走得通的那一行。
順手補上 docs/TESTING.md 之前沒寫過的一件事:**有五支測試要傳參數**,
而不傳的後果不是報錯是假綠——prod-write-guard.test.sh 的 HOOK="$1" 空掉時
每一條都執行空指令回 0 ⇒「該擋」全變成「實得 pass」,19 條假紅
(傳對參數:通過 37 / 失敗 0)。
測試:hooks/tests/hook-sandbox.test.sh 10 條(A30),通過 10 失敗 0
①③⑤⑥ 驗的是「收手在複製之前」,不是「訊息好不好看」
⑧⑨⑩ 驗正常用法沒被弄壞、複本裡沒混進 hooks/ 以外的東西
既有兩支沙盒測試複驗:
scripts/test-main-and-prod-push-guard.sh 13/13
hooks/tests/main-and-prod-push-guard.test.sh 通過 10 / 失敗 0
hooks/tests/main-and-prod-push-guard-cross-repo.test.sh 通過 19 / 失敗 0
📌 這顆跟 0.22.0 的三件事無關,是本輪路上撞到的。要拆票或丟掉這顆都行,
它獨立於前面兩顆,而且只動 hooks/tests/(沒有任何 hook 的執行行為改變)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -39,9 +39,38 @@
|
||||
# ⇒ hostsum 兩次都回 `NODIR`(相等)、沙盒的請求數當然是 0
|
||||
# ⇒ **第一條斷言變成「拿空的比空的」的假綠**。
|
||||
# 所以改成「設變數、不印」,而且 hook_sandbox_assert 開頭會擋空值(見下)。
|
||||
#
|
||||
# 🔴 **先驗參數再複製**(inkstone/ISEP#122,2026-09-02 實撞,本檔第二次修):
|
||||
# `$1` 是「那支 hook 的路徑」。傳錯(例如順手傳了 repo 根目錄)時,舊版不檢查就
|
||||
# `cp -R "$(dirname "$1")" …` ⇒ **複製的是那個目錄的上一層**。
|
||||
# 當天實測:`bash hooks/tests/main-and-prod-push-guard.test.sh "$PWD"`
|
||||
# ⇒ dirname 變成 ~/Documents/tech_projects
|
||||
# ⇒ 把 **整個 tech_projects**(所有 repo、所有 worktree)複製進 mktemp
|
||||
# ⇒ 兩次就吃掉 23 GB,磁碟從 25 GB 剩到 462 MB,`cp` 一路吐
|
||||
# `No space left on device`,最後才印一句「❌ 沙盒建不起來」。
|
||||
# ⇒ 訊息只說「建不起來」,**沒說是參數傳錯,也沒說它已經把磁碟寫滿了**。
|
||||
# 判準用「要求某個東西在場」,不是關鍵字比對:
|
||||
# ① `$1` 要指到一個**真的檔案**(傳目錄、傳空字串都不算)
|
||||
# ② 它的上一層目錄名要叫 `hooks`(沙盒的前提就是「複製一整個 hooks/」)
|
||||
# 兩條任一不成立就**在複製之前**收手,並印出走得通的那一行。
|
||||
hook_sandbox() {
|
||||
_hs_real=$1
|
||||
if [ -z "${_hs_real:-}" ] || [ ! -f "$_hs_real" ]; then
|
||||
printf '❌ hook_sandbox:第一個參數要是「那支 hook 的檔案路徑」,實得 %s\n' \
|
||||
"${_hs_real:-(空的)}" >&2
|
||||
printf ' 例:bash hooks/tests/main-and-prod-push-guard.test.sh hooks/main-and-prod-push-guard.sh\n' >&2
|
||||
printf ' (不必自己傳的版本:bash scripts/test-main-and-prod-push-guard.sh)\n' >&2
|
||||
return 1
|
||||
fi
|
||||
_hs_hooks=$(CDPATH= cd -- "$(dirname -- "$_hs_real")" && pwd) || return 1
|
||||
if [ "$(basename "$_hs_hooks")" != "hooks" ]; then
|
||||
printf '❌ hook_sandbox:%s 的上一層不是 hooks/,而沙盒要複製的就是那個目錄。\n' \
|
||||
"$_hs_real" >&2
|
||||
printf ' 算出來的來源是 %s——照複製下去會把它整個搬進暫存區(2026-09-02 這樣寫滿過磁碟)。\n' \
|
||||
"$_hs_hooks" >&2
|
||||
printf ' 例:bash hooks/tests/main-and-prod-push-guard.test.sh hooks/main-and-prod-push-guard.sh\n' >&2
|
||||
return 1
|
||||
fi
|
||||
HOOK_SANDBOX=$(mktemp -d) || return 1
|
||||
cp -R "$_hs_hooks" "$HOOK_SANDBOX/hooks" || return 1
|
||||
HOOK_SANDBOX_HOST="${_hs_hooks%/hooks}/pending-main-push"
|
||||
|
||||
Reference in New Issue
Block a user