diff --git a/Cargo.lock b/Cargo.lock
index 2ca650c8cc69a..77c27c66eb097 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2867,6 +2867,15 @@ dependencies = [
"log 0.4.20",
]
+[[package]]
+name = "file-id"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6584280525fb2059cba3db2c04abf947a1a29a45ddae89f3870f8281704fafc9"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
[[package]]
name = "filedescriptor"
version = "0.8.2"
@@ -3023,25 +3032,6 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
-[[package]]
-name = "fsevent"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6"
-dependencies = [
- "bitflags 1.3.2",
- "fsevent-sys 2.0.1",
-]
-
-[[package]]
-name = "fsevent-sys"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0"
-dependencies = [
- "libc",
-]
-
[[package]]
name = "fsevent-sys"
version = "4.1.0"
@@ -3910,17 +3900,6 @@ version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f2cb48b81b1dc9f39676bf99f5499babfec7cd8fe14307f7b3d747208fb5690"
-[[package]]
-name = "inotify"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f"
-dependencies = [
- "bitflags 1.3.2",
- "inotify-sys",
- "libc",
-]
-
[[package]]
name = "inotify"
version = "0.9.6"
@@ -4953,18 +4932,6 @@ dependencies = [
"windows-sys 0.48.0",
]
-[[package]]
-name = "mio-extras"
-version = "2.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
-dependencies = [
- "lazycell",
- "log 0.4.20",
- "mio 0.6.23",
- "slab",
-]
-
[[package]]
name = "miow"
version = "0.2.2"
@@ -5238,24 +5205,6 @@ dependencies = [
"winapi 0.3.9",
]
-[[package]]
-name = "notify"
-version = "4.0.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257"
-dependencies = [
- "bitflags 1.3.2",
- "filetime",
- "fsevent",
- "fsevent-sys 2.0.1",
- "inotify 0.7.1",
- "libc",
- "mio 0.6.23",
- "mio-extras",
- "walkdir",
- "winapi 0.3.9",
-]
-
[[package]]
name = "notify"
version = "5.1.0"
@@ -5265,8 +5214,8 @@ dependencies = [
"bitflags 1.3.2",
"crossbeam-channel",
"filetime",
- "fsevent-sys 4.1.0",
- "inotify 0.9.6",
+ "fsevent-sys",
+ "inotify",
"kqueue",
"libc",
"mio 0.8.8",
@@ -5283,8 +5232,8 @@ dependencies = [
"bitflags 2.4.0",
"crossbeam-channel",
"filetime",
- "fsevent-sys 4.1.0",
- "inotify 0.9.6",
+ "fsevent-sys",
+ "inotify",
"kqueue",
"libc",
"log 0.4.20",
@@ -5293,6 +5242,20 @@ dependencies = [
"windows-sys 0.48.0",
]
+[[package]]
+name = "notify-debouncer-full"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f5dab59c348b9b50cf7f261960a20e389feb2713636399cd9082cd4b536154"
+dependencies = [
+ "crossbeam-channel",
+ "file-id",
+ "log 0.4.20",
+ "notify 6.1.1",
+ "parking_lot 0.12.1",
+ "walkdir",
+]
+
[[package]]
name = "notify-debouncer-mini"
version = "0.2.1"
@@ -10687,7 +10650,7 @@ dependencies = [
"indexmap 1.9.3",
"jsonc-parser 0.21.0",
"mime 0.3.17",
- "notify 4.0.17",
+ "notify-debouncer-full",
"parking_lot 0.12.1",
"rstest",
"serde",
@@ -11645,7 +11608,7 @@ dependencies = [
"anyhow",
"bitflags 1.3.2",
"dashmap",
- "fsevent-sys 4.1.0",
+ "fsevent-sys",
"futures 0.3.28",
"itertools 0.10.5",
"libc",
diff --git a/Cargo.toml b/Cargo.toml
index c66fcb8ae589c..0a1679f17bb1c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -278,3 +278,4 @@ urlencoding = "2.1.2"
webbrowser = "0.8.7"
which = "4.4.0"
unicode-segmentation = "1.10.1"
+notify-debouncer-full = "0.3.1"
diff --git a/crates/turbo-tasks-fs/Cargo.toml b/crates/turbo-tasks-fs/Cargo.toml
index faa4bc2a73bfa..4e7dced8660c3 100644
--- a/crates/turbo-tasks-fs/Cargo.toml
+++ b/crates/turbo-tasks-fs/Cargo.toml
@@ -37,7 +37,7 @@ include_dir = { version = "0.7.2", features = ["nightly"] }
indexmap = { workspace = true }
jsonc-parser = { version = "0.21.0", features = ["serde"] }
mime = { workspace = true }
-notify = "4.0.17"
+notify-debouncer-full = { workspace = true }
parking_lot = { workspace = true }
serde = { workspace = true, features = ["rc"] }
serde_json = { workspace = true }
diff --git a/crates/turbo-tasks-fs/benches/mod.rs b/crates/turbo-tasks-fs/benches/mod.rs
index 7eb140df2b849..abb374f460a97 100644
--- a/crates/turbo-tasks-fs/benches/mod.rs
+++ b/crates/turbo-tasks-fs/benches/mod.rs
@@ -10,7 +10,10 @@ use criterion::{
measurement::{Measurement, WallTime},
BenchmarkId, Criterion,
};
-use notify::{watcher, RecursiveMode, Watcher};
+use notify_debouncer_full::{
+ new_debouncer,
+ notify::{RecursiveMode, Watcher},
+};
use tokio::runtime::Runtime;
use turbo_tasks::event::Event;
use turbo_tasks_fs::rope::{Rope, RopeBuilder};
@@ -35,8 +38,11 @@ fn bench_file_watching(c: &mut Criterion) {
let (tx, rx) = channel();
let event = Arc::new(Event::new(|| "test event".to_string()));
- let mut watcher = watcher(tx, Duration::from_micros(1)).unwrap();
- watcher.watch(temp_path, RecursiveMode::Recursive).unwrap();
+ let mut watcher = new_debouncer(Duration::from_micros(1), None, tx).unwrap();
+ watcher
+ .watcher()
+ .watch(temp_path, RecursiveMode::Recursive)
+ .unwrap();
let t = thread::spawn({
let event = event.clone();
diff --git a/crates/turbo-tasks-fs/src/lib.rs b/crates/turbo-tasks-fs/src/lib.rs
index 96ee88df64871..bbb49f19faed7 100644
--- a/crates/turbo-tasks-fs/src/lib.rs
+++ b/crates/turbo-tasks-fs/src/lib.rs
@@ -48,7 +48,13 @@ use glob::Glob;
use invalidator_map::InvalidatorMap;
use jsonc_parser::{parse_to_serde_value, ParseOptions};
use mime::Mime;
-use notify::{watcher, DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher};
+use notify_debouncer_full::{
+ notify::{
+ event::{MetadataKind, ModifyKind, RenameMode},
+ EventKind, RecommendedWatcher, RecursiveMode, Watcher,
+ },
+ DebouncedEvent, Debouncer, FileIdMap,
+};
use read_glob::read_glob;
pub use read_glob::ReadGlobResult;
use serde::{Deserialize, Serialize};
@@ -104,7 +110,7 @@ pub trait FileSystem: ValueToString {
#[derive(Default)]
struct DiskWatcher {
- watcher: Mutex