Use which to resolve lsp/dap binaries

This resolves the following issue: https://github.com/helix-editor/helix/discussions/962#discussioncomment-1580046
pull/1635/head^2
Blaž Hrastnik 3 years ago
parent 4526216139
commit 9712bbb23b
No known key found for this signature in database
GPG Key ID: 1238B9C4AD889640

2
Cargo.lock generated

@ -393,6 +393,7 @@ dependencies = [
"serde_json", "serde_json",
"thiserror", "thiserror",
"tokio", "tokio",
"which",
] ]
[[package]] [[package]]
@ -411,6 +412,7 @@ dependencies = [
"thiserror", "thiserror",
"tokio", "tokio",
"tokio-stream", "tokio-stream",
"which",
] ]
[[package]] [[package]]

@ -19,6 +19,7 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
thiserror = "1.0" thiserror = "1.0"
tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "net", "sync"] } tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "net", "sync"] }
which = "4.2"
[dev-dependencies] [dev-dependencies]
fern = "0.6" fern = "0.6"

@ -105,6 +105,9 @@ impl Client {
args: Vec<&str>, args: Vec<&str>,
id: usize, id: usize,
) -> Result<(Self, UnboundedReceiver<Payload>)> { ) -> Result<(Self, UnboundedReceiver<Payload>)> {
// Resolve path to the binary
let cmd = which::which(cmd).map_err(|err| anyhow::anyhow!(err))?;
let process = Command::new(cmd) let process = Command::new(cmd)
.args(args) .args(args)
.stdin(Stdio::piped()) .stdin(Stdio::piped())

@ -25,3 +25,4 @@ serde_json = "1.0"
thiserror = "1.0" thiserror = "1.0"
tokio = { version = "1.17", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "sync"] } tokio = { version = "1.17", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "sync"] }
tokio-stream = "0.1.8" tokio-stream = "0.1.8"
which = "4.2"

@ -43,6 +43,9 @@ impl Client {
root_markers: Vec<String>, root_markers: Vec<String>,
id: usize, id: usize,
) -> Result<(Self, UnboundedReceiver<(usize, Call)>, Arc<Notify>)> { ) -> Result<(Self, UnboundedReceiver<(usize, Call)>, Arc<Notify>)> {
// Resolve path to the binary
let cmd = which::which(cmd).map_err(|err| anyhow::anyhow!(err))?;
let process = Command::new(cmd) let process = Command::new(cmd)
.args(args) .args(args)
.stdin(Stdio::piped()) .stdin(Stdio::piped())

@ -479,32 +479,13 @@ impl Application {
Payload::Response(_) => unreachable!(), Payload::Response(_) => unreachable!(),
Payload::Request(request) => match request.command.as_str() { Payload::Request(request) => match request.command.as_str() {
RunInTerminal::COMMAND => { RunInTerminal::COMMAND => {
let mut arguments: dap::requests::RunInTerminalArguments = let arguments: dap::requests::RunInTerminalArguments =
serde_json::from_value(request.arguments.unwrap_or_default()).unwrap(); serde_json::from_value(request.arguments.unwrap_or_default()).unwrap();
// TODO: no unwrap // TODO: no unwrap
log::error!("run_in_terminal {:?}", arguments);
// HAXX: lldb-vscode uses $CWD/lldb-vscode which is wrong
let program = arguments.args[0]
.strip_prefix(
std::env::current_dir()
.expect("Couldn't get current working directory")
.as_path()
.to_str()
.unwrap(),
)
.and_then(|arg| arg.strip_prefix('/'))
.map(|arg| arg.to_owned())
.unwrap_or_else(|| arguments.args[0].clone());
arguments.args[0] = program;
log::error!("{}", arguments.args.join(" "));
// TODO: handle cwd
let process = std::process::Command::new("tmux") let process = std::process::Command::new("tmux")
.arg("split-window") .arg("split-window")
.arg(arguments.args.join(" ")) // TODO: first arg is wrong, it uses current dir .arg(arguments.args.join(" "))
.spawn() .spawn()
.unwrap(); .unwrap();

Loading…
Cancel
Save