文件: tui/app.rs:839-919 分类: 状态机 / 并发
tui/app.rs:839-919
问题: handle_file_appended 和 handle_file_truncated 仅在 Ready 状态响应。如果文件在 Loading 期间被修改,索引完成后用的是过期快照。
handle_file_appended
handle_file_truncated
Ready
fn handle_file_appended(&mut self) { match &mut self.loading_state { AppLoadingState::Ready { reader } => { /* 处理 */ } _ => {} // ← Loading 状态被静默忽略! } }
建议修复: Loading 状态下收到文件变更事件应取消/重启加载。
提交: 534a089 fix(tui): defer file-change events during Loading state to prevent stale reader
534a089
在 App 中新增 reload_after_loading: bool 标志位:
App
reload_after_loading: bool
handle_file_appended / handle_file_truncated 改为显式三分支 match:
Loading
reload_after_loading = true
poll_background_indexer 的 IndexerMessage::Complete 分支:Loading→Ready 转换完成后检查 flag,触发 reload_ready_reader() 全量重载
poll_background_indexer
IndexerMessage::Complete
reload_ready_reader()
IndexerMessage::Error 分支清除 flag 防止残留
IndexerMessage::Error
提取 reload_ready_reader() 私有方法(从 handle_file_truncated Ready 分支抽取),避免语义耦合
test_append_during_loading_sets_reload_flag
test_truncate_during_loading_sets_reload_flag
test_multiple_events_during_loading_collapse_to_single_reload
test_indexer_error_clears_reload_flag
全部 92 个测试通过,0 失败。
No dependencies set.
The note is not visible to the blocked user.
文件:
tui/app.rs:839-919分类: 状态机 / 并发
问题:
handle_file_appended和handle_file_truncated仅在Ready状态响应。如果文件在 Loading 期间被修改,索引完成后用的是过期快照。建议修复: Loading 状态下收到文件变更事件应取消/重启加载。
已修复 ✅
提交:
534a089fix(tui): defer file-change events during Loading state to prevent stale reader修复方案:延迟重载标记
在
App中新增reload_after_loading: bool标志位:handle_file_appended/handle_file_truncated改为显式三分支 match:Ready→ 正常处理Loading→ 设置reload_after_loading = truepoll_background_indexer的IndexerMessage::Complete分支:Loading→Ready 转换完成后检查 flag,触发reload_ready_reader()全量重载IndexerMessage::Error分支清除 flag 防止残留提取
reload_ready_reader()私有方法(从handle_file_truncatedReady 分支抽取),避免语义耦合回归测试(4 个)
test_append_during_loading_sets_reload_flagtest_truncate_during_loading_sets_reload_flagtest_multiple_events_during_loading_collapse_to_single_reloadtest_indexer_error_clears_reload_flag全部 92 个测试通过,0 失败。