diff --git a/Cargo.lock b/Cargo.lock index c7827ed41..91758e68a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1980,11 +1980,11 @@ dependencies = [ [[package]] name = "file-id" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6584280525fb2059cba3db2c04abf947a1a29a45ddae89f3870f8281704fafc9" +checksum = "6bc904b9bbefcadbd8e3a9fb0d464a9b979de6324c03b3c663e8994f46a5be36" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2935,9 +2935,9 @@ dependencies = [ [[package]] name = "inotify" -version = "0.9.6" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" dependencies = [ "bitflags 1.3.2", "inotify-sys", @@ -3498,18 +3498,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - [[package]] name = "mio" version = "1.0.2" @@ -3518,6 +3506,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3661,35 +3650,33 @@ dependencies = [ [[package]] name = "notify" -version = "6.1.1" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" dependencies = [ "bitflags 2.6.0", - "crossbeam-channel", "filetime", "fsevent-sys", "inotify", "kqueue", "libc", "log", - "mio 0.8.11", - "serde", + "mio", + "notify-types", "walkdir", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "notify-debouncer-full" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fd166739789c9ff169e654dc1501373db9d80a4c3f972817c8a4d7cf8f34e" +checksum = "9dcf855483228259b2353f89e99df35fc639b2b2510d1166e4858e3f67ec1afb" dependencies = [ - "crossbeam-channel", "file-id", "log", "notify", - "parking_lot", + "notify-types", "walkdir", ] @@ -3706,6 +3693,16 @@ dependencies = [ "zbus", ] +[[package]] +name = "notify-types" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7393c226621f817964ffb3dc5704f9509e107a8b024b489cc2c1b217378785df" +dependencies = [ + "instant", + "serde", +] + [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -7048,7 +7045,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", diff --git a/examples/api/src-tauri/capabilities/desktop.json b/examples/api/src-tauri/capabilities/desktop.json index 2edd44cdf..82d8354f5 100644 --- a/examples/api/src-tauri/capabilities/desktop.json +++ b/examples/api/src-tauri/capabilities/desktop.json @@ -9,6 +9,8 @@ "updater:default", "global-shortcut:allow-unregister", "global-shortcut:allow-register", - "global-shortcut:allow-unregister-all" + "global-shortcut:allow-unregister-all", + { "identifier": "fs:allow-watch", "allow": ["*", "**/*"] }, + "fs:allow-unwatch" ] } diff --git a/plugins/fs/Cargo.toml b/plugins/fs/Cargo.toml index cd4e77168..5d9a7efb6 100644 --- a/plugins/fs/Cargo.toml +++ b/plugins/fs/Cargo.toml @@ -35,8 +35,12 @@ url = { workspace = true } anyhow = "1" uuid = { version = "1", features = ["v4"] } glob = "0.3" -notify = { version = "6", optional = true, features = ["serde"] } -notify-debouncer-full = { version = "0.3", optional = true } +# TODO: Remove `serialization-compat-6` in v3 +notify = { version = "7", optional = true, features = [ + "serde", + "serialization-compat-6", +] } +notify-debouncer-full = { version = "0.4", optional = true } dunce = { workspace = true } percent-encoding = "2" diff --git a/plugins/fs/src/watcher.rs b/plugins/fs/src/watcher.rs index cf2af5039..7d8518228 100644 --- a/plugins/fs/src/watcher.rs +++ b/plugins/fs/src/watcher.rs @@ -3,7 +3,7 @@ // SPDX-License-Identifier: MIT use notify::{Config, Event, RecommendedWatcher, RecursiveMode, Watcher}; -use notify_debouncer_full::{new_debouncer, DebounceEventResult, Debouncer, FileIdMap}; +use notify_debouncer_full::{new_debouncer, DebounceEventResult, Debouncer, RecommendedCache}; use serde::Deserialize; use tauri::{ ipc::{Channel, CommandScope, GlobalScope}, @@ -47,7 +47,7 @@ impl WatcherResource { impl Resource for WatcherResource {} enum WatcherKind { - Debouncer(Debouncer), + Debouncer(Debouncer), Watcher(RecommendedWatcher), } @@ -111,8 +111,7 @@ pub async fn watch( let (tx, rx) = channel(); let mut debouncer = new_debouncer(Duration::from_millis(delay), None, tx)?; for path in &resolved_paths { - debouncer.watcher().watch(path.as_ref(), recursive_mode)?; - debouncer.cache().add_root(path, recursive_mode); + debouncer.watch(path, recursive_mode)?; } watch_debounced(on_event, rx); WatcherKind::Debouncer(debouncer) @@ -120,7 +119,7 @@ pub async fn watch( let (tx, rx) = channel(); let mut watcher = RecommendedWatcher::new(tx, Config::default())?; for path in &resolved_paths { - watcher.watch(path.as_ref(), recursive_mode)?; + watcher.watch(path, recursive_mode)?; } watch_raw(on_event, rx); WatcherKind::Watcher(watcher) @@ -140,14 +139,14 @@ pub async fn unwatch(webview: Webview, rid: ResourceId) -> Comman match &mut watcher.kind { WatcherKind::Debouncer(ref mut debouncer) => { for path in &watcher.paths { - debouncer.watcher().unwatch(path.as_ref()).map_err(|e| { + debouncer.unwatch(path).map_err(|e| { format!("failed to unwatch path: {} with error: {e}", path.display()) })?; } } WatcherKind::Watcher(ref mut w) => { for path in &watcher.paths { - w.unwatch(path.as_ref()).map_err(|e| { + w.unwatch(path).map_err(|e| { format!("failed to unwatch path: {} with error: {e}", path.display()) })?; }