diff --git a/src/fail.rs b/src/fail.rs index c8b4e70..99d98ec 100644 --- a/src/fail.rs +++ b/src/fail.rs @@ -7,16 +7,28 @@ use async_value::AError; use termion::event::Key; use std::path::PathBuf; -use std::sync::Mutex; +use std::sync::{Arc, Mutex}; use crate::foldview::LogEntry; pub type HResult = Result; +pub type Backtrace = Arc; + +pub trait ArcBacktrace { + fn new_arced() -> Backtrace; +} + +impl ArcBacktrace for Backtrace { + fn new_arced() -> Backtrace { + Arc::new(failure::Backtrace::new()) + } +} + #[derive(Fail, Debug, Clone)] pub enum HError { #[fail(display = "IO error: {} ", _0)] - IoError(String), + IoError(String, Backtrace), #[fail(display = "Mutex failed")] MutexError, #[fail(display = "Can't lock!")] @@ -34,23 +46,11 @@ pub enum HError { #[fail(display = "Accessed stale value")] StaleError, #[fail(display = "Failed: {}", _0)] - Error(String), + Error(String, Backtrace), #[fail(display = "Was None!")] - NoneError, - #[fail(display = "Not ready yet!")] - WillBeNotReady, - #[fail(display = "Not ready yet!")] - AsyncNotReadyError, - #[fail(display = "Async is stale!")] - AsyncStaleError, - #[fail(display = "Value has already been taken!")] - AsyncAlreadyTakenError, - #[fail(display = "Async has already been started!")] - AsyncAlreadyStartedError, + NoneError(Backtrace), #[fail(display = "Async Error: {}", _0)] - AsyncError(String), - #[fail(display = "Async Error: {}", _0)] - AError(async_value::AError), + AError(async_value::AError, Backtrace), #[fail(display = "No widget found")] NoWidgetError, #[fail(display = "Path: {:?} not in this directory: {:?}", path, dir)] @@ -74,7 +74,7 @@ pub enum HError { #[fail(display = "Strip Prefix Error: {}", error)] StripPrefixError{#[cause] error: std::path::StripPrefixError}, #[fail(display = "INofify failed: {}", _0)] - INotifyError(String), + INotifyError(String, Backtrace), #[fail(display = "Tags not loaded yet")] TagsNotLoadedYetError, #[fail(display = "Input cancelled!")] @@ -159,22 +159,6 @@ impl HError { Err(HError::ConfigLineError(line)) } - pub fn async_not_ready() -> HResult { - Err(HError::AsyncNotReadyError) - } - - pub fn async_taken() -> HResult { - Err(HError::AsyncAlreadyTakenError) - } - - pub fn async_error(error: &HError) -> HResult { - Err(HError::AsyncError(format!("{}", error))) - } - - pub fn async_started() -> HResult { - Err(HError::AsyncAlreadyStartedError) - } - pub fn metadata_processed() -> HResult { Err(HError::MetadataProcessedError) } @@ -246,14 +230,16 @@ impl ErrorLog for Result { impl From for HError { fn from(error: std::io::Error) -> Self { - let err = HError::IoError(format!("{}", error)); + let err = HError::IoError(format!("{}", error), + Backtrace::new_arced()); err } } impl From for HError { fn from(error: failure::Error) -> Self { - let err = HError::Error(format!("{}", error)); + let err = HError::Error(format!("{}", error), + Backtrace::new_arced()); err } } @@ -295,7 +281,7 @@ impl From> for HError { impl From for HError { fn from(_error: std::option::NoneError) -> Self { - let err = HError::NoneError; + let err = HError::NoneError(Backtrace::new_arced()); err } } @@ -309,14 +295,16 @@ impl From for HError { impl From for HError { fn from(error: notify::Error) -> Self { - let err = HError::INotifyError(format!("{}", error)); + let err = HError::INotifyError(format!("{}", error), + Backtrace::new_arced()); err } } impl From for HError { fn from(error: async_value::AError) -> Self { - let err = HError::AError(error); + let err = HError::AError(error, + Backtrace::new_arced()); err } } diff --git a/src/file_browser.rs b/src/file_browser.rs index cdd2284..d76c6cb 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -718,10 +718,12 @@ impl FileBrowser { } pub fn cache_files(&mut self) -> HResult<()> { - let files = self.get_files()?; - let selected_file = self.selected_file().ok(); - self.fs_cache.put_files(files, selected_file).log(); - self.main_widget_mut()?.content.meta_updated = false; + if self.main_widget().is_ok() { + let files = self.get_files()?; + let selected_file = self.selected_file().ok(); + self.fs_cache.put_files(files, selected_file).log(); + self.main_widget_mut()?.content.meta_updated = false; + } // if self.cwd.parent().is_some() { diff --git a/src/fscache.rs b/src/fscache.rs index d92caab..79885f1 100644 --- a/src/fscache.rs +++ b/src/fscache.rs @@ -10,7 +10,7 @@ use std::path::PathBuf; use crate::files::{Files, File, SortBy}; use crate::widget::Events; -use crate::fail::{HResult, HError, ErrorLog}; +use crate::fail::{HResult, HError, ErrorLog, Backtrace, ArcBacktrace}; #[derive(Debug, Clone)] @@ -113,12 +113,12 @@ impl FsCache { if self.files.read()?.contains_key(dir) { self.get_cached_files(dir) } else { - self.add_watch(&dir).log(); let dir = dir.clone(); let selection = self.get_selection(&dir).ok(); let cache = self.clone(); let files = Async::new(move |_| { let mut files = Files::new_from_path_cancellable(&dir.path, stale)?; + cache.add_watch(&dir).log(); FsCache::apply_settingss(&cache, &mut files).ok(); Ok(files) }); @@ -127,11 +127,11 @@ impl FsCache { } pub fn get_files_sync(&self, dir: &File) -> HResult { - self.add_watch(&dir).log(); let files = self.get_files(&dir, Stale::new())?.1; let mut files = files.run_sync()?; FsCache::apply_settingss(&self, &mut files).ok(); let files = FsCache::ensure_not_empty(files)?; + self.add_watch(&dir).log(); Ok(files) } @@ -188,8 +188,8 @@ impl FsCache { fn add_watch(&self, dir: &File) -> HResult<()> { if !self.watched_dirs.read()?.contains(&dir) { + self.watcher.write()?.watch(&dir.path, RecursiveMode::NonRecursive)?; self.watched_dirs.write()?.insert(dir.clone()); - self.watcher.write()?.watch(&dir.path, RecursiveMode::NonRecursive)? } Ok(()) } @@ -215,7 +215,7 @@ impl FsCache { let mut files = file_cache.read() .map_err(|e| HError::from(e))? .get(&dir) - .ok_or(HError::NoneError)? + .ok_or(HError::NoneError(Backtrace::new_arced()))? .clone(); let tab_settings = &tab_settings; @@ -373,9 +373,11 @@ impl PathFromEvent for DebouncedEvent { DebouncedEvent::NoticeRemove(path) => Ok(path), DebouncedEvent::Rename(old_path, _) => Ok(old_path), DebouncedEvent::Error(err, path) - => Err(HError::INotifyError(format!("{}, {:?}", err, path))), + => Err(HError::INotifyError(format!("{}, {:?}", err, path), + Backtrace::new_arced())), DebouncedEvent::Rescan - => Err(HError::INotifyError("Need to rescan".to_string())) + => Err(HError::INotifyError("Need to rescan".to_string(), + Backtrace::new_arced())) } } diff --git a/src/proclist.rs b/src/proclist.rs index 8895a72..99a74dd 100644 --- a/src/proclist.rs +++ b/src/proclist.rs @@ -548,9 +548,11 @@ impl Widget for ProcView { fn refresh(&mut self) -> HResult<()> { self.hbox.refresh().log(); - self.show_output().log(); - self.get_listview_mut().refresh().log(); - self.get_textview().refresh().log(); + if self.get_listview().len() > 0 { + self.show_output().log(); + self.get_listview_mut().refresh().log(); + self.get_textview().refresh().log(); + } Ok(()) }