Skip to content

fix(workspace): 完善忽略目录排除提示与树状态 - #1658

Open
lin-coco wants to merge 6 commits into
1lck:previewfrom
lin-coco:codex/workspace-exclusion-followup
Open

lin-coco wants to merge 6 commits into
1lck:previewfrom
lin-coco:codex/workspace-exclusion-followup

Conversation

@lin-coco

@lin-coco lin-coco commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

完善忽略目录的分析排除、编辑器提示和项目树状态。

Refs #958;这是 #1597 的后续修补与功能补充。

改动

  • .gitignore 增加查看目录、多选确认排除和项目级“不再显示”,两端同步。
  • 修复独立 .git 绕过父工作区分析排除,以及规则变化、并发创建/展开后的提示与树状态刷新。
  • Git 忽略只改变名称颜色,手动排除使用整行底色;后代仍可浏览,选中色优先;不隐藏已有仓库的提交候选。
  • 自动分析排除对未保存配置的项目默认关闭,保留已有 true/false。默认值由 Core 解析,两端只在取得生效值后呈现;读取不补写配置,失败不把新偏好冒充已生效。
  • ⓘ 保留作用范围和取消排除说明,语言服务限制精简为“部分语言服务仍可能扫描已排除的目录”。
  • 批量 ls-files 复用 Git Host 的超时、取消和进程树清理;Windows 多选保存失败时整组回滚并保留弹窗。
  • 真实 JDT CI 只运行真实 JDT 模块,普通 Core 仍由 SharedRust 全量覆盖;筛选零命中失败,不增加预算。
  • 同步契约、桥接、中英文词条、fixture、回归、笔记和功能矩阵。

依据与截图

设计与实现参考 JetBrains IDEA 社区版源码与行为,既有原生行为对照来自 PyCharm 2026.2.3。排除底色依据 NonProjectFilesScope及 Islands 浅色/深色。

本轮两组整合后的 Lithe-Dev 实拍,红框标出精简后的限制说明:

精简后的说明

以下既有 Dev 实拍展示提示、多选和目录颜色,不代替本轮完整验收:

忽略目录提示
选择目录
目录状态

验证

已同步 preview 20ef1317,本组 head 885db50e。

  • Core 1,586 项、索引 37 项逐项计时、Swift 63 项、前端 61 项及 TypeScript 通过;完整 Rust、C ABI/Swift 桥接和相关静态门禁通过。
  • 独立审查发现的失败状态与未知状态展示问题已修复,复审无新增发现。
  • 实际 Dev 确认新项目默认关闭且无偏好落盘、显式开关保存,以及中英文 ⓘ;运行前后 1,434 项 bundle 清单/哈希/模式和 Git 忽略文件、索引未变,偏好已精确恢复,验收实例已清理。

CI 已通过 Swift 6.3.3 / Xcode 26.6 测试、Rust Core、Windows Rust/前端及真实 JDT及 arm64 发布包,全部检查通过。本机 Swift 6.4.2 / Xcode 27.2。Windows 产品界面、macOS 深色及本轮多选/Git 面板原生复验仍 pending;后者因窗口自动化超时未完成。Git 子仓库发现见 #1659。

Fix automatic analysis exclusion for ignored nested repositories while preserving independent Git commit candidates. Add ignored-directory suggestions, selective exclusion and project-local dismissal on macOS and Windows. Distinguish ignored names from excluded rows and refresh lazy tree decorations safely across concurrent events. Include shared contracts, localization, regression coverage and native acceptance notes.
Use the Islands FileColor.Yellow theme overrides for excluded rows on
macOS and Windows: #FFF9EB in light mode and #291F1C in dark mode.
Preserve the existing priority of selected row backgrounds.

Update the rendered row expectations, upstream theme evidence in the
workspace exclusion decision note, and the platform feature matrix.

