Escape all runnables' cargo extra arguments coming from rust-analyzer (#28977)

Closes https://github.com/zed-industries/zed/issues/28947

Release Notes:

- Fixed certain doctests not being run properly
This commit is contained in:
Kirill Bulatov 2025-04-17 10:05:30 -06:00 committed by GitHub
parent 2a878ee6d0
commit 3ca63584b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -531,7 +531,31 @@ impl LspCommand for GetLspRunnables {
task_template.args.extend(cargo.cargo_args);
if !cargo.executable_args.is_empty() {
task_template.args.push("--".to_string());
task_template.args.extend(cargo.executable_args);
task_template.args.extend(
cargo
.executable_args
.into_iter()
// rust-analyzer's doctest data may be smth. like
// ```
// command: "cargo",
// args: [
// "test",
// "--doc",
// "--package",
// "cargo-output-parser",
// "--",
// "X<T>::new",
// "--show-output",
// ],
// ```
// and `X<T>::new` will cause troubles if not escaped properly, as later
// the task runs as `$SHELL -i -c "cargo test ..."`.
//
// We cannot escape all shell arguments unconditionally, as we use this for ssh commands, which may involve paths starting with `~`.
// That bit is not auto-expanded when using single quotes.
// Escape extra cargo args unconditionally as those are unlikely to contain `~`.
.map(|extra_arg| format!("'{extra_arg}'")),
);
}
}
RunnableArgs::Shell(shell) => {