From f0d3b7a463f87977a8b84628b5f96392bedba888 Mon Sep 17 00:00:00 2001 From: Yikai Zhao Date: Tue, 16 Apr 2024 23:58:03 +0800 Subject: [PATCH] Use `which` crate to find prog path in windows --- Cargo.lock | 42 ++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 1 + src/main.rs | 11 ++++++++++- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 733064b..bea9f14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -184,6 +184,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + [[package]] name = "emacs" version = "0.18.0" @@ -214,6 +220,7 @@ dependencies = [ "serde_json", "smallvec", "tempfile", + "which", ] [[package]] @@ -281,6 +288,15 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys", +] + [[package]] name = "humantime" version = "2.1.0" @@ -318,9 +334,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "linux-raw-sys" @@ -413,9 +429,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ "bitflags 2.4.1", "errno", @@ -570,6 +586,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "which" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" +dependencies = [ + "either", + "home", + "rustix", + "winsafe", +] + [[package]] name = "winapi" version = "0.3.9" @@ -666,3 +694,9 @@ name = "windows_x86_64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" diff --git a/Cargo.toml b/Cargo.toml index 2ce2337..d73d3b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ env_logger = "0.10" log = "0.4.20" clap = { version = "4.4", features = ["derive", "cargo"] } clap-verbosity-flag = "2.1.1" +which = "6.0.1" [[example]] name = "native-json-parser" diff --git a/src/main.rs b/src/main.rs index 5a4b629..19d3b0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use anyhow::{Result, bail}; +use log::trace; use clap::Parser; use emacs_lsp_booster::app; @@ -61,7 +62,15 @@ fn main() -> Result<()> { std::process::exit(1); })); - let mut cmd = std::process::Command::new(&cli.server_cmd[0]); + // In windows, Command::new cannot find .cmd files, so use `which` to do that + // https://github.com/rust-lang/rust/issues/37519 + let server_cmd_prog = if cfg!(windows) { + which::which(&cli.server_cmd[0])? + } else { + std::path::PathBuf::from(&cli.server_cmd[0]) + }; + trace!("Using server prog: {:?}", server_cmd_prog); + let mut cmd = std::process::Command::new(&server_cmd_prog); cmd.args(&cli.server_cmd[1..]); let exit_status = app::run_app_forever(std::io::stdin(), std::io::stdout(), cmd, app::AppOptions {