microsoft / microsoft/TypeScript

FSEvents watcher drops events when requested casing differs from disk casing

Đang mở
#64,089 0 bình luận 0 reaction 1 người được giao Xem trên GitHub

@andrewbranch đang làm issue này rồi.

Từ ngày 2/9/2026.

Needs Investigation
Ngôn ngữ chính
Go
Star
111k
Fork
14.3k
Merge trung bình
2 ngày 4 giờ
Pull request đã merge (30 ngày)
132

Mô tả

After https://github.com/microsoft/typescript-go/pull/4867, realpath on macOS now preserves the caller casing when the input isn't a symlink. That exposes a watch bug. `WatchManager`'s `DirWatchSet` contains lowercased paths (even though they're typed as `string`, not `tspath.Path`). Those lowercased paths are given to `fswatch`, which works, but FSEvents then reports back events using actual disk casing. `fsevents` uses case-insensitive comparison to determine whether to call its callback, so the events get dropped.

I handed this to Copilot and it immediately jumped to bringing back the pre-https://github.com/microsoft/typescript-go/pull/4867 `realpath` behavior for directories specifically, since directories can't be hardlinks. I thought that was a really weird place to start, but technically it seems to fix the bug.

I think the more likely correct fix is either:

- `WatchManager` should hold both the original file casing for passing to `fswatch` and lowercased casing for deduplication/comparison
- `fswatch` should be doing case-insensitive matching on case-insensitive file systems

The latter seems like the most robust (I'm not sure if we can guarantee that the original file casing we see in `tsc` actually matches the disk in all cases; it seems possible that the casing of `"include": ["SRC"]` from a tsconfig will get preserved and we'll never be aware of the disk casing). But it also seems the most expensive and invasive, which is a bummer.

cc @jakebailey @johnfav03

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.