Repository navigation
Description
Problem to solve / 要解决的问题
Viva 重构 PR #1799 的 Git Log 提交详情把改动文件按文件夹分组显示,文件夹可以折叠。分组规则写在 Go 界面层:desktop/internal/workbench/gitlog.go 的 groupLogFiles 按 path.Dir 把 core.GitCommitFile 归到文件夹,文件夹按路径排序,文件保持 Git 返回的顺序;gitlog_view.go 的 collectLogFiles 再按收起状态投影成可见行。
按 develop-lithe 的逻辑归属规则,能在客户端之间共享的列表投影和排序规则应由 Core 持有,界面层只负责绘制、焦点和输入。这次放在 Go 是因为迁移期间暂不修改内核,与 #1800(项目树可见行和导航)是同样的处境。规则留在界面层的代价:
- Commit 工具窗口的改动树、差异窗口的文件列表等其他改动文件视图需要再写一遍分组,排序也可能不一致。现在文件夹用
strings.Compare按字节排序,项目树用 Core 的自然排序(shared/fixtures/workspace/file-name-order-v1.json:v0.1.4.md在v0.1.12.md之前),两处顺序规则已经不同。 - 以后支持 IDEA 的“按目录分组”压缩单子目录链、按模块分组时,要在每个客户端分别实现。
判定依据:在 #1799 分支上全仓库搜索 groupLogFiles、logFolder,只有 desktop/internal/workbench/gitlog.go、gitlog_view.go 和对应测试使用;desktop/internal/core 中的 GitCommitDetail 只提供平铺的文件列表,没有分组接口。#1662 下沉清单的 GIT-29(#1753)只覆盖引用树,没有覆盖改动文件。
Proposed solution / 建议方案
在 Core 增加改动文件的分组接口(例如 git.changedFileTree),输入一组带状态的改动文件,返回文件夹节点和文件节点,文件夹和文件名使用与项目树相同的自然排序,并可选择压缩只有一个子目录的链。Git Log 提交详情和以后的 Commit 改动树共用它;展开状态、可见行、绘制仍留在界面层,用 desktop/internal/treelist 显示。
增加共享 fixture,覆盖根目录文件、同名不同目录、深层目录、重命名后的路径、非 ASCII 文件名和大小写不同的名字。改动文件很多的提交只在选中时分组一次,不每帧调用 Core。
风险:改为自然排序会改变当前文件夹顺序;需要和 #1800 的树投影接口一起设计,避免两套树节点格式。
Target platform / 目标平台
Cross-platform / 跨平台
Area / 模块
Git
Priority / 优先级
P2 / 后续考虑:目前不着急,可安排到后续版本
Alternatives considered / 已考虑的替代方案
继续在 Go 客户端维护分组:改动最少,但分组规则无法给其他客户端复用,排序规则也与项目树分开维护。
Additional context / 补充信息
- 相关:[Feature] Windows/macOS 统一 Viva 工作台与原生编辑器,保留 Rust Core 和插件体系(分阶段重构) #1794、Epic(0.7.0): 基于 Viva 框架的跨平台方案的迁移(进行中#1794) #1799、[Feature] 将 Viva 项目树可见行和导航规则下沉到 Rust Core #1800、[Feature] Rust Core 下沉清单:Git 等 104 处双端重复/单端私有逻辑搬入 core(含 7 个已核实 bug) #1662。
groupLogFiles由 Epic(0.7.0): 基于 Viva 框架的跨平台方案的迁移(进行中#1794) #1799 分支上“Git Log 改动文件文件夹折叠”这次提交加入,之前改动文件是平铺列表。- 这是静态架构核对,没有声称发生了运行时故障。
Checklist / 提交前检查
- I searched existing issues for duplicates. / 我已搜索现有 Issue,确认没有重复建议。
Activity
feat(desktop): #1794 公共折叠树列表、Git Log 改动文件折叠与项目树标题栏按钮