併進 main(v0.12.0)並接上「主線唯一答案」(inkstone/ISEP#83)
衝突只有 docs/TESTING.md 一處,兩邊都留: main 的 A16(gate-ok)/A17(未推警察)/A18(信標)原樣保留, 我那節改編號成 A19——main 上 A16、A17 已經被 #90 與 #99 各佔一次,不動別人的。 接上 inkstone/ISEP#82 帶進來的 hooks/lib/mainline.py(不自己養第二套判斷): · 有標主線 ⇒ 只排除「屬於主線那一條」的票;掛在**別條** milestone 的仍算債 (那條線現在沒有人在推,正是它躺著的原因) · 沒標主線 ⇒ 退回保守做法:掛 open milestone 的一律不領,並在清單上照實說沒標 · 別條 milestone 已逾期 ⇒ +15「答應過人家的日期已經過了」 測試 40 → 47 條(+7 條全給主線這段),並把 ISEP_COUNTDOWN_STATE_DIR 也隔離: 不然這支測試的結果會取決於「這台機器現在標了哪條主線」。 盤點數字在合併後的樹上重數: hooks/*.sh = 54、hooks.json "command": = 71(本 PR 沒新增 hook,兩個都沒變) scripts 一層檔案 = 39(本 PR +2)⇒ plugin.json description 37→39 版本號沒動(0.12.0,總管統一定版)
This commit is contained in:
@@ -19,8 +19,21 @@ ok(){ # $1=條件 $2=說明
|
||||
}
|
||||
|
||||
run(){ # 跑 list(或任何子命令),輸出留在 $OUT,離開碼留在 $RC
|
||||
# 🔴 ISEP_COUNTDOWN_STATE_DIR 也要指到暫存目錄:主線(hooks/lib/mainline.py)住在那裡,
|
||||
# 不隔離的話這支測試的結果會取決於「這台機器現在標了哪條主線」——那就不是測試了。
|
||||
OUT=$(ISEP_DEBT_FIXTURE="$FX" ISEP_DEBT_STATE_DIR="$T/state" ISEP_DEBT_NOW="$NOW" \
|
||||
python3 "$W" "$@" 2>&1); RC=$?
|
||||
ISEP_COUNTDOWN_STATE_DIR="$ML_DIR" python3 "$W" "$@" 2>&1); RC=$?
|
||||
}
|
||||
|
||||
ML_DIR="$T/mainline"; mkdir -p "$ML_DIR"
|
||||
set_mainline(){ # $1=主線 milestone 標題(空=沒有主線)
|
||||
if [ -z "$1" ]; then rm -f "$ML_DIR/mainline.json"; return; fi
|
||||
python3 - "$ML_DIR/mainline.json" "$1" <<'PY'
|
||||
import json, sys
|
||||
path, title = sys.argv[1], sys.argv[2]
|
||||
json.dump({"ref": "inkstone/A#1", "owner": "inkstone", "repo": "A", "id": 1,
|
||||
"title": title, "members": [], "due_on": ""}, open(path, "w"))
|
||||
PY
|
||||
}
|
||||
|
||||
# ── 造資料:一份長得像 Gitea 回應的 fixture ─────────────────────────────────
|
||||
@@ -38,6 +51,8 @@ def it(repo, n, title, labels=(), ms=None, ms_state="open", assignees=(),
|
||||
"html_url": f"https://git.uncle6.me/{repo}/issues/{n}"}
|
||||
if ms:
|
||||
d["milestone"] = {"title": ms, "state": ms_state}
|
||||
if ms == "上個 sprint":
|
||||
d["milestone"]["due_on"] = "2026-08-10T23:59:59Z" # 已經過了 18 天
|
||||
if pr:
|
||||
d["pull_request"] = {"merged": False}
|
||||
return d
|
||||
@@ -57,6 +72,8 @@ if which == "full":
|
||||
body="要先解 inkstone/A#1" + "y" * 2000),
|
||||
# 掛在 open milestone 上=緊急線在管,不該出現
|
||||
it("inkstone/A", 3, "緊急線的票", ["p/high", "type/bug"], ms="這週出貨"),
|
||||
# 掛在**別條**(非主線)milestone 上,而且期限已經過了
|
||||
it("inkstone/A", 8, "別條線的票", ms="上個 sprint", body="q" * 2000),
|
||||
# milestone 已關但票還開著=孤兒,該出現
|
||||
it("inkstone/A", 4, "孤兒票", ms="上週", ms_state="closed", body="z" * 2000),
|
||||
# 等 leo 的三種,都不該出現在可領清單
|
||||
@@ -125,6 +142,20 @@ ok 'grep -A6 "inkstone/B#30(票)" <<<"$OUT" | grep -q "inkstone/B#31"' '原
|
||||
ok '! (grep -A6 "inkstone/A#1(票)" <<<"$OUT" | grep -q "同一包")' \
|
||||
'單向引用不成包(A#2、B#9 都指著 A#1,但 A#1 沒指回來 ⇒ 不能黏成一坨)'
|
||||
|
||||
echo "── 接上「現在的主線是哪一個」(inkstone/ISEP#82 的唯一答案)──"
|
||||
set_mainline ""; FX="$FULL"; run list --top 20
|
||||
ok 'grep -q "現在沒有標主線" <<<"$OUT"' '沒標主線 ⇒ 照實說,不編一條出來'
|
||||
ok '! grep -q "inkstone/A#3" <<<"$OUT" && ! grep -q "inkstone/A#8" <<<"$OUT"' \
|
||||
'沒標主線 ⇒ 保守:掛 open milestone 的一律不領(不跟緊急線搶同一張)'
|
||||
set_mainline "這週出貨"; run list --top 20
|
||||
ok 'grep -q "現在的主線" <<<"$OUT" && grep -q "這週出貨" <<<"$OUT"' \
|
||||
'標了主線 ⇒ 清單上講得出用的是哪一條(判斷來自 scripts/mainline,不是自己算的)'
|
||||
ok '! grep -q "inkstone/A#3" <<<"$OUT"' '在主線上的票仍然不領(那是緊急線在管的)'
|
||||
ok 'grep -q "inkstone/A#8" <<<"$OUT"' '掛在別條 milestone 的是債(那條線現在沒人推)'
|
||||
ok 'grep -q "逾期17天的承諾+15" <<<"$OUT"' '別條 milestone 已逾期 ⇒ 算「答應過人家的」加分'
|
||||
ok 'grep -q "別條\*\* milestone 上的 1 張仍算債" <<<"$OUT"' '被改判成債的有幾張,講出來'
|
||||
set_mainline "" # 收回去,後面幾組回到「沒有主線」的世界
|
||||
|
||||
echo "── 驗收 2:清單是空的要說話,不能默默結束 ──"
|
||||
FX="$T/empty.json"; run list
|
||||
ok '[ "$RC" = 0 ]' '離開碼 0(沒東西可領不是錯誤)'
|
||||
|
||||
Reference in New Issue
Block a user