Skip to content

Commit

Permalink
feat: allow setting YAZI_ID as a command line argument (#1305)
Browse files Browse the repository at this point in the history
Co-authored-by: sxyazi <sxyazi@gmail.com>
  • Loading branch information
mikavilpas and sxyazi committed Jul 18, 2024
1 parent 67fb66c commit f0cb365
Show file tree
Hide file tree
Showing 19 changed files with 206 additions and 172 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion yazi-adapter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ pub fn init() {
.status();
}

SHOWN.with(Default::default);
SHOWN.with(<_>::default);

ADAPTOR.init(Adapter::matches());
ADAPTOR.start();
Expand Down
22 changes: 22 additions & 0 deletions yazi-boot/src/actions/actions.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
use std::process;

pub(crate) struct Actions;

impl Actions {
pub(crate) fn act(args: &crate::Args) {
if args.debug {
println!("{}", Self::debug().unwrap());
process::exit(0);
}

if args.version {
println!("Yazi {}", Self::version());
process::exit(0);
}

if args.clear_cache {
Self::clear_cache();
process::exit(0);
}
}
}
18 changes: 18 additions & 0 deletions yazi-boot/src/actions/clear_cache.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
use yazi_config::PREVIEW;
use yazi_shared::Xdg;

use super::Actions;

impl Actions {
pub(super) fn clear_cache() {
if PREVIEW.cache_dir == Xdg::cache_dir() {
println!("Clearing cache directory: \n{:?}", PREVIEW.cache_dir);
std::fs::remove_dir_all(&PREVIEW.cache_dir).unwrap();
} else {
println!(
"You've changed the default cache directory, for your data's safety, please clear it manually: \n{:?}",
PREVIEW.cache_dir
);
}
}
}
105 changes: 105 additions & 0 deletions yazi-boot/src/actions/debug.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
use std::{env, ffi::OsStr, fmt::Write};

use regex::Regex;
use yazi_shared::Xdg;

use super::Actions;

impl Actions {
pub(super) fn debug() -> Result<String, std::fmt::Error> {
use std::env::consts::{ARCH, FAMILY, OS};
let mut s = String::new();

writeln!(s, "\nYazi")?;
writeln!(s, " Version: {}", Self::version())?;
writeln!(s, " Debug : {}", cfg!(debug_assertions))?;
writeln!(s, " OS : {}-{} ({})", OS, ARCH, FAMILY)?;

writeln!(s, "\nYa")?;
writeln!(s, " Version: {}", Self::process_output("ya", "--version"))?;

writeln!(s, "\nEmulator")?;
writeln!(s, " Emulator.via_env: {:?}", yazi_adapter::Emulator::via_env())?;
writeln!(s, " Emulator.via_csi: {:?}", yazi_adapter::Emulator::via_csi())?;
writeln!(s, " Emulator.detect : {:?}", yazi_adapter::Emulator::detect())?;

writeln!(s, "\nAdapter")?;
writeln!(s, " Adapter.matches: {:?}", yazi_adapter::Adapter::matches())?;

writeln!(s, "\nDesktop")?;
writeln!(s, " XDG_SESSION_TYPE: {:?}", env::var_os("XDG_SESSION_TYPE"))?;
writeln!(s, " WAYLAND_DISPLAY : {:?}", env::var_os("WAYLAND_DISPLAY"))?;
writeln!(s, " DISPLAY : {:?}", env::var_os("DISPLAY"))?;

writeln!(s, "\nSSH")?;
writeln!(s, " shared.in_ssh_connection: {:?}", yazi_shared::in_ssh_connection())?;

writeln!(s, "\nWSL")?;
writeln!(
s,
" /proc/sys/fs/binfmt_misc/WSLInterop: {:?}",
std::fs::symlink_metadata("/proc/sys/fs/binfmt_misc/WSLInterop").is_ok()
)?;

writeln!(s, "\nVariables")?;
writeln!(s, " SHELL : {:?}", env::var_os("SHELL"))?;
writeln!(s, " EDITOR : {:?}", env::var_os("EDITOR"))?;
writeln!(s, " ZELLIJ_SESSION_NAME: {:?}", env::var_os("ZELLIJ_SESSION_NAME"))?;
writeln!(s, " YAZI_FILE_ONE : {:?}", env::var_os("YAZI_FILE_ONE"))?;
writeln!(s, " YAZI_CONFIG_HOME : {:?}", env::var_os("YAZI_CONFIG_HOME"))?;

writeln!(s, "\nText Opener")?;
writeln!(
s,
" default: {:?}",
yazi_config::OPEN.openers("f75a.txt", "text/plain").and_then(|a| a.first().cloned())
)?;
writeln!(s, " block : {:?}", yazi_config::OPEN.block_opener("bulk.txt", "text/plain"))?;

writeln!(s, "\ntmux")?;
writeln!(s, " TMUX : {:?}", *yazi_adapter::TMUX)?;
writeln!(s, " Version: {}", Self::process_output("tmux", "-V"))?;

writeln!(s, "\nDependencies")?;
writeln!(
s,
" file : {}",
Self::process_output(env::var_os("YAZI_FILE_ONE").unwrap_or("file".into()), "--version")
)?;
writeln!(s, " ueberzugpp : {}", Self::process_output("ueberzugpp", "--version"))?;
writeln!(s, " ffmpegthumbnailer: {}", Self::process_output("ffmpegthumbnailer", "-v"))?;
writeln!(s, " magick : {}", Self::process_output("magick", "--version"))?;
writeln!(s, " fzf : {}", Self::process_output("fzf", "--version"))?;
writeln!(s, " fd : {}", Self::process_output("fd", "--version"))?;
writeln!(s, " rg : {}", Self::process_output("rg", "--version"))?;
writeln!(s, " chafa : {}", Self::process_output("chafa", "--version"))?;
writeln!(s, " zoxide : {}", Self::process_output("zoxide", "--version"))?;
writeln!(s, " unar : {}", Self::process_output("unar", "--version"))?;
writeln!(s, " jq : {}", Self::process_output("jq", "--version"))?;

writeln!(s, "\n\n--------------------------------------------------")?;
writeln!(
s,
"When reporting a bug, please also upload the `yazi.log` log file - only upload the most recent content by time."
)?;
writeln!(s, "You can find it in the {:?} directory.", Xdg::state_dir())?;

Ok(s)
}

fn process_output(name: impl AsRef<OsStr>, arg: impl AsRef<OsStr>) -> String {
match std::process::Command::new(name.as_ref()).arg(arg).output() {
Ok(out) if out.status.success() => {
let line =
String::from_utf8_lossy(&out.stdout).trim().lines().next().unwrap_or_default().to_owned();
Regex::new(r"\d+\.\d+(\.\d+-\d+|\.\d+|\b)")
.unwrap()
.find(&line)
.map(|m| m.as_str().to_owned())
.unwrap_or(line)
}
Ok(out) => format!("{:?}, {:?}", out.status, String::from_utf8_lossy(&out.stderr)),
Err(e) => format!("{e}"),
}
}
}
8 changes: 8 additions & 0 deletions yazi-boot/src/actions/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#![allow(clippy::module_inception)]

mod actions;
mod clear_cache;
mod debug;
mod version;

pub(super) use actions::*;
12 changes: 12 additions & 0 deletions yazi-boot/src/actions/version.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
use super::Actions;

impl Actions {
pub(super) fn version() -> String {
format!(
"{} ({} {})",
env!("CARGO_PKG_VERSION"),
env!("VERGEN_GIT_SHA"),
env!("VERGEN_BUILD_DATE")
)
}
}
5 changes: 4 additions & 1 deletion yazi-boot/src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::path::PathBuf;

use clap::{command, Parser};

#[derive(Debug, Parser)]
#[derive(Debug, Default, Parser)]
#[command(name = "yazi")]
pub struct Args {
/// Set the current working entry
Expand All @@ -20,6 +20,9 @@ pub struct Args {
#[arg(long)]
pub clear_cache: bool,

/// Use the specified client ID, must be a globally unique number
#[arg(long)]
pub client_id: Option<u64>,
/// Report the specified local events to stdout
#[arg(long)]
pub local_events: Option<String>,
Expand Down
161 changes: 7 additions & 154 deletions yazi-boot/src/boot.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
use std::{collections::HashSet, env, ffi::{OsStr, OsString}, fmt::Write, path::{Path, PathBuf}, process};
use std::{collections::HashSet, ffi::OsString, path::{Path, PathBuf}};

use clap::Parser;
use regex::Regex;
use serde::Serialize;
use yazi_config::PREVIEW;
use yazi_shared::{fs::{current_cwd, expand_path}, Xdg};

use super::Args;
use crate::ARGS;

#[derive(Debug, Serialize)]
#[derive(Debug, Default, Serialize)]
pub struct Boot {
pub cwd: PathBuf,
pub file: Option<OsString>,
Expand Down Expand Up @@ -37,137 +31,19 @@ impl Boot {

(parent.unwrap().to_owned(), Some(entry.file_name().unwrap().to_owned()))
}

fn process_output(name: impl AsRef<OsStr>, arg: impl AsRef<OsStr>) -> String {
match std::process::Command::new(name.as_ref()).arg(arg).output() {
Ok(out) if out.status.success() => {
let line =
String::from_utf8_lossy(&out.stdout).trim().lines().next().unwrap_or_default().to_owned();
Regex::new(r"\d+\.\d+(\.\d+-\d+|\.\d+|\b)")
.unwrap()
.find(&line)
.map(|m| m.as_str().to_owned())
.unwrap_or(line)
}
Ok(out) => format!("{:?}, {:?}", out.status, String::from_utf8_lossy(&out.stderr)),
Err(e) => format!("{e}"),
}
}

fn action_version() -> String {
format!(
"{} ({} {})",
env!("CARGO_PKG_VERSION"),
env!("VERGEN_GIT_SHA"),
env!("VERGEN_BUILD_DATE")
)
}

fn action_debug() -> Result<String, std::fmt::Error> {
use std::env::consts::{ARCH, FAMILY, OS};
let mut s = String::new();

writeln!(s, "\nYazi")?;
writeln!(s, " Version: {}", Self::action_version())?;
writeln!(s, " Debug : {}", cfg!(debug_assertions))?;
writeln!(s, " OS : {}-{} ({})", OS, ARCH, FAMILY)?;

writeln!(s, "\nYa")?;
writeln!(s, " Version: {}", Self::process_output("ya", "--version"))?;

writeln!(s, "\nEmulator")?;
writeln!(s, " Emulator.via_env: {:?}", yazi_adapter::Emulator::via_env())?;
writeln!(s, " Emulator.via_csi: {:?}", yazi_adapter::Emulator::via_csi())?;
writeln!(s, " Emulator.detect : {:?}", yazi_adapter::Emulator::detect())?;

writeln!(s, "\nAdapter")?;
writeln!(s, " Adapter.matches: {:?}", yazi_adapter::Adapter::matches())?;

writeln!(s, "\nDesktop")?;
writeln!(s, " XDG_SESSION_TYPE: {:?}", env::var_os("XDG_SESSION_TYPE"))?;
writeln!(s, " WAYLAND_DISPLAY : {:?}", env::var_os("WAYLAND_DISPLAY"))?;
writeln!(s, " DISPLAY : {:?}", env::var_os("DISPLAY"))?;

writeln!(s, "\nSSH")?;
writeln!(s, " shared.in_ssh_connection: {:?}", yazi_shared::in_ssh_connection())?;

writeln!(s, "\nWSL")?;
writeln!(
s,
" /proc/sys/fs/binfmt_misc/WSLInterop: {:?}",
std::fs::symlink_metadata("/proc/sys/fs/binfmt_misc/WSLInterop").is_ok()
)?;

writeln!(s, "\nVariables")?;
writeln!(s, " SHELL : {:?}", env::var_os("SHELL"))?;
writeln!(s, " EDITOR : {:?}", env::var_os("EDITOR"))?;
writeln!(s, " ZELLIJ_SESSION_NAME: {:?}", env::var_os("ZELLIJ_SESSION_NAME"))?;
writeln!(s, " YAZI_FILE_ONE : {:?}", env::var_os("YAZI_FILE_ONE"))?;
writeln!(s, " YAZI_CONFIG_HOME : {:?}", env::var_os("YAZI_CONFIG_HOME"))?;

writeln!(s, "\nText Opener")?;
writeln!(
s,
" default: {:?}",
yazi_config::OPEN.openers("f75a.txt", "text/plain").and_then(|a| a.first().cloned())
)?;
writeln!(s, " block : {:?}", yazi_config::OPEN.block_opener("bulk.txt", "text/plain"))?;

writeln!(s, "\ntmux")?;
writeln!(s, " TMUX : {:?}", *yazi_adapter::TMUX)?;
writeln!(s, " Version: {}", Self::process_output("tmux", "-V"))?;

writeln!(s, "\nDependencies")?;
writeln!(
s,
" file : {}",
Self::process_output(env::var_os("YAZI_FILE_ONE").unwrap_or("file".into()), "--version")
)?;
writeln!(s, " ueberzugpp : {}", Self::process_output("ueberzugpp", "--version"))?;
writeln!(s, " ffmpegthumbnailer: {}", Self::process_output("ffmpegthumbnailer", "-v"))?;
writeln!(s, " magick : {}", Self::process_output("magick", "--version"))?;
writeln!(s, " fzf : {}", Self::process_output("fzf", "--version"))?;
writeln!(s, " fd : {}", Self::process_output("fd", "--version"))?;
writeln!(s, " rg : {}", Self::process_output("rg", "--version"))?;
writeln!(s, " chafa : {}", Self::process_output("chafa", "--version"))?;
writeln!(s, " zoxide : {}", Self::process_output("zoxide", "--version"))?;
writeln!(s, " unar : {}", Self::process_output("unar", "--version"))?;
writeln!(s, " jq : {}", Self::process_output("jq", "--version"))?;

writeln!(s, "\n\n--------------------------------------------------")?;
writeln!(
s,
"When reporting a bug, please also upload the `yazi.log` log file - only upload the most recent content by time."
)?;
writeln!(s, "You can find it in the {:?} directory.", Xdg::state_dir())?;

Ok(s)
}

fn action_clear_cache() {
if PREVIEW.cache_dir == Xdg::cache_dir() {
println!("Clearing cache directory: \n{:?}", PREVIEW.cache_dir);
std::fs::remove_dir_all(&PREVIEW.cache_dir).unwrap();
} else {
println!(
"You've changed the default cache directory, for your data's safety, please clear it manually: \n{:?}",
PREVIEW.cache_dir
);
}
}
}

impl Default for Boot {
fn default() -> Self {
impl From<&crate::Args> for Boot {
fn from(args: &crate::Args) -> Self {
let config_dir = Xdg::config_dir();
let (cwd, file) = Self::parse_entry(ARGS.entry.as_deref());
let (cwd, file) = Self::parse_entry(args.entry.as_deref());

let local_events = ARGS
let local_events = args
.local_events
.as_ref()
.map(|s| s.split(',').map(|s| s.to_owned()).collect())
.unwrap_or_default();
let remote_events = ARGS
let remote_events = args
.remote_events
.as_ref()
.map(|s| s.split(',').map(|s| s.to_owned()).collect())
Expand All @@ -187,26 +63,3 @@ impl Default for Boot {
}
}
}

impl Default for Args {
fn default() -> Self {
let args = Self::parse();

if args.debug {
println!("{}", Boot::action_debug().unwrap());
process::exit(0);
}

if args.version {
println!("Yazi {}", Boot::action_version());
process::exit(0);
}

if args.clear_cache {
Boot::action_clear_cache();
process::exit(0);
}

args
}
}
Loading

0 comments on commit f0cb365

Please sign in to comment.