adopt 的冪等改靠「先讀 /dependencies」:真 Gitea 對重複相依回 500 不是 409(inkstone/ISEP#133)
真 Gitea 實跑(hub=InkStoneCo#44、子票=ISEP#133):第一次 POST 成功、/blocks 回 #44、 清空快取後 has 靠 /blocks 判「在」;第二次 POST 回 500——假伺服器原本猜 409,adopt 第二次會炸。 add_dependency() 改成先讀 parent 的 /dependencies,邊在就不 POST(判準是 Gitea 的事實,不是回應碼); 假伺服器改照真的回 500;A41 56→57 條。測完 DELETE 復原(201,/blocks 空)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
#
|
||||
# 用法:bash hooks/tests/mainline-members-by-dependency.test.sh
|
||||
# 🔴 全程離線:Gitea 是本機一個假伺服器(TICKET_HOST 指過去),它照真 Gitea 回:相依 POST 201、
|
||||
# 已存在 409、issue 列表用 `milestones=` 名字查。狀態走 ISEP_COUNTDOWN_STATE_DIR、repo 那份走
|
||||
# 已存在 **500**(2026-09-07 實測,不是 409)、issue 列表用 `milestones=` 名字查。狀態走 ISEP_COUNTDOWN_STATE_DIR、repo 那份走
|
||||
# TMP 底下的假薄殼、HOME 也指到 TMP。不碰真家目錄、不碰真 Gitea、不碰真 InkStoneCo。
|
||||
set -u
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
@@ -105,7 +105,7 @@ class H(BaseHTTPRequestHandler):
|
||||
m = re.match(r"^/api/v1/repos/([^/]+)/([^/]+)/issues/(\d+)/dependencies$", p)
|
||||
if m:
|
||||
parent = "%s/%s#%s" % m.groups(); child = "%s/%s#%s" % (body["owner"], body["repo"], body["index"])
|
||||
if child in w["deps"].get(parent, []): return self._send(409, {"message": "dependency already exists"})
|
||||
if child in w["deps"].get(parent, []): return self._send(500, {"message": "", "url": "…/api/swagger"}) # 真 Gitea 2026-09-07 實測:重複相依回 500,不是 409
|
||||
w["deps"].setdefault(parent, []).append(child); save(w)
|
||||
return self._send(201, issue_obj(w, parent))
|
||||
if re.match(r"^/api/v1/repos/([^/]+)/([^/]+)/milestones$", p):
|
||||
@@ -209,7 +209,8 @@ M=$(members)
|
||||
case "$M" in *"inkstone/ISEP#130"*"inkstone/ISEP#140"*) ok "⑱ 成員多了 ISEP#130,**還有它的相依 ISEP#140**(邊會一路走下去)" ;; *) no "⑱ 成員沒更新到 #130/#140" "$M" ;; esac
|
||||
case "$OUT" in *"沒有多出任何里程碑"*) ok "⑲ 訊息明講那個 repo 沒有多出里程碑" ;; *) no "⑲ 訊息沒講" "$OUT" ;; esac
|
||||
OUT=$(ml adopt inkstone/ISEP#130 --via inkstone/Arcrun#86); RC=$?
|
||||
[ "$RC" = 0 ] && ok "⑳ 同一張再 adopt 一次(Gitea 回 409)⇒ 仍是離開碼 0(冪等,不炸)" || no "⑳ 重複 adopt 炸了" "$OUT"
|
||||
[ "$RC" = 0 ] && ok "⑳ 同一張再 adopt 一次 ⇒ 仍是離開碼 0(冪等:先讀 /dependencies,邊在就不 POST;真 Gitea 對重複 POST 回 500)" || no "⑳ 重複 adopt 炸了" "$OUT"
|
||||
grep -c '^POST /api/v1/repos/inkstone/Arcrun/issues/86/dependencies' "$TMP/log" | grep -qx 1 && ok "⑳′ 第二次沒有再 POST(判準是 Gitea 有沒有這條邊,不是回應碼)" || no "⑳′ 重複 POST 了" "$(grep POST "$TMP/log")"
|
||||
: > "$TMP/log"
|
||||
OUT=$(ml adopt inkstone/arcrun-rag#37); RC=$?
|
||||
[ "$RC" = 0 ] && grep -q '^POST /api/v1/repos/inkstone/InkStoneCo/issues/44/dependencies' "$TMP/log" \
|
||||
|
||||
Reference in New Issue
Block a user