feat: 重构被审查分支的选择逻辑

push 审查
  check_branches 现在只表示「要做 push 审查的分支」,不再兼作 PR 目标分支:
  - 勾选具体分支:这些分支的 push 会审查,通过后晋级到管理分支
  - 新增「任意分支」(*):所有分支的 push 都审查
  - 留空:只审 PR,不审 push

PR 审查
  始终覆盖「勾选的分支 + 管理分支」作为合并目标。
  管理分支是最终目标,不需要出现在检查分支里也能被保护。

管理分支从候选中移除
  分支选择器不再列出管理分支——它是终点,不需要再检查自己。

安全边界
  「任意分支」只扩大审查范围,不会把任意分支自动合并进管理分支;
  晋级仍要求分支被显式勾选(promotesToManaged)。

同时修正一处语义错误
  早先 branchMatches 把空列表当成「审所有分支」,导致新建仓库在用户
  还没选分支时就审查全部 push。现在空列表明确表示「只审 PR」。

测试:分支匹配矩阵重写,覆盖 push/PR/晋级/保护目标四类判定,共 20 项通过。
This commit is contained in:
2026-09-21 17:12:57 +08:00
parent 7cd2c85888
commit 216bb51c92
6 changed files with 209 additions and 67 deletions
+9 -3
View File
@@ -162,8 +162,8 @@ curl -fsS http://localhost:8090/api/health
| 字段 | 说明 |
| --- | --- |
| `repo_url` | 仓库 Git 地址,`owner` / `name` 由此自动解析 |
| `managed_branch` | 主管理分支。push 事件没有对应 PR 时用它做对比基准;自动合并不限于它,任一检查分支都可作为合并目标 |
| `check_branches` | 受保护的目标分支列表,逗号分隔。任何**合并进**这些分支的 PR 都会审查(功能分支不必列出),向这些分支推送也会审查 |
| `managed_branch` | 最终目标分支。PR 合入它始终会被审查;push 到检查分支通过后会晋级到它 |
| `check_branches` | 需要做 push 审查的分支,逗号分隔;`*` 表示任意分支。留空=只审 PR。管理分支不必列在这里(它是 PR 的默认目标,始终受保护) |
| `review_scope` | `both` / `pr` / `push` |
| `block_severity` | 阻断级别阈值,如 `critical,high`;留空则不看级别 |
| `block_categories` | 额外按类别阻断,如 `security` |
@@ -217,7 +217,13 @@ curl -X POST http://localhost:8090/api/review \
## 行为说明
**分支与合并**:`check_branches` 是**被保护的目标分支**。任何合并进这些分支的 PR 都会被审查,所以功能分支不必列进去;向这些分支直接推送也会审查。审查基准是该改动实际要合入的分支(PR 用 PR 自己的目标分支,push 用管理分支),也就是「这次改动合进去会怎样」。
**分支与合并**:`check_branches` 是**要做 push 审查的分支**。
- 勾选具体分支:这些分支的 push 会审查,通过后晋级到管理分支
- 勾选「任意分支」(`*`):所有分支的 push 都审查,但**不会**把任意分支自动合并进管理分支
- 留空:只审 PR,不审 push
**PR 审查**始终覆盖「勾选的分支 + 管理分支」作为合并目标,所以管理分支不需要出现在检查列表里。审查基准是该 PR 实际要合入的分支。
自动合并作用于目标为**任一检查分支**的 PR,因此两级流转可以直接用: