From 0baff2473b29676733a29cbb8bcd1b7ec00c9d8a Mon Sep 17 00:00:00 2001 From: David Stensland Date: Fri, 10 Jul 2026 00:07:51 -0700 Subject: [PATCH 1/2] Call IsDirCoveredByWatch less often to improve performance --- internal/execute/watcher.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/internal/execute/watcher.go b/internal/execute/watcher.go index 9b11c2a4dd4..700aa5bc08a 100644 --- a/internal/execute/watcher.go +++ b/internal/execute/watcher.go @@ -185,12 +185,16 @@ func (w *Watcher) computeDesiredWatches(seenFilePaths []string) map[string]bool resolvedDirs := w.wm.ResolveDesiredDirs(desiredDirs) opts := w.comparePathsOptions() + toAddDirs := make(map[string]bool) // dir → should add for _, filePath := range seenFilePaths { dir := tspath.GetDirectoryPath(filePath) - if !watchmanager.IsDirCoveredByWatch(resolvedDirs, dir, opts) { - if watchmanager.CanWatchDirectory(dir) { - resolvedDirs[dir] = false - } + if _, has := toAddDirs[dir]; !has { + toAddDirs[dir] = !watchmanager.IsDirCoveredByWatch(resolvedDirs, dir, opts) && watchmanager.CanWatchDirectory(dir) + } + } + for dir, shouldAdd := range toAddDirs { + if shouldAdd { + resolvedDirs[dir] = false } } From 212ec3837d35469d6063fa6d86643a76d4879657 Mon Sep 17 00:00:00 2001 From: David Stensland Date: Tue, 14 Jul 2026 16:29:08 -0700 Subject: [PATCH 2/2] Avoid duplicate watches on case-insensitive filesystems --- internal/execute/watcher.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/internal/execute/watcher.go b/internal/execute/watcher.go index 700aa5bc08a..c9cdeb55f96 100644 --- a/internal/execute/watcher.go +++ b/internal/execute/watcher.go @@ -185,15 +185,21 @@ func (w *Watcher) computeDesiredWatches(seenFilePaths []string) map[string]bool resolvedDirs := w.wm.ResolveDesiredDirs(desiredDirs) opts := w.comparePathsOptions() - toAddDirs := make(map[string]bool) // dir → should add + toAddDirs := make(map[tspath.Path]string) // canonicalized dir → original dir for _, filePath := range seenFilePaths { dir := tspath.GetDirectoryPath(filePath) - if _, has := toAddDirs[dir]; !has { - toAddDirs[dir] = !watchmanager.IsDirCoveredByWatch(resolvedDirs, dir, opts) && watchmanager.CanWatchDirectory(dir) + canonicalDir := tspath.ToPath(dir, cwd, opts.UseCaseSensitiveFileNames) + if _, has := toAddDirs[canonicalDir]; !has { + if !watchmanager.IsDirCoveredByWatch(resolvedDirs, dir, opts) && watchmanager.CanWatchDirectory(dir) { + toAddDirs[canonicalDir] = dir + } else { + // Cache the IsDirCoveredByWatch call, but don't add the dir + toAddDirs[canonicalDir] = "" + } } } - for dir, shouldAdd := range toAddDirs { - if shouldAdd { + for _, dir := range toAddDirs { + if dir != "" { resolvedDirs[dir] = false } }