✨ feat(vscode): 选工单也列「进行中」列里已经有 PR 的工单(开发完了没走自动审查的),弹框按「审查」「进行中」分组,进审查、刷新、重开窗口按同一条列规则判断

This commit is contained in:
cruldra committed 2026-09-29 04:23:57 +08:00
1 parent f2b17e5389
commit 489d0ef41f
7 files changed
+159 -68

No files matched your search

+22 -20
View File
@@ -5,13 +5,13 @@ import type { Issue } from '../../gitea/types'
import type { FileNode, FileTreeProvider } from '../explorer/fileTree'
import type { FileCount } from './pickList'
import * as path from 'node:path'
import { commands, Uri, window, workspace } from 'vscode'
import { commands, QuickPickItemKind, Uri, window, workspace } from 'vscode'
import { logger } from '../../logging/logger'
import { ChangeDecorations } from './changeDecorations'
import { buildChangedTree, changeOf } from './changedFiles'
import { countingFiles, pickEntries, pickItemText, withFileCount } from './pickList'
import { reviewableIssue, reviewablePullRequest, reviewDescription, reviewMessage } from './reviewRules'
import { loadIssue, loadPullRequest, loadPullRequestFiles, requireRepo, reviewColumnIssues } from './reviewSource'
import { countingFiles, pickEntries, pickItemText, pickRows, withFileCount } from './pickList'
import { columnLabel, REVIEW_COLUMNS_TEXT, reviewableIssue, reviewablePullRequest, reviewDescription, reviewMessage } from './reviewRules'
import { loadIssue, loadPullRequest, loadPullRequestFiles, requireRepo, reviewCandidateIssues } from './reviewSource'
import { localWorktree, prepareWorktree } from './reviewWorktree'
/** workspaceState:正在审查的工单号,重开窗口接着审查。 */
@@ -33,8 +33,9 @@ interface Loaded {
worktree: string
}
interface IssuePick extends QuickPickItem {
issue: Issue
/** 弹框里的一行:工单的一项带着工单,分组标题(列名)没有。 */
interface PickerItem extends QuickPickItem {
issue?: Issue
}
function errorText(err: unknown): string {
@@ -42,7 +43,7 @@ function errorText(err: unknown): string {
}
/**
* 侧栏按审查工单筛文件:「选工单」列出看板「审查」列的工单,选中后树里只剩这张工单的 PR 改过的文件(按改动着色),
* 侧栏按审查工单筛文件:「选工单」列出看板「审查」「进行中」列里能审查的工单,选中后树里只剩这张工单的 PR 改过的文件(按改动着色),
* 点开的是本机这张工单的工作副本里 PR 最新的代码;「显示全部」回到工作区文件树。选的工单按工作区记住。
*/
export class ReviewMode implements Disposable {
@@ -80,14 +81,13 @@ export class ReviewMode implements Disposable {
return this.reviewing !== undefined
}
/** 「选工单」:顶部弹出快速选择,读看板「审查」列的工单和各自改了几个文件时转圈。 */
/**
* 「选工单」:顶部弹出快速选择,列出看板上现在摆着的「审查」列工单,马上就有;
* 「选工单」:顶部弹出快速选择,列出看板上现在摆着的「审查」「进行中」列里能审查的工单(按列分组),马上就有;
* 各 PR 改了几个文件一起去读,读到一个换一项,都读完才停止转圈。
*/
async pick(): Promise<void> {
const picker = window.createQuickPick<IssuePick>()
picker.title = '选工单 · 看板「审查」列'
const picker = window.createQuickPick<PickerItem>()
picker.title = `选工单 · 看板${REVIEW_COLUMNS_TEXT}列`
picker.placeholder = '输入工单号或标题筛选'
picker.busy = true
let open = true
@@ -96,11 +96,11 @@ export class ReviewMode implements Disposable {
picker.dispose()
})
picker.onDidAccept(() => {
const chosen = picker.selectedItems[0]
const chosen = picker.selectedItems[0]?.issue
if (!chosen)
return
picker.hide()
void this.review(chosen.issue.number, 'pick')
void this.review(chosen.number, 'pick')
})
picker.show()
@@ -114,7 +114,7 @@ export class ReviewMode implements Disposable {
void window.showErrorMessage(`没法选工单:${errorText(err)}`)
return
}
const board = reviewColumnIssues(this.context)
const board = reviewCandidateIssues(this.context)
if (!open)
return
if (!board) {
@@ -126,21 +126,23 @@ export class ReviewMode implements Disposable {
logger.add({
level: 'info',
source: 'codeReader',
message: `选工单:看板「审查」列 ${board.issues.length} 张(${board.from === 'loaded' ? '看板这次加载的' : '上次存下的看板快照'})`,
details: board.issues.map(issue => `#${issue.number} PR ${issue.pr ?? '无'}`).join('\n'),
message: `选工单:看板${REVIEW_COLUMNS_TEXT}列能审查的 ${board.issues.length} 张(${board.from === 'loaded' ? '看板这次加载的' : '上次存下的看板快照'})`,
details: board.issues.map(issue => `#${issue.number} ${columnLabel(issue.column)} PR ${issue.pr ?? '无'}`).join('\n'),
})
if (board.issues.length === 0)
picker.placeholder = '看板「审查」列里没有工单'
picker.placeholder = `看板${REVIEW_COLUMNS_TEXT}列里没有能审查的工单`
let entries = pickEntries(board.issues, issue => localWorktree(this.context, repo.workspaceRoot, issue) !== undefined)
// 换 items 时 VS Code 会把光标挪回第一项:按工单号挪回用户停着的那一项
const render = (): void => {
if (!open)
return
const active = picker.activeItems[0]?.issue.number
const items = entries.map(entry => ({ issue: entry.issue, ...pickItemText(entry) }))
const active = picker.activeItems[0]?.issue?.number
const items: PickerItem[] = pickRows(entries).map(row => 'separator' in row
? { label: row.separator, kind: QuickPickItemKind.Separator }
: { issue: row.entry.issue, ...pickItemText(row.entry) })
picker.items = items
const stay = items.find(item => item.issue.number === active)
const stay = items.find(item => item.issue !== undefined && item.issue.number === active)
if (stay)
picker.activeItems = [stay]
picker.busy = countingFiles(entries)