feat: 0.9.3 单文件视图文本搜索与稳健性收尾 - 工具栏搜索框(Ctrl+F聚焦/大小写不敏感即时命中计数/Enter与Shift+Enter命中行循环跳转复用activeRowId受控定位/行内命中子串高亮含词级segs行/Esc清空;基于全量行与仅看差异独立、折叠命中行跳转toast提示不推进)、扫描缓存落盘promise链串行化(并发读改写不再覆盖丢LRU目录对)、快照对照变迁过滤计数归零自动复位、重新选择扫描中保持可用固化测试(与返回文件对比同类发起新会话作废在途扫描)、依赖patch级升级,新增21单测用例与E2E搜索链路用例(564单测+E2E 24全过,覆盖率98.27/93.47/94.01/98.27),文档四件套同步

This commit is contained in:
2026-08-19 11:07:15 +08:00
parent 42d2095de2
commit c1e63c3328
16 changed files with 561 additions and 28 deletions
+10 -2
View File
@@ -53,8 +53,16 @@ function loadScanCacheStore(): ScanCacheStoreData {
/**
* 落盘扫描缓存(读-改-写,异步 fire-and-forget):
* 失败静默(目录只读/磁盘满等,跨会话增量记忆失效不影响本次结果)。
* 写操作经内存 promise 链串行执行(每次追加到链尾):两次扫描近乎同时
* 完成时各自的读-改-写按序落盘,避免后写整体覆盖先写丢失 LRU 目录对。
*/
async function persistScanCache(
let scanCacheWrites: Promise<void> = Promise.resolve()
function persistScanCache(leftDir: string, rightDir: string, cache: ScanCacheEntry[]): void {
scanCacheWrites = scanCacheWrites.then(() => writeScanCache(leftDir, rightDir, cache))
}
async function writeScanCache(
leftDir: string,
rightDir: string,
cache: ScanCacheEntry[]
@@ -331,7 +339,7 @@ ipcMain.handle(
: {})
})
// 扫描成功且未截断:缓存异步落盘(LRU,失败静默;下次启动同目录对可增量重扫)
if (!result.truncated) void persistScanCache(leftDir, rightDir, result.cache)
if (!result.truncated) persistScanCache(leftDir, rightDir, result.cache)
return result
} catch {
// 目录不存在/不可读等:转为错误标记,渲染端提示