Clean up file change tracking since I wrote it when I was sleepy

This commit is contained in:
Lucien Greathouse 2018-05-12 01:13:18 -07:00
parent 4000a40cad
commit b2f85cd665
4 changed files with 70 additions and 29 deletions

View file

@ -1,4 +1,4 @@
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf, Component};
use partition::Partition; use partition::Partition;
@ -9,9 +9,25 @@ pub struct FileRoute {
} }
impl FileRoute { impl FileRoute {
pub fn from_path(path: &Path, partition: &Partition) -> FileRoute { pub fn from_path(path: &Path, partition: &Partition) -> Option<FileRoute> {
// TODO: Needed for PartitionWatcher to changes onto FileRoute assert!(path.is_absolute());
unimplemented!()
let relative_path = path.strip_prefix(&partition.path).ok()?;
let mut route = Vec::new();
for component in relative_path.components() {
match component {
Component::Normal(piece) => {
route.push(piece.to_string_lossy().into_owned());
},
_ => panic!("Unexpected path component: {:?}", component),
}
}
Some(FileRoute {
partition: partition.name.clone(),
route,
})
} }
/// Creates a PathBuf out of the `FileRoute` based on the given partition /// Creates a PathBuf out of the `FileRoute` based on the given partition

View file

@ -1,32 +1,54 @@
use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::mpsc::{channel, Sender};
use std::time::Duration; use std::time::Duration;
use std::thread; use std::thread;
use notify::{DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher, watcher}; use notify::{DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher, watcher};
use partition::Partition; use partition::Partition;
use vfs_session::FileChange;
use file_route::FileRoute;
pub struct PartitionWatcher { pub struct PartitionWatcher {
pub watcher: RecommendedWatcher, pub watcher: RecommendedWatcher,
pub partition: Partition,
} }
impl PartitionWatcher { impl PartitionWatcher {
pub fn start_new(partition: Partition, tx: Sender<(String, DebouncedEvent)>) -> PartitionWatcher { pub fn start_new(partition: Partition, tx: Sender<FileChange>) -> PartitionWatcher {
let (watch_tx, watch_rx) = channel(); let (watch_tx, watch_rx) = channel();
let mut watcher = watcher(watch_tx, Duration::from_millis(100)).unwrap(); let mut watcher = watcher(watch_tx, Duration::from_millis(100)).unwrap();
watcher.watch(&partition.path, RecursiveMode::Recursive).unwrap(); watcher.watch(&partition.path, RecursiveMode::Recursive).unwrap();
let partition_name = partition.name.clone();
thread::spawn(move || { thread::spawn(move || {
loop { loop {
match watch_rx.recv() { match watch_rx.recv() {
// TODO: Transform DebouncedEvent to some sort of FileChange object Ok(event) => {
Ok(event) => match tx.send((partition_name.clone(), event)) { let file_change = match event {
Ok(_) => {}, DebouncedEvent::Create(path) => {
Err(_) => break, let route = FileRoute::from_path(&path, &partition).unwrap();
FileChange::Created(route)
},
DebouncedEvent::Write(path) => {
let route = FileRoute::from_path(&path, &partition).unwrap();
FileChange::Updated(route)
},
DebouncedEvent::Remove(path) => {
let route = FileRoute::from_path(&path, &partition).unwrap();
FileChange::Deleted(route)
},
DebouncedEvent::Rename(from_path, to_path) => {
let from_route = FileRoute::from_path(&from_path, &partition).unwrap();
let to_route = FileRoute::from_path(&to_path, &partition).unwrap();
FileChange::Moved(from_route, to_route)
},
_ => continue,
};
match tx.send(file_change) {
Ok(_) => {},
Err(_) => break,
}
}, },
Err(_) => break, Err(_) => break,
}; };
@ -34,7 +56,6 @@ impl PartitionWatcher {
}); });
PartitionWatcher { PartitionWatcher {
partition,
watcher, watcher,
} }
} }

View file

@ -3,7 +3,6 @@ use std::sync::{mpsc, Arc, RwLock};
use std::thread; use std::thread;
use id::{Id, get_id}; use id::{Id, get_id};
use file_route::FileRoute;
use partition::Partition; use partition::Partition;
use rbx::RbxInstance; use rbx::RbxInstance;
use rbx_session::RbxSession; use rbx_session::RbxSession;
@ -90,16 +89,20 @@ impl Session {
self.watchers.push(watcher); self.watchers.push(watcher);
} }
thread::spawn(move || { {
loop { let vfs_session = self.vfs_session.clone();
match rx.recv() { thread::spawn(move || {
Ok((partition_name, change)) => { loop {
println!("Got change {:?} on partition {}", change, partition_name); match rx.recv() {
}, Ok(change) => {
Err(_) => break, let mut vfs_session = vfs_session.write().unwrap();
vfs_session.handle_change(change);
},
Err(_) => break,
}
} }
} });
}); }
} }
pub fn get_vfs_session(&self) -> Arc<RwLock<VfsSession>> { pub fn get_vfs_session(&self) -> Arc<RwLock<VfsSession>> {

View file

@ -18,11 +18,12 @@ pub enum FileItem {
}, },
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone)]
pub enum FileChange { pub enum FileChange {
Created, Created(FileRoute),
Deleted, Deleted(FileRoute),
Modified, Updated(FileRoute),
Moved(FileRoute, FileRoute),
} }
pub struct VfsSession { pub struct VfsSession {
@ -53,8 +54,8 @@ impl VfsSession {
} }
} }
pub fn handle_change(&mut self, route: &FileRoute, change: FileChange) { pub fn handle_change(&mut self, change: FileChange) {
// TODO: Update in-memory files println!("Got change {:?}", change);
} }
fn read(&self, route: &FileRoute) -> Result<FileItem, ()> { fn read(&self, route: &FileRoute) -> Result<FileItem, ()> {