Validation: 16 related Swift rendering/tree interaction tests passed;
Release build and isolated static gates passed. Installed Lithe-Dev
visually confirms matching folder/descendant colors in Lithe-test;
signature and bundle immutability checks passed after launch.
Windows native and macOS dark appearance acceptance remain pending.
@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Nov 2, 2026
@lin-coco
lin-coco marked this pull request as ready for review November 2, 2026 12:47
@lithe-code-review

lithe-code-review Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/workspace-exclusion-followup · head: 6dee07e

未发现需要阻塞合并的问题。发现一处 P2 取消与资源清理回归,建议修复。

Findings

  1. [P2] 批量查询已跟踪目录时保留 Git Host 的超时和取消边界
    rust/lithe-core/src/git/mod.rs:8136

    • 实际影响:新增的 untracked_directory_candidates 调用 run_git;其本地分支在同文件 8205–8209 行使用 Command::output() 同步等待,未轮询请求的取消状态和截止时间,也未使用 Git Host 的进程树清理。若该次 ls-files 卡住,提示查询声明的 10 秒超时以及显式取消都不能终止这段等待,后台请求和 Git 子进程会持续存留。该路径也被自动索引排除复用。
    • 触发条件:忽略候选非空,且本地 ls-files 或持有其输出管道的辅助进程未按时退出。
    • 复现步骤:可构造一个已配置索引策略、包含被忽略目录的工作区,通过 gitExecution.executable 注入测试替身:正常转发版本和 check-ignore 查询,在 ls-files 分支等待受控 gate。调用带 operationId 和短 timeoutMilliseconds 的 workspace.ignoredDirectorySuggestions,再取消该操作;此处仍会停留在 output(),直到替身被另外释放。此为静态调用链推导,本次未执行。
    • 来源:本次引入。base 中相同的已跟踪后代保护经 execute_git_readonly 执行,最终进入带取消回调及清理的 lithe_git_host::run;本次批处理改用了不具备这些边界的本地辅助函数。

Scope Check

  • 关联 Issue 或需求是否完成:已提供 [Feature] parse gitignore file #958 上下文,但其需求仍较宽泛,不能据此认定整个 Issue 已完成。本 PR 可确认的范围是忽略目录候选提示、选择排除、项目级关闭提示、嵌套仓库分析排除及树状态补修。
  • 已完成范围:共享 Core 查询、两端桥接与交互、目录名称装饰和手动排除底色、共享中英文词条、fixture、相关测试、Windows CI 注册、决策笔记及功能矩阵均有对应改动。
  • 未完成范围:作者明确将 Git 子仓库自动发现留给其他 PR;Windows 原生界面、macOS 原生深色及固定 Swift/Xcode 工具链验收尚未完成。
  • 上游能力复用:忽略语义继续由原生 Git 的 check-ignore 和 ls-files 提供,未新增另一套规则解析器;但 Finding 1 绕过了已有的进程生命周期适配器。
  • Finding 1 由本次改动引入,直接影响新增查询及既有自动排除调用链,属于本次职责范围。

Suggestions

  1. 对应 Finding 1:保留 pathspec 分批,但通过 execute_git_readonly 执行每个批次;将取消、超时作为结构化错误向上传递。补充受控 gate 回归,验证请求在本地截止时间内结束,并回收 Git 及其辅助进程。
  2. PR 已附截图链接,但作者说明它们来自此前 Dev 构建。本次未访问或查看这些图片;建议补充修复后版本的树状态前后对比,以及 Windows 原生和 macOS 深色界面的验收截图。

Summary

改动整体保持了分析排除、项目树可见性和 Git 提交候选之间的边界,两端文案使用共享 i18n,新增测试覆盖了多选保存失败回滚、元数据刷新和树操作并发等关键场景。主要建议是让新增 Git 批处理继续复用既有超时、取消及清理能力,避免性能优化丢失原有生命周期保障。

