修正 pr-watch 在 PR 合併後推導錯工作樹路徑 #50

Closed
opened 2026-09-17 09:15:02 +00:00 by jiantw83 · 0 comments
Member

母議題

#38 — 以 worktree 隔離平行工作包的實作與修正

要做出什麼

pr-watch 在 PR 合併之後推導出錯的工作樹路徑,於是該清的那一棵永遠不會被清掉,
而且它回報 nothing-to-do——靜靜地什麼都沒做,使用者不會知道。

自動清理只在 PR 合併或關閉時發生,所以這個 bug 的效果是自動清理在真實情況下從來不會
成立
:唯一該動手的時機,正好是推導失效的時機。

原因:Gitea 在 PR 合併(且來源分支被刪)之後,head.ref 會從分支名變成
refs/pull/{編號}/head,分支名退到 head.label。pr-watch 用的是 head.ref,
PR 開著時正確,合併後就錯。

實測(#48,合併後):

"branch":"refs/pull/48/head"
"工作樹":{"路徑":".../bb4f5127f641","存在":false}   ← 實際上在 .../bd457620184e
"terminal":true,"cleaned":false,"suggestedAction":"nothing-to-do"

API 的對照:

PR 狀態 head.ref head.label
#48 已合併、來源分支已刪 refs/pull/48/head feat/pr-watch-and-cleanup/main
#46 已合併、來源分支已刪 refs/pull/46/head feat/worktree-branch-prep/main

改用 head.label 取分支名。fork 來的 PR 那一欄是 owner:branch,要取冒號後那一段。

worktree-remove 不受影響:它吃 --branch,不做推導。

測試沒抓到,是因為假的 PR 一律照「開著的 PR」寫,head.ref 永遠是分支名——
這次要補的正是「已合併且來源分支已刪」那一種。

驗收標準

  • PR 已合併且來源分支已刪時,pr-watch 仍推導出正確的工作樹路徑並清掉它
  • 分支名取自 head.label;fork 來的 owner:branch 只取冒號後那一段
  • head.ref 為 refs/pull/{編號}/head 時不拿它當分支名
  • 兩者都取不到分支名時明確中止(PULL_HEAD_MISSING),不拿空字串去推導路徑
  • 測試覆蓋「已合併且來源分支已刪」的 PR,並驗證工作樹真的被移除
  • 既有的四種狀態對照表測試仍然通過

阻擋於

  • #41 — 以 pr-watch 回報 PR 現況並清理工作樹(已合併)
## 母議題 #38 — 以 worktree 隔離平行工作包的實作與修正 ## 要做出什麼 `pr-watch` 在 PR 合併之後推導出錯的工作樹路徑,於是該清的那一棵永遠不會被清掉, 而且它回報 `nothing-to-do`——靜靜地什麼都沒做,使用者不會知道。 自動清理只在 PR 合併或關閉時發生,所以這個 bug 的效果是**自動清理在真實情況下從來不會 成立**:唯一該動手的時機,正好是推導失效的時機。 原因:Gitea 在 PR 合併(且來源分支被刪)之後,`head.ref` 會從分支名變成 `refs/pull/{編號}/head`,分支名退到 `head.label`。`pr-watch` 用的是 `head.ref`, PR 開著時正確,合併後就錯。 實測(#48,合併後): "branch":"refs/pull/48/head" "工作樹":{"路徑":".../bb4f5127f641","存在":false} ← 實際上在 .../bd457620184e "terminal":true,"cleaned":false,"suggestedAction":"nothing-to-do" API 的對照: | PR | 狀態 | `head.ref` | `head.label` | | --- | --- | --- | --- | | #48 | 已合併、來源分支已刪 | `refs/pull/48/head` | `feat/pr-watch-and-cleanup/main` | | #46 | 已合併、來源分支已刪 | `refs/pull/46/head` | `feat/worktree-branch-prep/main` | 改用 `head.label` 取分支名。fork 來的 PR 那一欄是 `owner:branch`,要取冒號後那一段。 `worktree-remove` 不受影響:它吃 `--branch`,不做推導。 測試沒抓到,是因為假的 PR 一律照「開著的 PR」寫,`head.ref` 永遠是分支名—— 這次要補的正是「已合併且來源分支已刪」那一種。 ## 驗收標準 - [x] PR 已合併且來源分支已刪時,`pr-watch` 仍推導出正確的工作樹路徑並清掉它 - [x] 分支名取自 `head.label`;fork 來的 `owner:branch` 只取冒號後那一段 - [x] `head.ref` 為 `refs/pull/{編號}/head` 時不拿它當分支名 - [x] 兩者都取不到分支名時明確中止(`PULL_HEAD_MISSING`),不拿空字串去推導路徑 - [x] 測試覆蓋「已合併且來源分支已刪」的 PR,並驗證工作樹真的被移除 - [x] 既有的四種狀態對照表測試仍然通過 ## 阻擋於 - #41 — 以 pr-watch 回報 PR 現況並清理工作樹(已合併)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: plugins/tea-sdlc#50