✨ feat(vscode): 「改动」tab 重做为整 PR 聚合的主从式内联 diff(git-diff-view)

- 左树右 diff:左栏全 PR 文件树 + 统计条(共改 N · +X−Y · 已查看 M/N),右栏选中单文件内联 diff
- 用 @git-diff-view/react 只渲染当前选中文件,绕开上万行全量渲染的性能坑
- gitea 新增 listPullRequestFiles、getPullRequest 取 merge_base/head,按需回两版原文
- diff 走 merge_base→head 三点口径(与 Gitea 网页一致),getRawFile 404 兜底成全增/全删/改名
- 已查看态按 head sha 落盘、新 push 自然重置;去掉提交列表、原生 diff 与 spx-gitea 虚拟文档 provider
This commit is contained in:
cruldra committed 2026-06-29 10:52:36 +08:00
1 parent ceea62ed16
commit fb505d59c5
18 files changed
+1149 -1127

No files matched your search

+4 -36
View File
@@ -2,9 +2,10 @@
* Workspace 级「PR 审查已确认文件」持久化。
*
* 落盘到 `<workspace>/.spx/pr-review-confirmed.json`,形状
* `Record<string, string[]>`:key = `${issueNumber}:${sha}`,value = 该提交里
* 已确认(已审阅)的文件完整路径数组。目录不单独记录——目录是否确认靠「其下
* 可见文件是否全已确认」推导。文件不存在或解析失败时按空处理。
* `Record<string, string[]>`:key = `${issueNumber}:${sha}`(sha 取 PR 的 head
* sha,故新 push 换 key、已查看进度自然重置),value = 该 PR 里已确认(已审阅)
* 的文件完整路径数组。目录不单独记录——目录是否确认靠「其下可见文件是否全已
* 确认」推导。文件不存在或解析失败时按空处理。
*/
import { promises as fsp } from 'node:fs'
@@ -79,36 +80,3 @@ export async function writeConfirmed(
await fsp.mkdir(dir, { recursive: true })
await fsp.writeFile(confirmedFile(workspaceRoot), `${JSON.stringify(map, null, 2)}\n`, 'utf8')
}
/**
* 读取某工单已确认(已审阅)的提交 sha 数组。key = `${issueNumber}:commits`
* (`commits` 非合法 sha,不与文件确认的 `${issueNumber}:${sha}` key 冲突)。
* 文件缺失、解析失败或无该 key 时返回 `[]`。
*/
export async function readConfirmedCommits(
workspaceRoot: string,
issueNumber: number,
): Promise<string[]> {
const map = await readMap(workspaceRoot)
return map[`${issueNumber}:commits`] ?? []
}
/**
* 写入某工单已确认的提交 sha 数组。空数组则删除该 key;非空则设值。父目录不存在
* 会自动创建。
*/
export async function writeConfirmedCommits(
workspaceRoot: string,
issueNumber: number,
shas: string[],
): Promise<void> {
const map = await readMap(workspaceRoot)
const key = `${issueNumber}:commits`
if (shas.length > 0)
map[key] = shas
else
delete map[key]
const dir = path.join(workspaceRoot, '.spx')
await fsp.mkdir(dir, { recursive: true })
await fsp.writeFile(confirmedFile(workspaceRoot), `${JSON.stringify(map, null, 2)}\n`, 'utf8')
}