diff options
-rw-r--r-- | src/commands/file_operations.rs | 169 | ||||
-rw-r--r-- | src/commands/reload_dir.rs | 2 | ||||
-rw-r--r-- | src/commands/set_mode.rs | 2 | ||||
-rw-r--r-- | src/fs/dirlist.rs (renamed from src/io/dirlist.rs) | 2 | ||||
-rw-r--r-- | src/fs/entry.rs (renamed from src/io/entry.rs) | 2 | ||||
-rw-r--r-- | src/fs/metadata.rs (renamed from src/io/metadata.rs) | 0 | ||||
-rw-r--r-- | src/fs/mod.rs (renamed from src/io/mod.rs) | 0 | ||||
-rw-r--r-- | src/history.rs | 2 | ||||
-rw-r--r-- | src/main.rs | 2 | ||||
-rw-r--r-- | src/preview.rs | 2 | ||||
-rw-r--r-- | src/sort.rs | 2 | ||||
-rw-r--r-- | src/tab.rs | 2 | ||||
-rw-r--r-- | src/ui.rs | 2 |
13 files changed, 31 insertions, 158 deletions
diff --git a/src/commands/file_operations.rs b/src/commands/file_operations.rs index 1baf178..f573951 100644 --- a/src/commands/file_operations.rs +++ b/src/commands/file_operations.rs @@ -7,7 +7,7 @@ use std::time; use crate::commands::{JoshutoCommand, JoshutoRunnable, ProgressInfo}; use crate::context::JoshutoContext; use crate::error::JoshutoError; -use crate::io::JoshutoDirList; +use crate::fs::JoshutoDirList; use crate::window::JoshutoView; lazy_static! { @@ -209,6 +209,14 @@ impl PasteFiles { &self, context: &mut JoshutoContext, ) -> Result<FileOperationThread, std::io::Error> { + let tab_src = TAB_SRC.load(atomic::Ordering::SeqCst); + let tab_dest = context.curr_tab_index; + let destination = context.tabs[tab_dest].curr_path.clone(); + + let options = self.options.clone(); + + let (tx, rx) = mpsc::channel(); + let paths = SELECTED_FILES.lock().unwrap().take(); match paths { Some(paths) => { @@ -219,14 +227,6 @@ impl PasteFiles { )); } - let tab_src = TAB_SRC.load(atomic::Ordering::SeqCst); - let tab_dest = context.curr_tab_index; - let destination = context.tabs[tab_dest].curr_path.clone(); - - let options = self.options.clone(); - - let (tx, rx) = mpsc::channel(); - let handle = thread::spawn(move || fs_cut_thread(options, tx, destination, paths)); let thread = FileOperationThread { @@ -260,22 +260,22 @@ impl PasteFiles { match paths { Some(paths) => { if paths.is_empty() { - Err(std::io::Error::new( + return Err(std::io::Error::new( std::io::ErrorKind::Other, "no files selected", )) - } else { - let handle = - thread::spawn(move || fs_copy_thread(options, tx, destination, paths)); - - let thread = FileOperationThread { - tab_src, - tab_dest, - handle, - recv: rx, - }; - Ok(thread) } + + let handle = + thread::spawn(move || fs_copy_thread(options, tx, destination, paths)); + + let thread = FileOperationThread { + tab_src, + tab_dest, + handle, + recv: rx, + }; + Ok(thread) } None => Err(std::io::Error::new( std::io::ErrorKind::Other, @@ -284,130 +284,3 @@ impl PasteFiles { } } } - -fn fs_cut_thread( - options: fs_extra::dir::CopyOptions, - tx: mpsc::Sender<ProgressInfo>, - dest: path::PathBuf, - paths: Vec<path::PathBuf>, -) -> std::result::Result<(), std::io::Error> { - let mut progress_info = ProgressInfo { - bytes_finished: 4, - total_bytes: paths.len() as u64 + 4, - }; - - let mut destination = dest; - - for path in paths { - let file_name = path.file_name().unwrap().to_os_string(); - - destination.push(file_name.clone()); - if !options.skip_exist { - rename_filename_conflict(&mut destination); - } - match std::fs::rename(&path, &destination) { - Ok(_) => {} - Err(_) => { - if path.symlink_metadata()?.is_dir() { - std::fs::create_dir(&destination)?; - let cpath: Vec<path::PathBuf> = std::fs::read_dir(&path)? - .filter_map(|s| match s { - Ok(s) => Some(s.path()), - _ => None, - }) - .collect(); - - let handle = |process_info: fs_extra::TransitProcess| { - let progress_info = ProgressInfo { - bytes_finished: process_info.copied_bytes, - total_bytes: process_info.total_bytes, - }; - tx.send(progress_info.clone()).unwrap(); - fs_extra::dir::TransitProcessResult::ContinueOrAbort - }; - - if let Err(e) = - fs_extra::move_items_with_progress(&cpath, &destination, &options, handle) - { - let err = std::io::Error::new(std::io::ErrorKind::Other, format!("{}", e)); - return Err(err); - } - std::fs::remove_dir_all(&path)?; - } else { - std::fs::copy(&path, &destination)?; - std::fs::remove_file(&path)?; - } - } - } - destination.pop(); - progress_info.bytes_finished += 1; - tx.send(progress_info.clone()).unwrap(); - } - Ok(()) -} - -fn fs_copy_thread( - options: fs_extra::dir::CopyOptions, - tx: mpsc::Sender<ProgressInfo>, - dest: path::PathBuf, - paths: Vec<path::PathBuf>, -) -> std::result::Result<(), std::io::Error> { - let mut progress_info = ProgressInfo { - bytes_finished: 1, - total_bytes: paths.len() as u64 + 1, - }; - - let mut destination = dest; - - for path in &paths { - let file_name = path.file_name().unwrap().to_os_string(); - - if path.symlink_metadata()?.is_dir() { - destination.push(file_name.clone()); - if !options.skip_exist { - rename_filename_conflict(&mut destination); - } - std::fs::create_dir(&destination)?; - let path: Vec<path::PathBuf> = std::fs::read_dir(path)? - .filter_map(|s| match s { - Ok(s) => Some(s.path()), - _ => None, - }) - .collect(); - - let handle = |process_info: fs_extra::TransitProcess| { - let progress_info = ProgressInfo { - bytes_finished: process_info.copied_bytes, - total_bytes: process_info.total_bytes, - }; - tx.send(progress_info.clone()).unwrap(); - fs_extra::dir::TransitProcessResult::ContinueOrAbort - }; - - if let Err(e) = - fs_extra::copy_items_with_progress(&path, &destination, &options, handle) - { - let err = std::io::Error::new(std::io::ErrorKind::Other, format!("{}", e)); - return Err(err); - } - } else { - destination.push(file_name.clone()); - if !options.skip_exist { - rename_filename_conflict(&mut destination); - } - let res = std::fs::copy(&path, &destination)?; - let mut prog_info = ProgressInfo { - bytes_finished: 0, - total_bytes: res, - }; - while prog_info.bytes_finished < prog_info.total_bytes { - prog_info.bytes_finished += 4096; - tx.send(prog_info.clone()).unwrap(); - } - } - destination.pop(); - progress_info.bytes_finished += 1; - tx.send(progress_info.clone()).unwrap(); - } - Ok(()) -} diff --git a/src/commands/reload_dir.rs b/src/commands/reload_dir.rs index 0584125..b0d5c7a 100644 --- a/src/commands/reload_dir.rs +++ b/src/commands/reload_dir.rs @@ -1,7 +1,7 @@ use crate::commands::{JoshutoCommand, JoshutoRunnable}; use crate::context::JoshutoContext; use crate::error::JoshutoError; -use crate::io::JoshutoDirList; +use crate::fs::JoshutoDirList; use crate::window::JoshutoView; use std::collections::hash_map::Entry; diff --git a/src/commands/set_mode.rs b/src/commands/set_mode.rs index 8da3bfa..7b7e32b 100644 --- a/src/commands/set_mode.rs +++ b/src/commands/set_mode.rs @@ -1,7 +1,7 @@ use crate::commands::{CursorMoveDown, JoshutoCommand, JoshutoRunnable}; use crate::context::JoshutoContext; use crate::error::JoshutoError; -use crate::io::JoshutoDirEntry; +use crate::fs::JoshutoDirEntry; use crate::textfield::JoshutoTextField; use crate::ui; use crate::unix; diff --git a/src/io/dirlist.rs b/src/fs/dirlist.rs index 1b8d203..fe468ce 100644 --- a/src/io/dirlist.rs +++ b/src/fs/dirlist.rs @@ -1,6 +1,6 @@ use std::{fs, path}; -use crate::io::{JoshutoDirEntry, JoshutoMetadata}; +use crate::fs::{JoshutoDirEntry, JoshutoMetadata}; use crate::sort; use crate::window::JoshutoPageState; diff --git a/src/io/entry.rs b/src/fs/entry.rs index 4c692dd..02a4ef1 100644 --- a/src/io/entry.rs +++ b/src/fs/entry.rs @@ -1,6 +1,6 @@ use std::{fs, io, path}; -use crate::io::JoshutoMetadata; +use crate::fs::JoshutoMetadata; #[derive(Clone)] pub struct JoshutoDirEntry { diff --git a/src/io/metadata.rs b/src/fs/metadata.rs index fb85a6e..fb85a6e 100644 --- a/src/io/metadata.rs +++ b/src/fs/metadata.rs diff --git a/src/io/mod.rs b/src/fs/mod.rs index 632c2ff..632c2ff 100644 --- a/src/io/mod.rs +++ b/src/fs/mod.rs diff --git a/src/history.rs b/src/history.rs index df8e458..fb2eeeb 100644 --- a/src/history.rs +++ b/src/history.rs @@ -1,7 +1,7 @@ use std::collections::{hash_map::Entry, HashMap}; use std::path::{Path, PathBuf}; -use crate::io::JoshutoDirList; +use crate::fs::JoshutoDirList; use crate::sort; pub trait DirectoryHistory { diff --git a/src/main.rs b/src/main.rs index 9bf9f68..e49bae1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ mod config; mod context; mod error; mod history; -mod io; +mod fs; mod preview; mod run; mod sort; diff --git a/src/preview.rs b/src/preview.rs index ede388d..282ae43 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -4,7 +4,7 @@ use std::path; use std::process; use crate::config::{JoshutoConfig, JoshutoPreviewEntry}; -use crate::io::{JoshutoDirEntry, JoshutoDirList}; +use crate::fs::{JoshutoDirEntry, JoshutoDirList}; use crate::tab::JoshutoTab; use crate::ui; use crate::window::panel::JoshutoPanel; diff --git a/src/sort.rs b/src/sort.rs index acc474e..5bb6112 100644 --- a/src/sort.rs +++ b/src/sort.rs @@ -2,7 +2,7 @@ use std::cmp; use std::fs; use std::time; -use crate::io::JoshutoDirEntry; +use crate::fs::JoshutoDirEntry; use alphanumeric_sort::compare_str; use serde_derive::Deserialize; @@ -1,7 +1,7 @@ use std::path::PathBuf; use crate::history::{DirectoryHistory, JoshutoHistory}; -use crate::io::JoshutoDirList; +use crate::fs::JoshutoDirList; use crate::preview; use crate::sort; use crate::ui; @@ -6,7 +6,7 @@ use users::UsersCache; use crate::config::{JoshutoColorTheme, JoshutoConfig}; use crate::context::JoshutoContext; -use crate::io::{JoshutoDirEntry, JoshutoDirList}; +use crate::fs::{JoshutoDirEntry, JoshutoDirList}; use crate::unix; use crate::window; |