Files
DeepSeek-Reasonix/internal/pathidentity
esengine e3ad203bc6 fix(desktop): resolve each project root once when loading the projects file
loadProjectsFile runs on every sidebar read and catalog pass. Its
normalizers (project dedupe, pinned list, sidebar order, organization
sidecar) find a root with projectIndexByRoot/projectRootInList, and each
comparison went through pathidentity.Same, which resolves both paths from
scratch. One load therefore cost O(projects^2) identity resolutions; on
Windows each resolution opens every ancestor directory and queries its
case-sensitivity flag, which matches the Procmon trace in #10738 (about
57k Read-Attributes opens on every project root, 533k
QueryCaseSensitiveInformation calls, almost no file content read).

pathidentity gains a pass-scoped Matcher that resolves and stats each
distinct path once; Same delegates to it, so a single comparison behaves
exactly as before. The project-file normalizers share one matcher per
pass. Nothing is cached across passes, so a directory whose identity
changes is seen fresh on the next load.

Test: TestLoadProjectsFileResolvesEachRootLinearly loads 24 projects
(pinned, sidebar order, organization sidecar, one symlink alias) and
counts identity resolutions. With only the counting seam in place it
failed: "loading 24 projects resolved path identity 4400 times, want at
most 100"; with the shared matcher it passes, and the alias still folds
into its target. TestMatcherResolvesEachDistinctPathOnce checks the
matcher agrees with Same on every pair while resolving each path once.

Refs #10738
2026-09-25 10:18:43 -07:00
..
2026-09-18 19:01:20 +08:00
2026-09-18 19:01:20 +08:00