sx-gitea Phase 5: pr — merge-base diffs, reviews, flow lifecycle, 3-way merge, merge queue (TDD, 460/460)
lib/gitea/pr.sx: PRs as kv records sharing the per-repo number counter with issues. Diffs are LIVE, computed from the merge base of the current branch heads to the source head via sx-git (no spurious deletions when the target moves on). Reviews: latest verdict per reviewer wins; authors cannot review their own PR; approved? = some approve and no outstanding request-changes. Lifecycle is a lib/flow durable workflow (deterministic-replay suspend): open -(approval)-> approved -(merge)-> merged; review! resumes the approval suspend when the verdict set first approves, merge! resumes the rest, close! cancels, reopen! starts a fresh flow. The flow env lives in the forge handle; the record's :state stays the source of truth. Merge via git/merge-commits over the merge base: up-to-date, fast- forward (ref move only), true two-parent merge commit, or conflicts with the conflicting paths. Every ref move is branch-cas! — concurrent pushes surface as 'stale'. Merge queue: approved PRs merge in order, failures stay queued. Web: pulls list + PR page (body html, reviews, lifecycle, unified diff), JSON API for create/review/merge (409 on conflicts/stale)/close (author or write)/enqueue/queue-process. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,9 +3,10 @@
|
||||
"repo": {"pass": 91, "fail": 0},
|
||||
"access": {"pass": 103, "fail": 0},
|
||||
"wire": {"pass": 78, "fail": 0},
|
||||
"issues": {"pass": 88, "fail": 0}
|
||||
"issues": {"pass": 88, "fail": 0},
|
||||
"pr": {"pass": 100, "fail": 0}
|
||||
},
|
||||
"total_pass": 360,
|
||||
"total_pass": 460,
|
||||
"total_fail": 0,
|
||||
"total": 360
|
||||
"total": 460
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user