4.7 KiB
FAIL
apps/ely-tree/src/conflict.rs:143:保存符号链接冲突会覆盖链接目标,破坏其他文件。复现:三个索引阶段分别是指向 base-target、ours-target、theirs-target 的符号链接;合并冲突后,结果编辑器显示 ours-target,改为 theirs-target 并保存。实测 ours-target 文件内容从 keep target\n 变成 theirs-target,冲突链接仍指向 ours-target。std::fs::write 跟随了工作树链接;当前冲突模型还丢弃了索引模式。修复方向:保留各阶段的文件模式,符号链接冲突按链接对象解决,保存时保护链接目标。增加真实符号链接冲突的内容与模式断言。
apps/ely-tree/src/conflict.rs:143:冲突保存绕过仓库写队列,违反 PRD §13.3 的串行规则。真实窗口复现:post-checkout hook 创建进入标记后等待释放标记;编辑结果为 review saved result,点击“用当前侧的文件”,等 hook 进入后点击“保存”。释放标记仍不存在、子进程仍执行 git checkout --ours -- a.txt 时,工作树文件已变为 review saved result。保存与正在执行的 Git 写操作重叠,最终文件取决于执行时序,关闭标签的忙碌判断也覆盖不到保存。修复方向:将结果保存纳入同仓库写队列,并在保存完成时按发起的仓库、路径和结果更新保存状态。
apps/ely-tree/src/moves.rs:95:任意进行中操作都会让 Git 失败原话被“因冲突停下”提示覆盖,违反 PRD §13.3 的 hook 错误可见要求。复现:开始有冲突的 merge,解决并 git add 全部冲突,安装输出 REVIEW_HOOK_DENIED 并退出 1 的 pre-commit hook,再点击“继续”。探针确认索引已经解决全部冲突,MERGE_HEAD 仍存在,应用没有错误对话框,hook 原话被丢弃。修复方向:根据实际未合并索引判断冲突停顿,并展示继续操作的 hook、签名及锁等失败输出;增加解决冲突后继续失败的测试。
apps/ely-tree/src/shown.rs:173:非 UTF-8 冲突进入普通 Binary 视图,丢失冲突解决操作。复现:两分支分别修改包含 NUL 与 0xff 的 asset.bin,merge 停在冲突后选中文件。真实窗口只显示 Binary file 和 — → —,提供的按钮为文件历史、Blame、打开文件;整文件取当前侧、取传入侧和标为已解决等控件均缺失。pane.rs:184 仅为 View::Conflict 打开冲突面板。这违背 TREE-09 和 agents.md C13.4“二进制显示,整份取一侧”的声明。修复方向:为二进制冲突保留阶段存在性和冲突身份,提供整文件侧选择与明确解决动作;覆盖真实二进制及修改/删除冲突。
apps/ely-tree/src/conflict.rs:112:独立计算的冲突块与 Git 标记块分组不同,会拒绝未经手改的块选择。复现:base 为 first\na\nunchanged\nb\nlast\n,两侧分别将 a、b 改成 OURS a/b、THEIRS a/b。随附 Git 2.56.0 将两处冲突合为一个标记块,Merging::new 经组件 regions 计算出两个冲突;实测 model_conflicts=2 git_markers=1。真实窗口显示两个选择区,点击任一“Take theirs”都提示结果被手改,结果保持原样,违反 TREE-09 的块级选择要求。修复方向:以 Git 实际冲突块建立展示与选择的对应关系,避免用另一套合并分组直接按序映射;加入邻近冲突与 diff3 分组测试。
apps/ely-tree/src/branches.rs:93:把 %(refname:short) 直接作为分支/标签操作名称,导致合法的同名引用无法操作。复现:创建分支 topic 和标签 topic 后,Git 返回 heads/topic、tags/topic,应用原样展示并传入命令。随附 Git 实测 switch heads/topic 报 a branch is expected,branch -m heads/topic new、branch -d heads/topic 和 tag -d tags/topic 分别报引用不存在,违反 TREE-07。修复方向:按引用类型从完整 refname 取得实际名称,合并/变基等修订定位保留完整引用身份;覆盖分支、标签及远程引用的名称冲突。
apps/ely-tree/src/side_refs.rs:136:分支列表只绑定 on_pick,组件 829ef68 的 src/git/refs.rs:363 却始终绘制非当前分支的切换与删除按钮,按钮没有处理器。真实窗口复现:创建普通分支 plain,点击该行的 Switch to it,HEAD 保持 master 且没有 Git 命令;点击行内 Delete,分支保留且没有确认对话框。选择该行后点击详情区 Switch To,HEAD 成功变为 plain,证明行内控件未接通。修复方向:将行内动作接到对应切换及逐次确认删除入口,或让组件按已提供的处理器呈现动作;测试应实际点击每个动作并断言仓库变化与确认行为。