feat(core): implement env-path register on Linux
This commit is contained in:
parent
36984a9426
commit
9d64658d5c
|
@ -26,7 +26,6 @@ pub fn new() -> CliModule {
|
|||
CliModule {
|
||||
enable_logs: true,
|
||||
disable_logs_terminal_output: true,
|
||||
requires_paths: true,
|
||||
log_mode: super::LogMode::AppendOnly,
|
||||
subcommand: "env-path".to_string(),
|
||||
entry: env_path_main,
|
||||
|
@ -35,7 +34,6 @@ pub fn new() -> CliModule {
|
|||
}
|
||||
|
||||
fn env_path_main(args: CliModuleArgs) -> i32 {
|
||||
let paths = args.paths.expect("missing paths argument");
|
||||
let cli_args = args.cli_args.expect("missing cli_args");
|
||||
|
||||
let elevated_priviledge_prompt = cli_args.is_present("prompt");
|
||||
|
@ -43,7 +41,7 @@ fn env_path_main(args: CliModuleArgs) -> i32 {
|
|||
if cli_args.subcommand_matches("register").is_some() {
|
||||
if let Err(error) = crate::path::add_espanso_to_path(elevated_priviledge_prompt) {
|
||||
error_print_and_log(&format!(
|
||||
"Unable to add 'espanso' command to PATH: {}",
|
||||
"Unable to add 'espanso' command to PATH: {:?}",
|
||||
error
|
||||
));
|
||||
return ADD_TO_PATH_FAILURE;
|
||||
|
@ -51,7 +49,7 @@ fn env_path_main(args: CliModuleArgs) -> i32 {
|
|||
} else if cli_args.subcommand_matches("unregister").is_some() {
|
||||
if let Err(error) = crate::path::remove_espanso_from_path(elevated_priviledge_prompt) {
|
||||
error_print_and_log(&format!(
|
||||
"Unable to remove 'espanso' command from PATH: {}",
|
||||
"Unable to remove 'espanso' command from PATH: {:?}",
|
||||
error
|
||||
));
|
||||
return ADD_TO_PATH_FAILURE;
|
||||
|
|
|
@ -198,11 +198,11 @@ fn main() {
|
|||
.long("prompt")
|
||||
.required(false)
|
||||
.takes_value(false)
|
||||
.help("Prompt for permissions if the operation requires elevated privileges."),
|
||||
.help("macOS only:Prompt for permissions if the operation requires elevated privileges."),
|
||||
)
|
||||
.subcommand(SubCommand::with_name("register").about("Add 'espanso' command to PATH"))
|
||||
.subcommand(SubCommand::with_name("unregister").about("Remove 'espanso' command from PATH"))
|
||||
.about("Add or remove the 'espanso' command from the PATH (macOS and Windows only)"),
|
||||
.about("Add or remove the 'espanso' command from the PATH"),
|
||||
)
|
||||
// .subcommand(SubCommand::with_name("cmd")
|
||||
// .about("Send a command to the espanso daemon.")
|
||||
|
@ -451,7 +451,7 @@ fn main() {
|
|||
}
|
||||
|
||||
// When started from a Linux app image, override the default handler with the launcher
|
||||
// to start espanso when double clicked
|
||||
// to start espanso when launching it directly
|
||||
if std::env::var_os("APPIMAGE").is_some() {
|
||||
handler = CLI_HANDLERS.iter().find(|cli| cli.subcommand == "launcher");
|
||||
}
|
||||
|
|
|
@ -18,18 +18,62 @@
|
|||
*/
|
||||
|
||||
use anyhow::Result;
|
||||
use std::{path::PathBuf};
|
||||
use thiserror::Error;
|
||||
|
||||
pub fn is_espanso_in_path() -> bool {
|
||||
// Not supported on Linux
|
||||
true
|
||||
PathBuf::from("/usr/local/bin/espanso").is_file()
|
||||
}
|
||||
|
||||
pub fn add_espanso_to_path(_: bool) -> Result<()> {
|
||||
// Not supported on Linux
|
||||
let target_link_dir = PathBuf::from("/usr/local/bin");
|
||||
let exec_path = get_binary_path()?;
|
||||
|
||||
if !target_link_dir.is_dir() {
|
||||
return Err(PathError::UsrLocalBinDirDoesNotExist.into());
|
||||
}
|
||||
|
||||
let target_link_path = target_link_dir.join("espanso");
|
||||
|
||||
if let Err(error) = std::os::unix::fs::symlink(&exec_path, &target_link_path) {
|
||||
return Err(PathError::SymlinkError(error).into());
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn remove_espanso_from_path(_: bool) -> Result<()> {
|
||||
// Not supported on Linux
|
||||
let target_link_path = PathBuf::from("/usr/local/bin/espanso");
|
||||
|
||||
if std::fs::symlink_metadata(&target_link_path).is_err() {
|
||||
return Err(PathError::SymlinkNotFound.into());
|
||||
}
|
||||
|
||||
if let Err(error) = std::fs::remove_file(&target_link_path) {
|
||||
return Err(PathError::SymlinkError(error).into());
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum PathError {
|
||||
#[error("/usr/local/bin directory doesn't exist")]
|
||||
UsrLocalBinDirDoesNotExist,
|
||||
|
||||
#[error("symlink error: `{0}`")]
|
||||
SymlinkError(std::io::Error),
|
||||
|
||||
#[error("symlink does not exist, so there is nothing to remove.")]
|
||||
SymlinkNotFound,
|
||||
}
|
||||
|
||||
fn get_binary_path() -> Result<PathBuf> {
|
||||
// If executed as part of an AppImage, get the app image path instead of
|
||||
// the binary itself (which was extracted in a temp directory).
|
||||
if let Some(app_image_path) = std::env::var_os("APPIMAGE") {
|
||||
return Ok(PathBuf::from(app_image_path));
|
||||
}
|
||||
|
||||
Ok(std::env::current_exe()?)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user