forked from rojo-rbx/rojo
New Imfs event type
This commit is contained in:
@@ -1,2 +1,8 @@
|
|||||||
// TODO: Use our own event type instead of notify's.
|
use std::path::PathBuf;
|
||||||
pub type ImfsEvent = notify::DebouncedEvent;
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum ImfsEvent {
|
||||||
|
Modified(PathBuf),
|
||||||
|
Created(PathBuf),
|
||||||
|
Removed(PathBuf),
|
||||||
|
}
|
||||||
|
|||||||
@@ -48,32 +48,17 @@ impl<F: ImfsFetcher> Imfs<F> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn commit_change(&mut self, event: &ImfsEvent) -> FsResult<()> {
|
pub fn commit_change(&mut self, event: &ImfsEvent) -> FsResult<()> {
|
||||||
use notify::DebouncedEvent::*;
|
use ImfsEvent::*;
|
||||||
|
|
||||||
log::trace!("Committing Imfs change {:?}", event);
|
log::trace!("Committing Imfs change {:?}", event);
|
||||||
|
|
||||||
match event {
|
match event {
|
||||||
Create(path) => {
|
Created(path) | Modified(path) => {
|
||||||
self.raise_file_changed(path)?;
|
self.raise_file_changed(path)?;
|
||||||
}
|
}
|
||||||
Write(path) => {
|
Removed(path) => {
|
||||||
self.raise_file_changed(path)?;
|
|
||||||
}
|
|
||||||
Remove(path) => {
|
|
||||||
self.raise_file_removed(path)?;
|
self.raise_file_removed(path)?;
|
||||||
}
|
}
|
||||||
Rename(from_path, to_path) => {
|
|
||||||
self.raise_file_removed(from_path)?;
|
|
||||||
self.raise_file_changed(to_path)?;
|
|
||||||
}
|
|
||||||
Error(err, path) => {
|
|
||||||
log::warn!("Filesystem error detected: {:?} on path {:?}", err, path);
|
|
||||||
}
|
|
||||||
Rescan => {
|
|
||||||
// FIXME: Implement rescanning
|
|
||||||
log::warn!("Unhandled filesystem rescan event");
|
|
||||||
}
|
|
||||||
NoticeWrite(_) | NoticeRemove(_) | Chmod(_) => {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ use std::{
|
|||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crossbeam_channel::{unbounded, Receiver};
|
use crossbeam_channel::{unbounded, Receiver, Sender};
|
||||||
use jod_thread::JoinHandle;
|
use jod_thread::JoinHandle;
|
||||||
use notify::{RecommendedWatcher, RecursiveMode, Watcher};
|
use notify::{DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
event::ImfsEvent,
|
event::ImfsEvent,
|
||||||
@@ -58,9 +58,7 @@ impl RealFetcher {
|
|||||||
let handle = jod_thread::Builder::new()
|
let handle = jod_thread::Builder::new()
|
||||||
.name("notify message converter".to_owned())
|
.name("notify message converter".to_owned())
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
notify_receiver
|
converter_thread(notify_receiver, sender);
|
||||||
.into_iter()
|
|
||||||
.for_each(|event| sender.send(event).unwrap());
|
|
||||||
})
|
})
|
||||||
.expect("Could not start message converter thread");
|
.expect("Could not start message converter thread");
|
||||||
|
|
||||||
@@ -84,6 +82,41 @@ impl RealFetcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn converter_thread(notify_receiver: mpsc::Receiver<DebouncedEvent>, sender: Sender<ImfsEvent>) {
|
||||||
|
notify_receiver.into_iter().for_each(|event| {
|
||||||
|
use DebouncedEvent::*;
|
||||||
|
|
||||||
|
match event {
|
||||||
|
Create(path) => sender.send(ImfsEvent::Created(path)).unwrap(),
|
||||||
|
Write(path) => sender.send(ImfsEvent::Modified(path)).unwrap(),
|
||||||
|
Remove(path) => sender.send(ImfsEvent::Removed(path)).unwrap(),
|
||||||
|
Rename(from_path, to_path) => {
|
||||||
|
sender.send(ImfsEvent::Created(from_path)).unwrap();
|
||||||
|
sender.send(ImfsEvent::Removed(to_path)).unwrap();
|
||||||
|
}
|
||||||
|
Rescan => {
|
||||||
|
log::warn!("Unhandled filesystem rescan event.");
|
||||||
|
log::warn!(
|
||||||
|
"Please file an issue! Rojo may need to handle this case, but does not yet."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Error(err, maybe_path) => {
|
||||||
|
log::warn!("Unhandled filesystem error: {}", err);
|
||||||
|
|
||||||
|
match maybe_path {
|
||||||
|
Some(path) => log::warn!("On path {}", path.display()),
|
||||||
|
None => log::warn!("No path was associated with this error."),
|
||||||
|
}
|
||||||
|
|
||||||
|
log::warn!(
|
||||||
|
"Rojo may need to handle this. If this happens again, please file an issue!"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
NoticeWrite(_) | NoticeRemove(_) | Chmod(_) => {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
impl ImfsFetcher for RealFetcher {
|
impl ImfsFetcher for RealFetcher {
|
||||||
fn file_type(&mut self, path: &Path) -> io::Result<FileType> {
|
fn file_type(&mut self, path: &Path) -> io::Result<FileType> {
|
||||||
let metadata = fs::metadata(path)?;
|
let metadata = fs::metadata(path)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user