Verification

  • 实际检查:固定范围 8b1d666933cc4250c04770fcd755073bfd07c447...6dee07ecee37e2d391761b49a781926af3b791ed 的完整文件清单;重点追踪 Rust 索引策略、目录扫描、Git 查询与 dispatcher,macOS 功能模型/树加载/提示交互,以及 Windows 查询/批量持久化/树呈现。同步检查了共享契约、fixture、i18n 源文件、测试改动、CI 注册、Agent Note 和功能矩阵;未读取生成资源正文。
  • 已提供结果:作者报告 Core 1,583 项、Swift 91 项、前端 41 项、TypeScript 及相关契约、i18n、边界、稳定性和 bundle 只读检查通过。这些是提供的验证信息,并非本次执行结果。
  • head CI:提供的记录中部分 i18n、分类、矩阵和 Agent Notes 检查成功;Rust、Swift、Windows 前端/Rust/真实 JDT、插件及发布包相关检查仍有 queued 或 in_progress,不能认定完整 CI 已通过。
  • 本次未运行任何仓库代码、测试或验证脚本;未访问网络、修改文件、批准 PR 或发布评论。
  • 非阻塞验证缺口:Finding 1 的取消与进程清理回归尚需验证;修复后原生视觉效果、Windows 整机流程、macOS 深色及固定工具链结果仍待补齐。

@lithe-code-review

Copy link
Copy Markdown

Lithe 运行验收

版本:6dee07ecee37e2d391761b49a781926af3b791ed;状态:blocked。
本报告独立于代码审查;只报告实际执行的场景,不代表所有问题均已修复。

External fork runtime requires an explicit trusted execution policy; no code executed

工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。
详细步骤和原始证据保存在服务器受限目录(14 天、总计不超过 1 GiB);当前没有公开下载链接。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

对了哎,你那个自动使用 git 的模式去进行忽略的方式有没有开关啊,我好像最新的 Autobuild 没有看到开关,如果没有的话需要补一下开关到通用里面——编辑器(需要i 符号来解释含义的)

@lin-coco

lin-coco commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

对了哎,你那个自动使用 git 的模式去进行忽略的方式有没有开关啊,我好像最新的 Autobuild 没有看到开关,如果没有的话需要补一下开关到通用里面——编辑器(需要i 符号来解释含义的)

根据git忽略自动排除目录,有按钮的,这在git设置里,IDEA也是放在这里的。
现在好像是默认开启,我可能后面再提个pr默认关闭,跟Jetbrains IDEA对其

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

对了哎,你那个自动使用 git 的模式去进行忽略的方式有没有开关啊,我好像最新的 Autobuild 没有看到开关,如果没有的话需要补一下开关到通用里面——编辑器(需要i 符号来解释含义的)

根据git忽略自动排除目录,有按钮的,这在git设置里,IDEA也是放在这里的。 现在好像是默认开启,我可能后面再提个pr默认关闭,跟Jetbrains IDEA对其

image 哦哦哦看到了,有点没找到,默认关闭你其实可以附在这个 PR 顺路做了,内容应该不多

@lithe-code-review

Copy link
Copy Markdown

Lithe 运行验收

版本:885db50ea7d50bd5dcd3b1ccc0ce81e20238142c;状态:blocked。
本报告独立于代码审查;只报告实际执行的场景,不代表所有问题均已修复。

External fork runtime requires an explicit trusted execution policy; no code executed

工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。
详细步骤和原始证据保存在服务器受限目录(14 天、总计不超过 1 GiB);当前没有公开下载链接。

@lin-coco

lin-coco commented Nov 3, 2026

Copy link
Copy Markdown
Contributor Author

@xiaoyumuxi 功能已经开发验证好,请求合并。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

@xiaoyumuxi 功能已经开发验证好,请求合并。

我明天看,今天忙着重构去了

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

@xiaoyumuxi 功能已经开发验证好,请求合并。

抱歉可能得再等等了,我们最近在进行插件化可能对 core 里面的内容进行大量改动,等改动完毕之后才会合入新的 PR,后续我来补就行

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants