♻️ refactor(vscode): 代码托管仓库抽成统一接口,Gitea 实现搬到 provider 后面,翻页改看 Link 头

This commit is contained in:
cruldra committed 2026-10-19 07:56:40 +11:00
1 parent c90d84d7f2
commit 14bee9f505
64 files changed
+1881 -2718

No files matched your search

+17 -15
View File
@@ -1,12 +1,13 @@
import type { Disposable, Event, ExtensionContext, QuickPickItem, TreeView, WorkspaceFolder } from 'vscode'
import type { PrFileDto } from '../../gitea/api'
import type { RepoContext } from '../../gitea/repoContext'
import type { Issue } from '../../gitea/types'
import type { ForgeContext } from '../../forge/context'
import type { ForgePrFile } from '../../forge/types'
import type { Issue } from '../../issues/types'
import type { DiffBase, DiffBaseSource } from '../diff/diffBase'
import type { FileTreeProvider, TreeNode } from '../explorer/fileTree'
import type { FileCount } from './pickList'
import * as path from 'node:path'
import { commands, EventEmitter, QuickPickItemKind, Uri, window, workspace } from 'vscode'
import { requireForge } from '../../forge/context'
import { fileAtRef } from '../../git/fileAt'
import { logger } from '../../logging/logger'
import { WORKSPACE_TREE } from '../explorer/fileTree'
@@ -17,7 +18,7 @@ import { ChangeDecorations } from './changeDecorations'
import { changeOf, reviewBaseFile, reviewTree } from './changedFiles'
import { countingFiles, pickEntries, pickItemText, pickRows, withFileCount } from './pickList'
import { columnLabel, REVIEW_COLUMNS_TEXT, reviewableIssue, reviewablePullRequest, reviewBaseLabel, reviewBaseMissing, reviewDescription, reviewMessage } from './reviewRules'
import { loadIssue, loadPullRequest, loadPullRequestFiles, requireRepo, reviewCandidateIssues } from './reviewSource'
import { loadIssue, loadPullRequest, reviewCandidateIssues } from './reviewSource'
import { localWorktree, prepareWorktree } from './reviewWorktree'
/** workspaceState:正在审查的工单号,重开窗口接着审查。 */
@@ -35,12 +36,12 @@ type How = 'pick' | 'reload' | 'restore'
/**
* 进审查要的东西都备好了:工单、它的 PR、PR 改过的文件、装着 PR 最新代码的工作副本,
* 和预览对比的基准:PR 的目标分支名、目标分支与 PR 头的合并基(Gitea 没给时退回目标分支的提交,同看板「改动」tab)。
* 和预览对比的基准:PR 的目标分支名、目标分支与 PR 头的合并基(取不到时退回目标分支的提交,同看板「改动」tab)。
*/
interface Loaded {
issue: Issue
pr: number
files: PrFileDto[]
files: ForgePrFile[]
worktree: string
base: { ref: string, commit: string }
}
@@ -115,12 +116,12 @@ export class ReviewMode implements DiffBaseSource, Disposable {
})
picker.show()
let repo: RepoContext
let repo: ForgeContext
try {
repo = await requireRepo(this.context)
repo = await requireForge(this.context)
}
catch (err) {
logger.add({ level: 'error', source: 'codeReader', message: '选工单:读不到当前工作区的 Gitea 仓库', details: errorText(err) })
logger.add({ level: 'error', source: 'codeReader', message: '选工单:读不到当前工作区的代码托管仓库', details: errorText(err) })
picker.hide()
void window.showErrorMessage(`没法选工单:${errorText(err)}`)
return
@@ -228,9 +229,9 @@ export class ReviewMode implements DiffBaseSource, Disposable {
/** 弹框里的一项:有 PR 的工单去读 PR 改了几个文件(各项一起读),读不到就写读不到。 */
/** 读一张工单的 PR 改了几个文件;没读到记进日志,这一项写读不到。 */
private async countFiles(repo: RepoContext, issueNumber: number, pr: number): Promise<FileCount> {
private async countFiles(repo: ForgeContext, issueNumber: number, pr: number): Promise<FileCount> {
try {
return { count: (await loadPullRequestFiles(repo, pr)).length }
return { count: (await repo.provider.listPullRequestFiles(pr)).length }
}
catch (err) {
logger.add({ level: 'warn', source: 'codeReader', message: `选工单:读不到 #${issueNumber} 的 PR #${pr} 改了几个文件`, details: errorText(err) })
@@ -281,7 +282,7 @@ export class ReviewMode implements DiffBaseSource, Disposable {
}
private async load(issueNumber: number, step: (text: string) => void): Promise<Loaded | { blocked: string }> {
const repo = await requireRepo(this.context)
const repo = await requireForge(this.context)
step(`正在读取 #${issueNumber}…`)
const reviewable = reviewableIssue(issueNumber, await loadIssue(this.context, repo, issueNumber))
if ('blocked' in reviewable)
@@ -291,10 +292,11 @@ export class ReviewMode implements DiffBaseSource, Disposable {
const reviewablePull = reviewablePullRequest(pr, await loadPullRequest(repo, pr))
if ('blocked' in reviewablePull)
return reviewablePull
const files = await loadPullRequestFiles(repo, pr)
const { headSha, baseRef, mergeBase, baseSha } = reviewablePull.pull
const files = await repo.provider.listPullRequestFiles(pr)
const { headSha, baseRef } = reviewablePull.pull
const baseCommit = await repo.provider.pullRequestDiffBase(reviewablePull.pull)
const worktree = await prepareWorktree(this.context, repo, issue, { number: pr, headSha }, step)
return { issue, pr, files, worktree, base: { ref: baseRef, commit: mergeBase || baseSha } }
return { issue, pr, files, worktree, base: { ref: baseRef, commit: baseCommit } }
}
private async show(loaded: Loaded): Promise<void> {