use std::path::PathBuf;
use std::sync::atomic::AtomicU64;
use std::sync::{mpsc, Arc};
use crate::watcher_filter::SharedGitignore;
#[cfg(target_os = "macos")]
mod fsevents;
#[cfg(target_os = "linux")]
mod inotify;
#[cfg(target_os = "macos")]
pub(crate) use fsevents::ProjectWatcher;
#[cfg(target_os = "linux")]
pub(crate) use inotify::ProjectWatcher;
#[cfg(not(any(target_os = "macos", target_os = "linux")))]
pub(crate) struct ProjectWatcher {
_watcher: notify::RecommendedWatcher,
}
#[cfg(not(any(target_os = "macos", target_os = "linux")))]
impl ProjectWatcher {
fn create(
root: PathBuf,
extra_watch_paths: Vec<PathBuf>,
tx: mpsc::Sender<notify::Result<notify::Event>>,
) -> notify::Result<Self> {
use notify::{RecursiveMode, Watcher};
let mut watcher = notify::recommended_watcher(tx)?;
watcher.watch(&root, RecursiveMode::Recursive)?;
for path in extra_watch_paths {
if path.exists() {
watcher.watch(&path, RecursiveMode::NonRecursive)?;
}
}
Ok(Self { _watcher: watcher })
}
}
pub(crate) fn create_project_watcher(
root: PathBuf,
extra_watch_paths: Vec<PathBuf>,
tx: mpsc::Sender<notify::Result<notify::Event>>,
matcher: SharedGitignore,
matcher_generation: Arc<AtomicU64>,
) -> notify::Result<ProjectWatcher> {
#[cfg(target_os = "macos")]
{
return ProjectWatcher::create(root, extra_watch_paths, tx, matcher, matcher_generation);
}
#[cfg(target_os = "linux")]
{
return ProjectWatcher::create(root, extra_watch_paths, tx, matcher, matcher_generation);
}
#[cfg(not(any(target_os = "macos", target_os = "linux")))]
{
let _ = (matcher, matcher_generation);
ProjectWatcher::create(root, extra_watch_paths, tx)
}
}
#[cfg(any(target_os = "macos", target_os = "linux"))]
pub(crate) fn log_exclusions(root: &std::path::Path, exclusions: &[PathBuf]) {
let rendered = exclusions
.iter()
.map(|path| path.display().to_string())
.collect::<Vec<_>>()
.join(", ");
crate::slog_info!(
"watcher exclusions for {} ({}): [{}]",
root.display(),
exclusions.len(),
rendered
);
}