discover/ + watcher/ — 檔案發現與自動同步

哪些檔案進圖、變更了怎麼重索引
目錄:src/discover/ · src/watcher/

大方向

discover/ 決定「哪些檔案進圖」,watcher/ 決定「檔案變了之後怎麼保持圖新鮮」。兩者都跟 忽略規則 密切相關。


1. discover/ — 檔案發現

cbm_discover() discover/discover.c走訪目錄,回傳要索引的檔案清單。

走訪 repo,套用忽略規則:

  1. 硬編碼模式(.gitnode_modules…)
  2. .gitignore 階層
  3. .cbmignore(專案專用,gitignore 語法)
  4. symlink 永遠跳過
cbm_matches_fast_pattern() · cbm_should_skip_dir() · cbm_should_skip_filename() discover/discover.c快速過濾:路徑/目錄/檔名的跳過判斷。

為了在 75K 檔的 repo 上也能快速走完,discover 用 fast pattern 匹配(非逐檔 regex)過濾,並對目錄層級提前剪枝。

language.c · gitignore.c discover/語言偵測與 gitignore 解析。

language.c 依副檔名判斷語言(配合 extra_extensions 的映射);gitignore.c 解析 .gitignore 語法(含 ! 反轉)。

2. watcher/ — 自動同步

cbm_watcher_new() · cbm_watcher_poll_once() · cbm_watcher_run() watcher/watcher.c背景監看、git polling、adaptive intervals。

watcher 由 daemon 擁有(跨 session 共享)。它輪詢 git 狀態偵測變更,用 adaptive interval 平衡「即時」與「省資源」。偵測到變更就觸發增量重索引(寫 Fast tier 的 graph.db.zst)。auto_watch false 可關掉。

看完這頁你應該能說出:檔案進圖的三層忽略 + symlink 規則、fast pattern 如何支撐 75K 檔走訪、watcher 由 daemon 共享且用 adaptive interval、以及 auto_watch 的開關。