3.6 KiB
FAIL
crates/ely-files/src/session.rs:328 — 上轮路径解析错误问题仍有遗漏:NotFound 被转换为路径键并登记成功。隔离测试中,打开缺失文件得到 Ok(Fresh(0));打开真实文件后删除它,再检查和打开,分别得到 Ok(false)、Ok(Fresh(1)),原登记仍存在。悬空符号链接测试已通过,但普通缺失路径的错误仍被吞掉;现有 a_missing_path_registers_as_a_new_file 还把这一行为写成预期。修复方向:向 open()、is_open() 的调用方传播解析失败,失败时保持登记不变;新建文件走无隐含目标路径的流程,并补充缺失、删除后的回归测试。
crates/ely-files/src/session.rs:320 — 上轮硬链接去重只修复了 Unix 分支,Windows 仍以规范化路径作为身份。同一文件的两个硬链接具有不同路径,依次打开会登记两个可写会话,违反 §6.1。抽取当前非 Unix identity() 原样在本机运行硬链接测试,两个键确实不同;Windows 目标的交叉检查通过,但报告 Key::File 从未构造,现有硬链接测试也被 #[cfg(unix)] 排除。修复方向:Windows 分支使用卷与文件身份去重,并让硬链接回归测试覆盖 Windows。
crates/ely-files/src/session.rs:315 — Unix 去重键只保存首次打开时的设备号和 inode,原子替换后同一路径失去已有会话关联,违反 §6.1。隔离测试先打开 doc.md,再通过临时文件加 rename() 替换它;随后 is_open(doc.md) 返回 false,再次打开得到 Fresh(1),预期为 Focus(0)。正常原子保存或外部编辑器的原子替换都会触发两个可写会话。修复方向:保留规范化路径与文件身份的关联,在保存或替换后刷新身份,同时保留硬链接去重,并加入真实原子替换测试。
crates/ely-files/src/session.rs:208 — begin_save_overwrite() 直接生成票据,绕过只读、加载中及保存中的限制。隔离测试对 Session::read_only(path) 调用此方法,取得票据并完成保存后,状态变成 Saved,后续普通 begin_save() 也返回成功;§6.1 的只读视图因此获得持续写权限。上轮只读重载复现已通过,当前测试只检查普通保存入口。修复方向:所有保存入口共同维护访问模式与任务状态,覆盖确认仅解除外部冲突限制,并覆盖只读、加载中和已有保存任务的拒绝路径。
crates/ely-files/src/session.rs:183 — 未解决的外部修改会被普通状态转换清除,破坏 FILE-02 的状态表示与冲突保存守卫。隔离测试执行外部写入、external_modified()、edit() 后,状态变成 Dirty,普通 begin_save() 返回成功;保存期间收到外部修改后再调用 fail_save(),第 254 行同样把状态改成 SaveFailed,重试保存获准。两条路径都绕过了明确处理外部冲突的步骤。修复方向:独立保留未解决的外部修改事实,使编辑和保存失败持续维护冲突约束,覆盖这两种事件顺序。
crates/ely-files/src/session.rs:165 — 新增的 finish_load() 在完成回调时重新读取磁盘指纹,并无条件设为 Saved,会把加载之后的外部版本当作内存内容的基线。隔离测试让后台读取 14 字节内容,外部程序随后改写成 39 字节并调用 external_modified(),最后调用 finish_load();实际记录的指纹长度为 39,状态为 Saved,内存仍是先前的 14 字节,违反 §6.1 的最后加载指纹要求及 FILE-02。修复方向:使用本次实际加载内容对应的指纹确认完成,保留其后发生的外部修改状态,并补充延迟完成回调的测试。