diff --git a/src/cargo/ops/registry/info/mod.rs b/src/cargo/ops/registry/info/mod.rs index f5a84437d6d..c05ff17cb9b 100644 --- a/src/cargo/ops/registry/info/mod.rs +++ b/src/cargo/ops/registry/info/mod.rs @@ -78,12 +78,40 @@ pub fn info( // For workspace members, `cargo tree --package --invert` is useless. It only prints itself. let suggest_cargo_tree_command = package_id.is_some() && !is_member; - let summaries = query_summaries(spec, &mut registry, &source_ids)?; + let (summaries, normalized_name) = query_summaries(spec, &mut registry, &source_ids)?; + let normalized_spec = match normalized_name { + Some(name) if name != spec.name() => { + let mut normalized_spec = PackageIdSpec::new(name); + + if let Some(version) = spec.partial_version().cloned() { + normalized_spec = normalized_spec.with_version(version); + } + + if let Some(url) = spec.url().cloned() { + normalized_spec = normalized_spec.with_url(url); + } + + if let Some(kind) = spec.kind().cloned() { + normalized_spec = normalized_spec.with_kind(kind); + } + + normalized_spec + } + _ => spec.clone(), + }; let package_id = match package_id { Some(id) => id, - None => find_pkgid_in_summaries(&summaries, spec, &rustc_version, &source_ids)?, + None => find_pkgid_in_summaries(&summaries, &normalized_spec, &rustc_version, &source_ids)?, }; + if package_id.name() != spec.name() { + gctx.shell().warn(format!( + "translating `{}` to `{}`", + spec.name(), + package_id.name(), + ))?; + } + let package = registry.get(&[package_id])?; let package = package.get_one(package_id)?; pretty_view(package, &summaries, suggest_cargo_tree_command, gctx)?; @@ -143,13 +171,13 @@ fn find_pkgid_in_ws( fn find_pkgid_in_summaries( summaries: &[IndexSummary], - spec: &PackageIdSpec, + normalized_spec: &PackageIdSpec, rustc_version: &PartialVersion, source_ids: &RegistrySourceIds, ) -> CargoResult { let summary = summaries .iter() - .filter(|s| spec.matches(s.package_id())) + .filter(|s| normalized_spec.matches(s.package_id())) .max_by(|s1, s2| { // Check the MSRV compatibility. let s1_matches = s1 @@ -177,7 +205,7 @@ fn find_pkgid_in_summaries( None => { anyhow::bail!( "could not find `{}` in registry `{}`", - spec, + normalized_spec, source_ids.original.url() ) } @@ -188,18 +216,22 @@ fn query_summaries( spec: &PackageIdSpec, registry: &mut PackageRegistry<'_>, source_ids: &RegistrySourceIds, -) -> CargoResult> { +) -> CargoResult<(Vec, Option)> { // Query without version requirement to get all index summaries. let dep = Dependency::parse(spec.name(), None, source_ids.original)?; - loop { - // Exact to avoid returning all for path/git - match registry.query_vec(&dep, QueryKind::Exact) { + let results = loop { + // Use normalized crate name lookup for user-provided package names. + match registry.query_vec(&dep, QueryKind::Normalized) { std::task::Poll::Ready(res) => { - break res; + break res?; } std::task::Poll::Pending => registry.block_until_ready()?, } - } + }; + + let normalized_name = results.first().map(|s| s.package_id().name().to_string()); + + Ok((results, normalized_name)) } fn validate_locked_and_frozen_options( diff --git a/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/mod.rs b/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/mod.rs new file mode 100644 index 00000000000..517b7a3fa8f --- /dev/null +++ b/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/mod.rs @@ -0,0 +1,53 @@ +use crate::prelude::*; +use cargo_test_support::file; + +use super::init_registry_without_token; + +#[cargo_test] +fn case() { + init_registry_without_token(); + cargo_test_support::registry::Package::new("my_crate", "0.1.0") + .file( + "Cargo.toml", + r#" + [package] + name = "my_crate" + version = "0.1.0" + description = "A package for testing" + repository = "https://github.com/hi-rustin/cargo-infromation" + documentation = "https://docs.rs/my-package/0.1.0" + license = "MIT" + edition = "2018" + rust-version = "1.50.0" + keywords = ["foo", "bar", "baz"] + + [features] + default = ["feature1"] + feature1 = [] + feature2 = [] + + [dependencies] + foo = "0.1.0" + bar = "0.2.0" + baz = { version = "0.3.0", optional = true } + + [[bin]] + name = "my_bin" + + [lib] + name = "my_lib" + "#, + ) + .file("src/bin/my_bin.rs", "") + .file("src/lib.rs", "") + .publish(); + + snapbox::cmd::Command::cargo_ui() + .arg("info") + .arg("my-crate") //hyphen on purpose to show the error + .arg("--registry=dummy-registry") + .assert() + .success() + .stdout_eq(file!["stdout.term.svg"]) + .stderr_eq(file!["stderr.term.svg"]); +} diff --git a/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/stderr.term.svg b/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/stderr.term.svg new file mode 100644 index 00000000000..d8100a29423 --- /dev/null +++ b/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/stderr.term.svg @@ -0,0 +1,34 @@ + + + + + + + Updating `dummy-registry` index + + warning: translating `my-crate` to `my_crate` + + Downloading crates ... + + Downloaded my_crate v0.1.0 (registry `dummy-registry`) + + + + + + diff --git a/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/stdout.term.svg b/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/stdout.term.svg new file mode 100644 index 00000000000..4d31a03339e --- /dev/null +++ b/tests/testsuite/cargo_info/crate_name_normalization_from_hyphen_to_underscore/stdout.term.svg @@ -0,0 +1,51 @@ + + + + + + + my_crate #foo #bar #baz + + A package for testing + + version: 0.1.0 (from registry `dummy-registry`) + + license: MIT + + rust-version: 1.50.0 + + documentation: https://docs.rs/my-package/0.1.0 + + repository: https://github.com/hi-rustin/cargo-infromation + + features: + + +default = [feature1] + + feature1 = [] + + baz = [dep:baz] + + feature2 = [] + + + + + + diff --git a/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/mod.rs b/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/mod.rs new file mode 100644 index 00000000000..d8cb1427b37 --- /dev/null +++ b/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/mod.rs @@ -0,0 +1,53 @@ +use crate::prelude::*; +use cargo_test_support::file; + +use super::init_registry_without_token; + +#[cargo_test] +fn case() { + init_registry_without_token(); + cargo_test_support::registry::Package::new("my-package", "0.1.0") + .file( + "Cargo.toml", + r#" + [package] + name = "my-package" + version = "0.1.0" + description = "A package for testing" + repository = "https://github.com/hi-rustin/cargo-infromation" + documentation = "https://docs.rs/my-package/0.1.0" + license = "MIT" + edition = "2018" + rust-version = "1.50.0" + keywords = ["foo", "bar", "baz"] + + [features] + default = ["feature1"] + feature1 = [] + feature2 = [] + + [dependencies] + foo = "0.1.0" + bar = "0.2.0" + baz = { version = "0.3.0", optional = true } + + [[bin]] + name = "my_bin" + + [lib] + name = "my_lib" + "#, + ) + .file("src/bin/my_bin.rs", "") + .file("src/lib.rs", "") + .publish(); + + snapbox::cmd::Command::cargo_ui() + .arg("info") + .arg("my_package") //underscore on purpose to show the error + .arg("--registry=dummy-registry") + .assert() + .success() + .stdout_eq(file!["stdout.term.svg"]) + .stderr_eq(file!["stderr.term.svg"]); +} diff --git a/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/stderr.term.svg b/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/stderr.term.svg new file mode 100644 index 00000000000..f754ed7d3ee --- /dev/null +++ b/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/stderr.term.svg @@ -0,0 +1,34 @@ + + + + + + + Updating `dummy-registry` index + + warning: translating `my_package` to `my-package` + + Downloading crates ... + + Downloaded my-package v0.1.0 (registry `dummy-registry`) + + + + + + diff --git a/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/stdout.term.svg b/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/stdout.term.svg new file mode 100644 index 00000000000..bcc57a01e61 --- /dev/null +++ b/tests/testsuite/cargo_info/crate_name_normalization_from_underscore_to_hyphen/stdout.term.svg @@ -0,0 +1,51 @@ + + + + + + + my-package #foo #bar #baz + + A package for testing + + version: 0.1.0 (from registry `dummy-registry`) + + license: MIT + + rust-version: 1.50.0 + + documentation: https://docs.rs/my-package/0.1.0 + + repository: https://github.com/hi-rustin/cargo-infromation + + features: + + +default = [feature1] + + feature1 = [] + + baz = [dep:baz] + + feature2 = [] + + + + + + diff --git a/tests/testsuite/cargo_info/mod.rs b/tests/testsuite/cargo_info/mod.rs index 918dcdbcc22..722c6ba29df 100644 --- a/tests/testsuite/cargo_info/mod.rs +++ b/tests/testsuite/cargo_info/mod.rs @@ -1,4 +1,6 @@ mod basic; +mod crate_name_normalization_from_hyphen_to_underscore; +mod crate_name_normalization_from_underscore_to_hyphen; mod features; mod features_activated_over_limit; mod features_activated_over_limit_verbose;