測試沙盒傳錯參數時,會把整個 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:
@@ -379,6 +379,46 @@ bash hooks/tests/history-first-guard.test.sh
|
||||
- ④ 紅 ⇒ 逃生門又是假的(這是本支唯一分辨得出新舊版的那一格,見檔頭)
|
||||
- ⑦ 紅 ⇒ 逃生門變成永久後門(一次 `touch` 就免疫,過期不算數這件事沒了)
|
||||
- ⑧⑨⑩ 任一紅 ⇒ **誤攔**:文件/新檔/測試檔本來就不該被這支碰
|
||||
|
||||
### A30 — 測試沙盒傳錯參數時要在**複製之前**收手:10 條
|
||||
```
|
||||
bash hooks/tests/hook-sandbox.test.sh
|
||||
```
|
||||
**該看到**:`通過 10 條,失敗 0 條`。全離線。
|
||||
|
||||
**它在守什麼**(`inkstone/ISEP#122`,2026-09-02 實撞,**兩次**):
|
||||
`hooks/tests/lib/hook-sandbox.sh` 的 `hook_sandbox <hook 的檔案路徑>` 舊版**不驗參數**,
|
||||
直接 `cp -R "$(dirname "$1")"`。順手把 repo 根目錄傳進去時:
|
||||
|
||||
```
|
||||
$ bash hooks/tests/main-and-prod-push-guard.test.sh "$PWD"
|
||||
dirname → ~/Documents/tech_projects ← 上一層,不是 hooks/
|
||||
cp -R → 整個 tech_projects(所有 repo、所有 worktree)搬進 mktemp
|
||||
實測 一次 13 GB+一次 10 GB,磁碟可用從 25 GB 掉到 462 MB
|
||||
印出來的 ❌ 沙盒建不起來 ← 只有這一句
|
||||
```
|
||||
|
||||
🔴 **它沒說參數傳錯,也沒說它已經把磁碟寫滿了。**
|
||||
判準用「要求某個東西在場」(`$1` 要是真的檔案;上一層要叫 `hooks`),
|
||||
不是關鍵字比對——兩條任一不成立就在 `mktemp` 之前 `return 1`。
|
||||
|
||||
📌 **正確用法**(兩支需要傳參數的測試,`docs/TESTING.md` 之前沒寫過):
|
||||
```
|
||||
bash hooks/tests/main-and-prod-push-guard.test.sh hooks/main-and-prod-push-guard.sh
|
||||
bash hooks/tests/main-and-prod-push-guard-cross-repo.test.sh hooks/main-and-prod-push-guard.sh
|
||||
bash hooks/tests/prod-write-guard.test.sh hooks/prod-write-guard.sh
|
||||
bash hooks/tests/stage-before-prod-guard.test.sh hooks/stage-before-prod-guard.sh
|
||||
bash hooks/tests/gitea-arm-check.test.sh .
|
||||
```
|
||||
**不傳的後果不是報錯,是假綠**:`prod-write-guard.test.sh` 的 `HOOK="$1"` 空掉時
|
||||
每一條都執行空指令回 0 ⇒ 「該擋」全部變成「實得 pass」,**19 條假紅**
|
||||
(同一支傳對參數是 `通過 37 / 失敗 0`)。不必自己傳參數的包裝在
|
||||
`scripts/test-main-and-prod-push-guard.sh`。
|
||||
|
||||
**失敗**:
|
||||
- ①③⑤⑥ 任一紅 ⇒ 收手收得太晚,暫存區已經開始長東西(磁碟風險回來了)
|
||||
- ② 紅 ⇒ 訊息沒給出走得通的那一行(本票整張票在講的就是這件事)
|
||||
- ⑧⑨⑩ 任一紅 ⇒ **誤攔/複製錯**:正常用法被弄壞,或複本裡混進了 `hooks/` 以外的東西
|
||||
### A19 — 下游做完時頂層跟著關:49 條
|
||||
```
|
||||
bash scripts/test-ticket-handoff-writeback.sh
|
||||
|
||||
Reference in New Issue
Block a user