From b4d9194fce5da4d23a558684adc045c8dcf9a620 Mon Sep 17 00:00:00 2001 From: Remco Smits Date: Mon, 6 Jul 2026 05:12:43 +0200 Subject: [PATCH] themes: Don't try to call `fs.load_bytes` on a directory path on rescans (#60399) # Objective Before this change, we watched the themes directory itself. During rescans, this could generate events for the directory, causing Zed to attempt to load `event.path` as a file via `fs.load_bytes(&event.path).await.log_err()`. This happened because `fs.metadata(&event.path).await.ok().flatten().is_some()` also returns true for directories. Since load_bytes will always fail for a directory, we can avoid the unnecessary call by skipping it whenever `event.path` refers to a directory. The rescan happens when Zed lost sync with the filesystem. That will produce the following logs: ``` 2026-07-01T16:03:35+02:00 WARN [fs::fs_watcher] filesystem watcher lost sync for many files, not logging more 2026-07-01T16:03:35+02:00 ERROR [crates/zed/src/main.rs:1891] Is a directory (os error 21) ``` ## Solution The solution is that we just can check if the `event.path` is a directory if so we can skip the `fs.load_bytes(&event.path).await.log_err()` part described aboth. ## Testing All tests should still pass and there should be no impact since this only happens on rescans when the system is under pressure with alot of fs events. **Note**: No regression test was added since there's nothing to test here. ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [ ] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable --- Release Notes: - N/A --- crates/zed/src/main.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 725db34126..1dcac5480f 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -1886,7 +1886,13 @@ fn watch_themes(fs: Arc, cx: &mut App) { while let Some(paths) = events.next().await { for event in paths { - if fs.metadata(&event.path).await.ok().flatten().is_some() { + if fs + .metadata(&event.path) + .await + .ok() + .flatten() + .is_some_and(|m| !m.is_dir) + { let theme_registry = cx.update(|cx| ThemeRegistry::global(cx)); if let Some(bytes) = fs.load_bytes(&event.path).await.log_err() && load_user_theme(&theme_registry, &bytes).log_err().is_some()