2.8 KiB
FAIL
apps/ely-tree/src/work.rs:236:清理改为直接 remove_file 后,执行前只检查文件类型,遗漏当前索引状态,会删除已成为跟踪文件的工作区内容,违反 TREE-13 的“清理未跟踪文件”。独立构建成功,108 项应用测试通过,R2 文件变目录和日志前插场景均通过;新增执行函数探针复现:创建 new.txt 并预览,随后从外部 Git 执行 git add new.txt,再写入尚未暂存的新内容,确认清理返回 Ok(()),文件消失,独立 git status --porcelain 显示 AD new.txt,索引仍保留旧内容,新工作区内容丢失。同场景直接执行 git clean -f -- new.txt 会保留文件。修复方向:删除前重新核对预览路径的 Git 状态,已跟踪的路径应拒绝并重新预览;补上预览后外部暂存且继续编辑的回归。副本中增加索引核对后,该探针与 R2 回归通过。
apps/ely-tree/src/work.rs:228:symlink_metadata(root.join(file)) 只检查末级对象,路径的父目录仍会跟随符号链接;随后删除可越过仓库边界,违反 TREE-13 的危险操作预览和 agents.md C13.6 的“只删所列”。执行函数探针复现:预览 out/early.txt,确认前把 out 改名为 saved-out,创建仓库外的 outside/early.txt,再把 out 换成指向 outside 的符号链接;确认返回 Ok(()),仓库外文件被删,原预览文件仍留在 saved-out/early.txt。同场景独立执行 git clean -f -- out/early.txt 会保留仓库外文件。修复方向:验证父路径身份,并以禁止跟随父路径链接的删除方式绑定仓库内预览对象;路径身份变化时拒绝并重新预览。补上父目录被链接替换的回归;副本中增加父链接核对后,该探针与 R2 回归通过。
apps/ely-tree/src/recover.rs:41:以提交、原因和秒级时间判定 reflog 事件身份,多个真实事件可以具有相同三元组;side_places.rs:284 会同时选中它们,places_pane.rs:137 会将详情定位到首个匹配事件,违反 TREE-13 的 reflog 查看和 agents.md C13.6 的“详情显示所选那一条”。随附 Git 与实际 reflog、Moved::same 探针复现:在同一秒连续执行两次 git reset --keep HEAD,两条记录分别为 HEAD@{0}、HEAD@{1},提交、reset: moving to HEAD 和时间完全相同;选中 HEAD@{1} 时,两条记录均满足选中条件,详情取 HEAD@{0}。探针固定 GIT_COMMITTER_DATE 重现秒级碰撞,唯一选中断言得到 2,预期为 1。现有 R2 回归覆盖了原因不同的同提交事件。修复方向:为当前快照中的重复事件保留独立行身份,刷新时按日志序列追踪原事件,身份有歧义时清除选择;增加同秒同原因重复事件的选中、详情和刷新回归。