mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
reimplemented copy trait
This commit is contained in:
parent
670cfb3647
commit
b32847afba
8 changed files with 95 additions and 59 deletions
19
Cargo.lock
generated
19
Cargo.lock
generated
|
|
@ -279,12 +279,6 @@ version = "1.0.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "cfg_aliases"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.38"
|
||||
|
|
@ -1267,18 +1261,6 @@ version = "0.1.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b"
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.28.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
|
||||
dependencies = [
|
||||
"bitflags 2.5.0",
|
||||
"cfg-if",
|
||||
"cfg_aliases",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
|
|
@ -2843,7 +2825,6 @@ dependencies = [
|
|||
"futures",
|
||||
"libc",
|
||||
"mlua",
|
||||
"nix",
|
||||
"ratatui",
|
||||
"scopeguard",
|
||||
"signal-hook-tokio",
|
||||
|
|
|
|||
|
|
@ -2,21 +2,27 @@ use std::ops::Deref;
|
|||
|
||||
use mlua::{AnyUserData, IntoLua, Lua, UserDataFields, UserDataMethods};
|
||||
use yazi_config::THEME;
|
||||
use yazi_plugin::{bindings::{Cast, Cha, Icon, Range}, elements::Style, url::Url};
|
||||
use yazi_plugin::{
|
||||
bindings::{Cast, Cha, Icon, Range},
|
||||
elements::Style,
|
||||
url::Url,
|
||||
};
|
||||
use yazi_shared::MIME_DIR;
|
||||
|
||||
use super::{CtxRef, SCOPE};
|
||||
|
||||
pub(super) struct File {
|
||||
idx: usize,
|
||||
idx: usize,
|
||||
folder: *const yazi_core::folder::Folder,
|
||||
tab: *const yazi_core::tab::Tab,
|
||||
tab: *const yazi_core::tab::Tab,
|
||||
}
|
||||
|
||||
impl Deref for File {
|
||||
type Target = yazi_shared::fs::File;
|
||||
|
||||
fn deref(&self) -> &Self::Target { &self.folder().files[self.idx] }
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.folder().files[self.idx]
|
||||
}
|
||||
}
|
||||
|
||||
impl File {
|
||||
|
|
@ -33,7 +39,7 @@ impl File {
|
|||
lua.register_userdata_type::<Self>(|reg| {
|
||||
reg.add_field_method_get("idx", |_, me| Ok(me.idx + 1));
|
||||
reg.add_field_method_get("url", |lua, me| Url::cast(lua, me.url.clone()));
|
||||
reg.add_field_method_get("cha", |lua, me| Cha::cast(lua, me.cha.clone()));
|
||||
reg.add_field_method_get("cha", |lua, me| Cha::cast(lua, me.cha));
|
||||
reg.add_field_method_get("link_to", |lua, me| {
|
||||
me.link_to.as_ref().cloned().map(|u| Url::cast(lua, u)).transpose()
|
||||
});
|
||||
|
|
@ -131,8 +137,12 @@ impl File {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
fn folder(&self) -> &yazi_core::folder::Folder { unsafe { &*self.folder } }
|
||||
fn folder(&self) -> &yazi_core::folder::Folder {
|
||||
unsafe { &*self.folder }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn tab(&self) -> &yazi_core::tab::Tab { unsafe { &*self.tab } }
|
||||
fn tab(&self) -> &yazi_core::tab::Tab {
|
||||
unsafe { &*self.tab }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ function Folder:linemode(area, files)
|
|||
elseif mode == "permissions" then
|
||||
spans[#spans + 1] = ui.Span(f.cha:permissions() or "")
|
||||
elseif mode == "owner" then
|
||||
spans[#spans + 1] = ui.Span(f.cha.owner or "")
|
||||
spans[#spans + 1] = ui.Span(f.cha:owner() or "")
|
||||
end
|
||||
|
||||
spans[#spans + 1] = ui.Span(" ")
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ impl Cha {
|
|||
{
|
||||
reg.add_field_method_get("uid", |_, me| Ok(me.uid));
|
||||
reg.add_field_method_get("gid", |_, me| Ok(me.gid));
|
||||
reg.add_field_method_get("owner", |_, me| Ok(me.owner.clone()));
|
||||
}
|
||||
|
||||
reg.add_field_method_get("length", |_, me| Ok(me.len));
|
||||
|
|
@ -45,6 +44,14 @@ impl Cha {
|
|||
None::<String>,
|
||||
)
|
||||
});
|
||||
reg.add_method("owner", |_, me, ()| {
|
||||
Ok(
|
||||
#[cfg(unix)]
|
||||
Some(yazi_shared::fs::owner(me.uid, me.gid)),
|
||||
#[cfg(windows)]
|
||||
None::<String>,
|
||||
)
|
||||
});
|
||||
})?;
|
||||
|
||||
Ok(())
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ impl File {
|
|||
pub fn register(lua: &Lua) -> mlua::Result<()> {
|
||||
lua.register_userdata_type::<yazi_shared::fs::File>(|reg| {
|
||||
reg.add_field_method_get("url", |lua, me| Url::cast(lua, me.url.clone()));
|
||||
reg.add_field_method_get("cha", |lua, me| Cha::cast(lua, me.cha.clone()));
|
||||
reg.add_field_method_get("cha", |lua, me| Cha::cast(lua, me.cha));
|
||||
reg.add_field_method_get("link_to", |lua, me| {
|
||||
me.link_to.as_ref().cloned().map(|u| Url::cast(lua, u)).transpose()
|
||||
});
|
||||
|
|
|
|||
|
|
@ -2,20 +2,15 @@ use mlua::{AnyUserData, IntoLuaMulti, Lua, Table, Value};
|
|||
use yazi_shared::{emit, event::Cmd, Layer, PeekError};
|
||||
|
||||
use super::Utils;
|
||||
use crate::{
|
||||
bindings::{FileRef, Window},
|
||||
cast_to_renderable,
|
||||
elements::{Paragraph, RectRef, Renderable},
|
||||
external::{self, Highlighter},
|
||||
};
|
||||
use crate::{bindings::{FileRef, Window}, cast_to_renderable, elements::{Paragraph, RectRef, Renderable}, external::{self, Highlighter}};
|
||||
|
||||
pub struct PreviewLock {
|
||||
pub url: yazi_shared::fs::Url,
|
||||
pub cha: yazi_shared::fs::Cha,
|
||||
|
||||
pub skip: usize,
|
||||
pub skip: usize,
|
||||
pub window: Window,
|
||||
pub data: Vec<Box<dyn Renderable + Send>>,
|
||||
pub data: Vec<Box<dyn Renderable + Send>>,
|
||||
}
|
||||
|
||||
impl<'a> TryFrom<Table<'a>> for PreviewLock {
|
||||
|
|
@ -24,11 +19,11 @@ impl<'a> TryFrom<Table<'a>> for PreviewLock {
|
|||
fn try_from(t: Table) -> Result<Self, Self::Error> {
|
||||
let file: FileRef = t.raw_get("file")?;
|
||||
Ok(Self {
|
||||
url: file.url(),
|
||||
cha: file.cha.clone(),
|
||||
skip: t.raw_get("skip")?,
|
||||
url: file.url(),
|
||||
cha: file.cha,
|
||||
skip: t.raw_get("skip")?,
|
||||
window: t.raw_get("window")?,
|
||||
data: Default::default(),
|
||||
data: Default::default(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ bitflags! {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default)]
|
||||
#[derive(Clone, Copy, Debug, Default)]
|
||||
pub struct Cha {
|
||||
pub kind: ChaKind,
|
||||
pub len: u64,
|
||||
|
|
@ -31,8 +31,6 @@ pub struct Cha {
|
|||
pub uid: u32,
|
||||
#[cfg(unix)]
|
||||
pub gid: u32,
|
||||
#[cfg(unix)]
|
||||
pub owner: String,
|
||||
}
|
||||
|
||||
impl From<Metadata> for Cha {
|
||||
|
|
@ -82,12 +80,6 @@ impl From<Metadata> for Cha {
|
|||
use std::os::unix::fs::MetadataExt;
|
||||
m.gid()
|
||||
},
|
||||
#[cfg(unix)]
|
||||
owner: {
|
||||
use std::os::unix::fs::MetadataExt;
|
||||
users::get_user_by_uid(m.uid()).unwrap().name().to_str().unwrap_or_default().to_string()
|
||||
+ " " + users::get_group_by_gid(m.gid()).unwrap().name().to_str().unwrap_or_default()
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,16 @@
|
|||
use std::{collections::VecDeque, fs::Metadata, path::{Path, PathBuf}};
|
||||
use std::{
|
||||
collections::VecDeque,
|
||||
fs::Metadata,
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
|
||||
use anyhow::Result;
|
||||
use filetime::{set_file_mtime, FileTime};
|
||||
use tokio::{fs, io, select, sync::{mpsc, oneshot}, time};
|
||||
use tokio::{
|
||||
fs, io, select,
|
||||
sync::{mpsc, oneshot},
|
||||
time,
|
||||
};
|
||||
|
||||
pub async fn accessible(path: &Path) -> bool {
|
||||
match fs::symlink_metadata(path).await {
|
||||
|
|
@ -103,7 +111,10 @@ pub fn copy_with_progress(
|
|||
#[cfg(unix)]
|
||||
#[allow(clippy::collapsible_else_if)]
|
||||
pub fn permissions(m: libc::mode_t) -> String {
|
||||
use libc::{S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFLNK, S_IFMT, S_IFSOCK, S_IRGRP, S_IROTH, S_IRUSR, S_ISGID, S_ISUID, S_ISVTX, S_IWGRP, S_IWOTH, S_IWUSR, S_IXGRP, S_IXOTH, S_IXUSR};
|
||||
use libc::{
|
||||
S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFLNK, S_IFMT, S_IFSOCK, S_IRGRP, S_IROTH, S_IRUSR,
|
||||
S_ISGID, S_ISUID, S_ISVTX, S_IWGRP, S_IWOTH, S_IWUSR, S_IXGRP, S_IXOTH, S_IXUSR,
|
||||
};
|
||||
let mut s = String::with_capacity(10);
|
||||
|
||||
// File type
|
||||
|
|
@ -121,32 +132,72 @@ pub fn permissions(m: libc::mode_t) -> String {
|
|||
s.push(if m & S_IRUSR != 0 { 'r' } else { '-' });
|
||||
s.push(if m & S_IWUSR != 0 { 'w' } else { '-' });
|
||||
s.push(if m & S_IXUSR != 0 {
|
||||
if m & S_ISUID != 0 { 's' } else { 'x' }
|
||||
if m & S_ISUID != 0 {
|
||||
's'
|
||||
} else {
|
||||
'x'
|
||||
}
|
||||
} else {
|
||||
if m & S_ISUID != 0 { 'S' } else { '-' }
|
||||
if m & S_ISUID != 0 {
|
||||
'S'
|
||||
} else {
|
||||
'-'
|
||||
}
|
||||
});
|
||||
|
||||
// Group
|
||||
s.push(if m & S_IRGRP != 0 { 'r' } else { '-' });
|
||||
s.push(if m & S_IWGRP != 0 { 'w' } else { '-' });
|
||||
s.push(if m & S_IXGRP != 0 {
|
||||
if m & S_ISGID != 0 { 's' } else { 'x' }
|
||||
if m & S_ISGID != 0 {
|
||||
's'
|
||||
} else {
|
||||
'x'
|
||||
}
|
||||
} else {
|
||||
if m & S_ISGID != 0 { 'S' } else { '-' }
|
||||
if m & S_ISGID != 0 {
|
||||
'S'
|
||||
} else {
|
||||
'-'
|
||||
}
|
||||
});
|
||||
|
||||
// Other
|
||||
s.push(if m & S_IROTH != 0 { 'r' } else { '-' });
|
||||
s.push(if m & S_IWOTH != 0 { 'w' } else { '-' });
|
||||
s.push(if m & S_IXOTH != 0 {
|
||||
if m & S_ISVTX != 0 { 't' } else { 'x' }
|
||||
if m & S_ISVTX != 0 {
|
||||
't'
|
||||
} else {
|
||||
'x'
|
||||
}
|
||||
} else {
|
||||
if m & S_ISVTX != 0 { 'T' } else { '-' }
|
||||
if m & S_ISVTX != 0 {
|
||||
'T'
|
||||
} else {
|
||||
'-'
|
||||
}
|
||||
});
|
||||
|
||||
s
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
pub fn owner(uid: u32, gid: u32) -> String {
|
||||
let username = match users::get_user_by_uid(uid) {
|
||||
Some(u) => u.name().to_str().unwrap_or_default().to_string(),
|
||||
None => String::default(),
|
||||
};
|
||||
let groupname = match users::get_group_by_gid(gid) {
|
||||
Some(g) => g.name().to_str().unwrap_or_default().to_string(),
|
||||
None => String::default(),
|
||||
};
|
||||
format!("{username} {groupname}")
|
||||
//users::get_user_by_uid(uid).unwrap().name().to_str().unwrap_or_default().to_string()
|
||||
//+ " "
|
||||
//+ users::get_group_by_gid(gid).unwrap().name().to_str().unwrap_or_default()
|
||||
}
|
||||
|
||||
// Find the max common root in a list of files
|
||||
// e.g. /a/b/c, /a/b/d -> /a/b
|
||||
// /aa/bb/cc, /aa/dd/ee -> /aa
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue