summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/commands/file_operations.rs169
-rw-r--r--src/commands/reload_dir.rs2
-rw-r--r--src/commands/set_mode.rs2
-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.rs2
-rw-r--r--src/main.rs2
-rw-r--r--src/preview.rs2
-rw-r--r--src/sort.rs2
-rw-r--r--src/tab.rs2
-rw-r--r--src/ui.rs2
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;
diff --git a/src/tab.rs b/src/tab.rs
index 94ff5aa..f7c2808 100644
--- a/src/tab.rs
+++ b/src/tab.rs
@@ -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;
diff --git a/src/ui.rs b/src/ui.rs
index 5199f9e..bf0addc 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -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;