mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 23:01:05 +00:00
feat: checks in ya pub and ya emit subcommands to verify receiver exists and has necessary abilities (#2696)
This commit is contained in:
parent
eba9f1e4f0
commit
fbf8345d90
6 changed files with 35 additions and 26 deletions
28
Cargo.lock
generated
28
Cargo.lock
generated
|
|
@ -389,9 +389,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "clap_complete"
|
||||
version = "4.5.47"
|
||||
version = "4.5.48"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c06f5378ea264ad4f82bbc826628b5aad714a75abf6ece087e923010eb937fb6"
|
||||
checksum = "be8c97f3a6f02b9e24cadc12aaba75201d18754b53ea0a9d99642f806ccdb4c9"
|
||||
dependencies = [
|
||||
"clap",
|
||||
]
|
||||
|
|
@ -787,7 +787,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2132,7 +2132,7 @@ dependencies = [
|
|||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys 0.4.15",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2145,7 +2145,7 @@ dependencies = [
|
|||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys 0.9.4",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2595,9 +2595,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.8.21"
|
||||
version = "0.8.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "900f6c86a685850b1bc9f6223b20125115ee3f31e01207d81655bbcc0aea9231"
|
||||
checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
|
|
@ -2616,9 +2616,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.22.25"
|
||||
version = "0.22.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485"
|
||||
checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
|
|
@ -2630,9 +2630,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "toml_write"
|
||||
version = "0.1.0"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28391a4201ba7eb1984cfeb6862c0b3ea2cfe23332298967c749dddc0d6cd976"
|
||||
checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076"
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
|
|
@ -3000,7 +3000,7 @@ version = "0.1.9"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -3205,9 +3205,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
|||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "0.7.6"
|
||||
version = "0.7.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10"
|
||||
checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ syntect = { version = "5.2.0", default-features = false, features =
|
|||
tokio = { version = "1.44.2", features = [ "full" ] }
|
||||
tokio-stream = "0.1.17"
|
||||
tokio-util = "0.7.15"
|
||||
toml = { version = "0.8.21" }
|
||||
toml = { version = "0.8.22" }
|
||||
tracing = { version = "0.1.41", features = [ "max_level_debug", "release_max_level_debug" ] }
|
||||
twox-hash = { version = "2.1.0", default-features = false, features = [ "std", "random", "xxhash3_128" ] }
|
||||
unicode-width = "0.2.0"
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ yazi-shared = { path = "../yazi-shared", version = "25.4.8" }
|
|||
|
||||
# External dependencies
|
||||
clap = { workspace = true }
|
||||
clap_complete = "4.5.47"
|
||||
clap_complete = "4.5.48"
|
||||
clap_complete_fig = "4.5.2"
|
||||
clap_complete_nushell = "4.5.5"
|
||||
vergen-gitcl = { version = "1.0.8", features = [ "build", "rustc" ] }
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ yazi-shared = { path = "../yazi-shared", version = "25.4.8" }
|
|||
# External build dependencies
|
||||
anyhow = { workspace = true }
|
||||
clap = { workspace = true }
|
||||
clap_complete = "4.5.47"
|
||||
clap_complete = "4.5.48"
|
||||
clap_complete_fig = "4.5.2"
|
||||
clap_complete_nushell = "4.5.5"
|
||||
serde_json = { workspace = true }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use std::borrow::Cow;
|
|||
|
||||
use anyhow::{Result, bail};
|
||||
use clap::{Parser, Subcommand, command};
|
||||
use yazi_shared::event::Cmd;
|
||||
use yazi_shared::{Id, event::Cmd};
|
||||
|
||||
#[derive(Parser)]
|
||||
#[command(name = "Ya", about, long_about = None)]
|
||||
|
|
@ -43,7 +43,7 @@ pub(super) struct CommandEmit {
|
|||
#[derive(clap::Args)]
|
||||
pub(super) struct CommandEmitTo {
|
||||
/// The receiver ID.
|
||||
pub(super) receiver: u64,
|
||||
pub(super) receiver: Id,
|
||||
/// The name of the command.
|
||||
pub(super) name: String,
|
||||
/// The arguments of the command.
|
||||
|
|
@ -89,7 +89,7 @@ pub(super) struct CommandPub {
|
|||
|
||||
impl CommandPub {
|
||||
#[allow(dead_code)]
|
||||
pub(super) fn receiver() -> Result<u64> {
|
||||
pub(super) fn receiver() -> Result<Id> {
|
||||
if let Some(s) = std::env::var("YAZI_PID").ok().filter(|s| !s.is_empty()) {
|
||||
Ok(s.parse()?)
|
||||
} else {
|
||||
|
|
@ -102,7 +102,7 @@ impl CommandPub {
|
|||
pub(super) struct CommandPubTo {
|
||||
/// The receiver ID.
|
||||
#[arg(index = 1)]
|
||||
pub(super) receiver: u64,
|
||||
pub(super) receiver: Id,
|
||||
/// The kind of message.
|
||||
#[arg(index = 2)]
|
||||
pub(super) kind: String,
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ impl Client {
|
|||
}
|
||||
|
||||
/// Connect to an existing server to send a single message.
|
||||
pub async fn shot(kind: &str, receiver: u64, body: &str) -> Result<()> {
|
||||
pub async fn shot(kind: &str, receiver: Id, body: &str) -> Result<()> {
|
||||
Body::validate(kind)?;
|
||||
|
||||
let payload = format!(
|
||||
|
|
@ -79,12 +79,12 @@ impl Client {
|
|||
writer.flush().await?;
|
||||
drop(writer);
|
||||
|
||||
let mut version = None;
|
||||
let (mut peers, mut version) = Default::default();
|
||||
while let Ok(Some(line)) = lines.next_line().await {
|
||||
match line.split(',').next() {
|
||||
Some("hey") if version.is_none() => {
|
||||
Some("hey") => {
|
||||
if let Ok(Body::Hey(hey)) = Payload::from_str(&line).map(|p| p.body) {
|
||||
version = Some(hey.version);
|
||||
(peers, version) = (hey.peers, Some(hey.version));
|
||||
}
|
||||
}
|
||||
Some("bye") => break,
|
||||
|
|
@ -94,11 +94,20 @@ impl Client {
|
|||
|
||||
if version.as_deref() != Some(BodyHi::version()) {
|
||||
bail!(
|
||||
"Incompatible version (Ya {}, Yazi {}), please restart all `ya` and `yazi` processes if you upgrade either one.",
|
||||
"Incompatible version (Ya {}, Yazi {}). Restart all `ya` and `yazi` processes if you upgrade either one.",
|
||||
BodyHi::version(),
|
||||
version.as_deref().unwrap_or("Unknown")
|
||||
);
|
||||
}
|
||||
|
||||
match peers.get(&receiver).map(|p| p.able(kind)) {
|
||||
Some(true) => {}
|
||||
Some(false) => {
|
||||
bail!("Receiver `{receiver}` does not have the ability to receive `{kind}` messages.")
|
||||
}
|
||||
None => bail!("Receiver `{receiver}` not found. Check if the receiver is running."),
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue