feat: add is_exec and is_sticky to Cha bindings (#875)

This commit is contained in:
三咲雅 · Misaki Masa 2024-04-05 17:11:40 +08:00 committed by GitHub
parent d04b549f4e
commit 4755654224
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 37 additions and 18 deletions

2
Cargo.lock generated
View File

@ -3071,6 +3071,7 @@ dependencies = [
"clap_complete_fig", "clap_complete_fig",
"clap_complete_nushell", "clap_complete_nushell",
"serde", "serde",
"uzers",
"vergen", "vergen",
"yazi-adaptor", "yazi-adaptor",
"yazi-config", "yazi-config",
@ -3139,6 +3140,7 @@ dependencies = [
"serde_json", "serde_json",
"tokio", "tokio",
"tracing", "tracing",
"uzers",
"yazi-boot", "yazi-boot",
"yazi-shared", "yazi-shared",
] ]

View File

@ -23,3 +23,6 @@ clap_complete = "4.5.1"
clap_complete_nushell = "4.5.1" clap_complete_nushell = "4.5.1"
clap_complete_fig = "4.5.0" clap_complete_fig = "4.5.0"
vergen = { version = "8.3.1", features = [ "build", "git", "gitcl" ] } vergen = { version = "8.3.1", features = [ "build", "git", "gitcl" ] }
[target."cfg(unix)".dependencies]
uzers = "0.11.3"

View File

@ -9,7 +9,13 @@ pub use boot::*;
pub static ARGS: RoCell<Args> = RoCell::new(); pub static ARGS: RoCell<Args> = RoCell::new();
pub static BOOT: RoCell<Boot> = RoCell::new(); pub static BOOT: RoCell<Boot> = RoCell::new();
#[cfg(unix)]
pub static USERS_CACHE: yazi_shared::RoCell<uzers::UsersCache> = yazi_shared::RoCell::new();
pub fn init() { pub fn init() {
ARGS.with(Default::default); ARGS.with(Default::default);
BOOT.with(Default::default); BOOT.with(Default::default);
#[cfg(unix)]
USERS_CACHE.with(Default::default);
} }

View File

@ -22,3 +22,6 @@ tokio = { version = "1.37.0", features = [ "full" ] }
# Logging # Logging
tracing = { version = "0.1.40", features = [ "max_level_debug", "release_max_level_warn" ] } tracing = { version = "0.1.40", features = [ "max_level_debug", "release_max_level_warn" ] }
[target."cfg(unix)".dependencies]
uzers = "0.11.3"

View File

@ -37,6 +37,9 @@ impl<'a> Body<'a> {
"hi" | "hey" | "cd" | "hover" | "rename" | "bulk" | "yank" => { "hi" | "hey" | "cd" | "hover" | "rename" | "bulk" | "yank" => {
Err("Cannot construct system event from Lua").into_lua_err()? Err("Cannot construct system event from Lua").into_lua_err()?
} }
_ if !kind.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-') => {
Err("Kind must be alphanumeric with dashes").into_lua_err()?
}
_ => BodyCustom::from_lua(kind, value)?, _ => BodyCustom::from_lua(kind, value)?,
}) })
} }

View File

@ -75,7 +75,7 @@ impl Client {
) -> (Lines<BufReader<ReadHalf<UnixStream>>>, WriteHalf<UnixStream>) { ) -> (Lines<BufReader<ReadHalf<UnixStream>>>, WriteHalf<UnixStream>) {
let mut first = true; let mut first = true;
loop { loop {
if let Ok(stream) = UnixStream::connect("/tmp/yazi.sock").await { if let Ok(stream) = UnixStream::connect(Server::socket_file()).await {
Pubsub::pub_from_hi(); Pubsub::pub_from_hi();
let (reader, writer) = tokio::io::split(stream); let (reader, writer) = tokio::io::split(stream);
return (BufReader::new(reader).lines(), writer); return (BufReader::new(reader).lines(), writer);

View File

@ -61,7 +61,7 @@ impl Server {
continue; continue;
} }
if receiver == 0 && sender > 0 && sender <= u16::MAX as u64 { if receiver == 0 && sender <= u16::MAX as u64 {
let Some(body) = parts.next() else { continue }; let Some(body) = parts.next() else { continue };
if !STATE.set(kind, sender as u16, body) { continue } if !STATE.set(kind, sender as u16, body) { continue }
} }
@ -78,11 +78,23 @@ impl Server {
})) }))
} }
#[cfg(unix)]
#[inline]
pub(super) fn socket_file() -> std::path::PathBuf {
use uzers::Users;
use yazi_boot::USERS_CACHE;
use yazi_shared::Xdg;
Xdg::cache_dir().join(format!(".dds-{}.sock", USERS_CACHE.get_current_uid()))
}
#[cfg(unix)] #[cfg(unix)]
#[inline] #[inline]
async fn bind() -> Result<tokio::net::UnixListener> { async fn bind() -> Result<tokio::net::UnixListener> {
tokio::fs::remove_file("/tmp/yazi.sock").await.ok(); let p = Self::socket_file();
Ok(tokio::net::UnixListener::bind("/tmp/yazi.sock")?)
tokio::fs::remove_file(&p).await.ok();
Ok(tokio::net::UnixListener::bind(p)?)
} }
#[cfg(not(unix))] #[cfg(not(unix))]

