✨ feat(vscode): 代码阅读侧栏可以按审查工单只看 PR 改过的文件:标题栏「选工单」列出看板「审查」列,选中后树里只剩改过的文件(M / A / D 着色),点开的是本机工作副本里 PR 最新的代码,没有就拉 PR 分支建一个,「显示全部」退出
This commit is contained in:
1 parent
c009187f6c
commit
8e2cdfaf17
18 files changed
+1053
-40
No files matched your search
@@ -0,0 +1,80 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { buildChangedTree, CHANGE_STYLES, changeOf } from './changedFiles'
|
||||
|
||||
describe('改动状态', () => {
|
||||
it('新增 A、删除 D,别的(改名、复制、改了、没改)都算修改 M', () => {
|
||||
expect(changeOf('added')).toBe('A')
|
||||
expect(changeOf('deleted')).toBe('D')
|
||||
for (const status of ['changed', 'modified', 'renamed', 'copied', 'unchanged', ''])
|
||||
expect(changeOf(status)).toBe('M')
|
||||
})
|
||||
|
||||
it('颜色照 VS Code 源代码管理的 git 装饰色,删掉的提示「PR 里删掉了」', () => {
|
||||
expect(CHANGE_STYLES.M.color).toBe('gitDecoration.modifiedResourceForeground')
|
||||
expect(CHANGE_STYLES.A.color).toBe('gitDecoration.addedResourceForeground')
|
||||
expect(CHANGE_STYLES.D.color).toBe('gitDecoration.deletedResourceForeground')
|
||||
expect(CHANGE_STYLES.D.tooltip).toBe('PR 里删掉了')
|
||||
})
|
||||
})
|
||||
|
||||
describe('改动的文件树', () => {
|
||||
// 原型「审查 · 改动的文件」里的 6 个文件,外加一个改名的
|
||||
const files = [
|
||||
{ path: 'backend/src/luffy_agent/user/routes.py', status: 'changed' },
|
||||
{ path: 'backend/tests/user/test_avatar.py', status: 'added' },
|
||||
{ path: 'backend/src/luffy_agent/core/storage.py', status: 'changed' },
|
||||
{ path: 'backend/src/luffy_agent/user/legacy_profile.py', status: 'deleted' },
|
||||
{ path: 'backend/src/luffy_agent/user/services.py', status: 'changed' },
|
||||
{ path: 'backend/src/luffy_agent/user/schemas.py', status: 'renamed' },
|
||||
]
|
||||
const tree = buildChangedTree(files)
|
||||
const names = (dir: string): string[] => (tree.get(dir) ?? []).map(entry => entry.name)
|
||||
|
||||
it('目录层级照留,每层只有通往改过的文件的目录', () => {
|
||||
expect(names('')).toEqual(['backend'])
|
||||
expect(names('backend')).toEqual(['src', 'tests'])
|
||||
expect(names('backend/src')).toEqual(['luffy_agent'])
|
||||
expect(names('backend/src/luffy_agent')).toEqual(['core', 'user'])
|
||||
expect(names('backend/src/luffy_agent/core')).toEqual(['storage.py'])
|
||||
expect(names('backend/tests/user')).toEqual(['test_avatar.py'])
|
||||
})
|
||||
|
||||
it('同一层里的文件按名字排,带着各自的改动和相对仓库根的路径', () => {
|
||||
expect(tree.get('backend/src/luffy_agent/user')).toEqual([
|
||||
{ name: 'legacy_profile.py', path: 'backend/src/luffy_agent/user/legacy_profile.py', isDirectory: false, change: 'D' },
|
||||
{ name: 'routes.py', path: 'backend/src/luffy_agent/user/routes.py', isDirectory: false, change: 'M' },
|
||||
{ name: 'schemas.py', path: 'backend/src/luffy_agent/user/schemas.py', isDirectory: false, change: 'M' },
|
||||
{ name: 'services.py', path: 'backend/src/luffy_agent/user/services.py', isDirectory: false, change: 'M' },
|
||||
])
|
||||
})
|
||||
|
||||
it('目录没有改动,路径相对仓库根', () => {
|
||||
expect(tree.get('backend')).toEqual([
|
||||
{ name: 'src', path: 'backend/src', isDirectory: true },
|
||||
{ name: 'tests', path: 'backend/tests', isDirectory: true },
|
||||
])
|
||||
})
|
||||
|
||||
it('目录在前、文件在后,名字不区分大小写,和普通的树一样', () => {
|
||||
const mixed = buildChangedTree([
|
||||
{ path: 'README.md', status: 'changed' },
|
||||
{ path: 'src/a.ts', status: 'added' },
|
||||
{ path: 'Docs/b.md', status: 'added' },
|
||||
{ path: 'package.json', status: 'changed' },
|
||||
])
|
||||
expect(mixed.get('')?.map(entry => entry.name)).toEqual(['Docs', 'src', 'package.json', 'README.md'])
|
||||
})
|
||||
|
||||
it('文件换成同名目录(删掉 a、新加 a/b)两项都留着', () => {
|
||||
const replaced = buildChangedTree([{ path: 'a', status: 'deleted' }, { path: 'a/b', status: 'added' }])
|
||||
expect(replaced.get('')).toEqual([
|
||||
{ name: 'a', path: 'a', isDirectory: true },
|
||||
{ name: 'a', path: 'a', isDirectory: false, change: 'D' },
|
||||
])
|
||||
expect(replaced.get('a')?.map(entry => entry.change)).toEqual(['A'])
|
||||
})
|
||||
|
||||
it('没有改动的文件时根下面是空的', () => {
|
||||
expect(buildChangedTree([]).get('')).toEqual([])
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user