diff --git a/crates/languages/src/rust.rs b/crates/languages/src/rust.rs index 0b8e449f49d420ce8dd6aa4e4c0bd3d7dab717e1..084af441201d0e42107f9d7e00e63495270e48ce 100644 --- a/crates/languages/src/rust.rs +++ b/crates/languages/src/rust.rs @@ -421,13 +421,6 @@ impl ContextProvider for RustContextProvider { } fn human_readable_package_name(package_directory: &Path) -> Option { - fn split_off_suffix(input: &str, suffix_start: char) -> &str { - match input.rsplit_once(suffix_start) { - Some((without_suffix, _)) => without_suffix, - None => input, - } - } - let pkgid = String::from_utf8( std::process::Command::new("cargo") .current_dir(package_directory) @@ -437,19 +430,40 @@ fn human_readable_package_name(package_directory: &Path) -> Option { .stdout, ) .ok()?; - // For providing local `cargo check -p $pkgid` task, we do not need most of the information we have returned. - // Output example in the root of Zed project: - // ```bash - // ❯ cargo pkgid zed - // path+file:///absolute/path/to/project/zed/crates/zed#0.131.0 - // ``` - // Extrarct the package name from the output according to the spec: - // https://doc.rust-lang.org/cargo/reference/pkgid-spec.html#specification-grammar - let mut package_name = pkgid.trim(); - package_name = split_off_suffix(package_name, '#'); - package_name = split_off_suffix(package_name, '?'); - let (_, package_name) = package_name.rsplit_once('/')?; - Some(package_name.to_string()) + Some(package_name_from_pkgid(&pkgid)?.to_owned()) +} + +// For providing local `cargo check -p $pkgid` task, we do not need most of the information we have returned. +// Output example in the root of Zed project: +// ```bash +// ❯ cargo pkgid zed +// path+file:///absolute/path/to/project/zed/crates/zed#0.131.0 +// ``` +// Another variant, if a project has a custom package name or hyphen in the name: +// ``` +// path+file:///absolute/path/to/project/custom-package#my-custom-package@0.1.0 +// ``` +// +// Extracts the package name from the output according to the spec: +// https://doc.rust-lang.org/cargo/reference/pkgid-spec.html#specification-grammar +fn package_name_from_pkgid(pkgid: &str) -> Option<&str> { + fn split_off_suffix(input: &str, suffix_start: char) -> &str { + match input.rsplit_once(suffix_start) { + Some((without_suffix, _)) => without_suffix, + None => input, + } + } + + let (version_prefix, version_suffix) = pkgid.trim().rsplit_once('#')?; + let package_name = match version_suffix.rsplit_once('@') { + Some((custom_package_name, _version)) => custom_package_name, + None => { + let host_and_path = split_off_suffix(version_prefix, '?'); + let (_, package_name) = host_and_path.rsplit_once('/')?; + package_name + } + }; + Some(package_name) } async fn get_cached_server_binary(container_dir: PathBuf) -> Option { @@ -750,4 +764,20 @@ mod tests { buffer }); } + + #[test] + fn test_package_name_from_pkgid() { + for (input, expected) in [ + ( + "path+file:///absolute/path/to/project/zed/crates/zed#0.131.0", + "zed", + ), + ( + "path+file:///absolute/path/to/project/custom-package#my-custom-package@0.1.0", + "my-custom-package", + ), + ] { + assert_eq!(package_name_from_pkgid(input), Some(expected)); + } + } } diff --git a/crates/tasks_ui/src/modal.rs b/crates/tasks_ui/src/modal.rs index 8a91aca7c2d82716ebb6f1f0f59f19584f1ff7f3..4a48a23bd85307b20d99a9e6e7608d9562bb54fc 100644 --- a/crates/tasks_ui/src/modal.rs +++ b/crates/tasks_ui/src/modal.rs @@ -316,7 +316,9 @@ impl PickerDelegate for TasksModalDelegate { String::new() }; if let Some(resolved) = resolved_task.resolved.as_ref() { - if display_label != resolved.command_label { + if resolved.command_label != display_label + && resolved.command_label != resolved_task.resolved_label + { if !tooltip_label_text.trim().is_empty() { tooltip_label_text.push('\n'); }