View File

@ -17,6 +17,8 @@ impl Cha {
reg.add_field_method_get("is_char_device", |_, me| Ok(me.is_char_device())); reg.add_field_method_get("is_char_device", |_, me| Ok(me.is_char_device()));
reg.add_field_method_get("is_fifo", |_, me| Ok(me.is_fifo())); reg.add_field_method_get("is_fifo", |_, me| Ok(me.is_fifo()));
reg.add_field_method_get("is_socket", |_, me| Ok(me.is_socket())); reg.add_field_method_get("is_socket", |_, me| Ok(me.is_socket()));
reg.add_field_method_get("is_exec", |_, me| Ok(me.is_exec()));
reg.add_field_method_get("is_sticky", |_, me| Ok(me.is_sticky()));
#[cfg(unix)] #[cfg(unix)]
{ {

View File

@ -16,7 +16,6 @@ pub(super) fn init_lua() {
fn stage_1(lua: &'static Lua) -> Result<()> { fn stage_1(lua: &'static Lua) -> Result<()> {
crate::Config::new(lua).install_boot()?.install_manager()?.install_theme()?; crate::Config::new(lua).install_boot()?.install_manager()?.install_theme()?;
crate::utils::init();
crate::utils::install(lua)?; crate::utils::install(lua)?;
// Base // Base

View File

@ -28,10 +28,6 @@ impl Pubsub {
ps.raw_set( ps.raw_set(
"pub_static", "pub_static",
lua.create_function(|_, (severity, kind, value): (u16, mlua::String, Value)| { lua.create_function(|_, (severity, kind, value): (u16, mlua::String, Value)| {
if severity < 1 {
return Err("Severity must be at least 1").into_lua_err();
}
yazi_dds::Pubsub::pub_static( yazi_dds::Pubsub::pub_static(
severity, severity,
Body::from_lua(kind.to_str()?, value).into_lua_err()?, Body::from_lua(kind.to_str()?, value).into_lua_err()?,

View File

@ -6,9 +6,10 @@ impl Utils {
#[cfg(unix)] #[cfg(unix)]
pub(super) fn user(lua: &Lua, ya: &Table) -> mlua::Result<()> { pub(super) fn user(lua: &Lua, ya: &Table) -> mlua::Result<()> {
use uzers::{Groups, Users}; use uzers::{Groups, Users};
use yazi_boot::USERS_CACHE;
use yazi_shared::hostname; use yazi_shared::hostname;
use crate::utils::{HOSTNAME_CACHE, USERS_CACHE}; use crate::utils::HOSTNAME_CACHE;
ya.raw_set("uid", lua.create_function(|_, ()| Ok(USERS_CACHE.get_current_uid()))?)?; ya.raw_set("uid", lua.create_function(|_, ()| Ok(USERS_CACHE.get_current_uid()))?)?;

View File

@ -1,6 +1,3 @@
#[cfg(unix)]
pub(super) static USERS_CACHE: yazi_shared::RoCell<uzers::UsersCache> = yazi_shared::RoCell::new();
#[cfg(unix)] #[cfg(unix)]
pub(super) static HOSTNAME_CACHE: std::sync::OnceLock<Option<String>> = std::sync::OnceLock::new(); pub(super) static HOSTNAME_CACHE: std::sync::OnceLock<Option<String>> = std::sync::OnceLock::new();
@ -43,8 +40,3 @@ pub fn install_isolate(lua: &mlua::Lua) -> mlua::Result<()> {
lua.globals().raw_set("ya", ya) lua.globals().raw_set("ya", ya)
} }
pub fn init() {
#[cfg(unix)]
USERS_CACHE.with(Default::default);
}