Files
codegraph/__tests__
Colby MchenryandClaude Opus 5.5 983c4df374 fix(index): a deleted file git still lists is skipped, not reported as unreadable (#2928)
A full index reads every path the scan lists, and `git ls-files` keeps
listing a tracked file deleted from the working tree until the deletion is
staged. So `codegraph init` and `codegraph index` stat'ed the missing file,
got ENOENT and reported "1 files could not be read" with an errors.log
entry. The errored file also kept the run from recording the commit it
indexed, so `codegraph status` fell back to a full scan afterwards.

The batch reader in indexAll and the single-file indexFile now take ENOENT
and ENOTDIR to mean nothing is there: the file is skipped and counted as
skipped, so the run reads as complete rather than PARTIAL. A symlink that
points at nothing is skipped the same way, as the directory walk for
projects without git already did. Every other read failure (EACCES, EIO, a
folder where a file was) is still reported. On POSIX a path under a file
fails realpath with ENOTDIR, which validatePathWithinRoot rejected as if it
escaped the root; it is now judged like any missing leaf, by its nearest
existing ancestor, so it reaches the reader and is skipped too. Discovery
is unchanged, with no extra stat per tracked file.

Validation:
- index-gone-tracked-files.test.ts (new): all 5 cases fail on main's
  source and pass with the fix: committed and staged deletions, a folder
  replaced by a file, a dangling symlink, and EACCES still reported by
  both the full index and indexFiles. Mutating the single-file path, the
  skipped tally or the EACCES boundary fails the test each time.
- security.test.ts: a path under an existing file validates, and one under
  a symlink to a file outside the root is still refused.
- The issue's CLI repro: main prints "1 files could not be read" and writes
  errors.log; the fix prints "Indexed 1 files", writes no errors.log, and
  status reports nothing pending.

Reported in PR #2910 by @xianzhi-xzw, who also filed issue #2904. This
reimplements the fix independently, at read time rather than with an lstat
of every tracked file during discovery.

Fixes #2904

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:03:50 +00:00
..