mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
..
This commit is contained in:
parent
0c18664419
commit
c362137361
2 changed files with 18 additions and 10 deletions
|
|
@ -3,7 +3,7 @@ use std::{borrow::Cow, collections::VecDeque, fs::Metadata, path::{Path, PathBuf
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
use futures::{future::BoxFuture, FutureExt};
|
use futures::{future::BoxFuture, FutureExt};
|
||||||
use tokio::{fs, io::{self, ErrorKind::{AlreadyExists, NotFound}}, sync::mpsc};
|
use tokio::{fs, io::{self, ErrorKind::{AlreadyExists, NotFound}}, sync::mpsc};
|
||||||
use tracing::{debug, warn};
|
use tracing::warn;
|
||||||
use yazi_config::TASKS;
|
use yazi_config::TASKS;
|
||||||
use yazi_shared::fs::{accessible, calculate_size, copy_with_progress, path_relative_to, Url};
|
use yazi_shared::fs::{accessible, calculate_size, copy_with_progress, path_relative_to, Url};
|
||||||
|
|
||||||
|
|
@ -134,15 +134,6 @@ impl File {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn paste(&self, mut task: FileOpPaste) -> Result<()> {
|
pub async fn paste(&self, mut task: FileOpPaste) -> Result<()> {
|
||||||
// Prevent pasting of a directory into itself
|
|
||||||
if task.from.is_dir() && task.to.as_path().starts_with(task.from.as_path()) {
|
|
||||||
debug!(
|
|
||||||
"file_paste: cannot paste directory into itself, skipping {:?} -> {:?}",
|
|
||||||
task.from, task.to
|
|
||||||
);
|
|
||||||
return self.succ(task.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if task.cut {
|
if task.cut {
|
||||||
match fs::rename(&task.from, &task.to).await {
|
match fs::rename(&task.from, &task.to).await {
|
||||||
Ok(_) => return self.succ(task.id),
|
Ok(_) => return self.succ(task.id),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use std::{borrow::Cow, ffi::OsString, sync::Arc, time::Duration};
|
use std::{borrow::Cow, ffi::OsString, sync::Arc, time::Duration};
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
use futures::{future::BoxFuture, FutureExt};
|
use futures::{future::BoxFuture, FutureExt};
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use tokio::{fs, select, sync::{mpsc::{self, UnboundedReceiver}, oneshot}, task::JoinHandle};
|
use tokio::{fs, select, sync::{mpsc::{self, UnboundedReceiver}, oneshot}, task::JoinHandle};
|
||||||
|
|
@ -71,6 +72,11 @@ impl Scheduler {
|
||||||
let mut ongoing = self.ongoing.lock();
|
let mut ongoing = self.ongoing.lock();
|
||||||
let id = ongoing.add(TaskKind::User, format!("Cut {:?} to {:?}", from, to));
|
let id = ongoing.add(TaskKind::User, format!("Cut {:?} to {:?}", from, to));
|
||||||
|
|
||||||
|
if to.starts_with(&from) {
|
||||||
|
self.new_and_fail(id, "Cannot cut directory into itself").ok();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ongoing.hooks.insert(id, {
|
ongoing.hooks.insert(id, {
|
||||||
let ongoing = self.ongoing.clone();
|
let ongoing = self.ongoing.clone();
|
||||||
let (from, to) = (from.clone(), to.clone());
|
let (from, to) = (from.clone(), to.clone());
|
||||||
|
|
@ -104,6 +110,11 @@ impl Scheduler {
|
||||||
let name = format!("Copy {:?} to {:?}", from, to);
|
let name = format!("Copy {:?} to {:?}", from, to);
|
||||||
let id = self.ongoing.lock().add(TaskKind::User, name);
|
let id = self.ongoing.lock().add(TaskKind::User, name);
|
||||||
|
|
||||||
|
if to.starts_with(&from) {
|
||||||
|
self.new_and_fail(id, "Cannot copy directory into itself").ok();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let file = self.file.clone();
|
let file = self.file.clone();
|
||||||
_ = self.micro.try_send(
|
_ = self.micro.try_send(
|
||||||
async move {
|
async move {
|
||||||
|
|
@ -399,4 +410,10 @@ impl Scheduler {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_and_fail(&self, id: usize, reason: &str) -> Result<()> {
|
||||||
|
self.prog.send(TaskProg::New(id, 0))?;
|
||||||
|
self.prog.send(TaskProg::Fail(id, reason.to_owned()))?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue