From 7ce2b7d42a156f90b41fa6c68fc4dd5f9cb2b226 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 12 Sep 2022 09:46:22 -0500 Subject: [PATCH] fix(add): Limit 'Features as of vX.Y.Z' to when relevant This will only show the messaeg if we didn't already show a version req with full precision specified ... mostly. We'll also skip it if its a local or git dependency but we never show the version in those cases because it doesn't matter. The `precise_version` logic came from cargo-upgrade. --- src/cargo/ops/cargo_add/mod.rs | 43 ++++++++++++++++++- .../add_normalized_name_external/stderr.log | 4 +- .../build_prefer_existing_version/stderr.log | 2 +- .../cargo_add/list_features_path/stderr.log | 2 +- .../list_features_path_no_default/stderr.log | 2 +- .../overwrite_name_dev_noop/stderr.log | 2 +- .../cargo_add/overwrite_name_noop/stderr.log | 2 +- .../cargo_add/overwrite_path_noop/stderr.log | 2 +- .../stderr.log | 2 +- 9 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index 7012e3bcb..8357601b6 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -769,7 +769,16 @@ fn print_msg(shell: &mut Shell, dep: &DependencyEx, section: &[String]) -> Cargo if !activated.is_empty() || !deactivated.is_empty() { let prefix = format!("{:>13}", " "); let suffix = if let Some(version) = &dep.available_version { - format!(" as of v{}", version) + let version = version.to_string(); + let version_req = dep + .version() + .and_then(|v| semver::VersionReq::parse(v).ok()) + .and_then(|v| precise_version(&v)); + if version_req.as_deref() != Some(version.as_str()) { + format!(" as of v{}", version) + } else { + "".to_owned() + } } else { "".to_owned() }; @@ -832,3 +841,35 @@ fn find_workspace_dep(toml_key: &str, root_manifest: &Path) -> CargoResult Option { + version_req + .comparators + .iter() + .filter(|c| { + matches!( + c.op, + // Only ops we can determine a precise version from + semver::Op::Exact + | semver::Op::GreaterEq + | semver::Op::LessEq + | semver::Op::Tilde + | semver::Op::Caret + | semver::Op::Wildcard + ) + }) + .filter_map(|c| { + // Only do it when full precision is specified + c.minor.and_then(|minor| { + c.patch.map(|patch| semver::Version { + major: c.major, + minor, + patch, + pre: c.pre.clone(), + build: Default::default(), + }) + }) + }) + .max() + .map(|v| v.to_string()) +} diff --git a/tests/testsuite/cargo_add/add_normalized_name_external/stderr.log b/tests/testsuite/cargo_add/add_normalized_name_external/stderr.log index 9f7fc219e..c7d451143 100644 --- a/tests/testsuite/cargo_add/add_normalized_name_external/stderr.log +++ b/tests/testsuite/cargo_add/add_normalized_name_external/stderr.log @@ -2,7 +2,7 @@ warning: translating `linked_hash_map` to `linked-hash-map` warning: translating `Inflector` to `inflector` Adding linked-hash-map v0.5.4 to dependencies. - Features as of v0.5.4: + Features: - clippy - heapsize - heapsize_impl @@ -11,7 +11,7 @@ warning: translating `Inflector` to `inflector` - serde_impl - serde_test Adding inflector v0.11.4 to dependencies. - Features as of v0.11.4: + Features: + heavyweight + lazy_static + regex diff --git a/tests/testsuite/cargo_add/build_prefer_existing_version/stderr.log b/tests/testsuite/cargo_add/build_prefer_existing_version/stderr.log index ba6d85070..554aa2ef3 100644 --- a/tests/testsuite/cargo_add/build_prefer_existing_version/stderr.log +++ b/tests/testsuite/cargo_add/build_prefer_existing_version/stderr.log @@ -1,4 +1,4 @@ Adding cargo-list-test-fixture-dependency (local) to build-dependencies. - Features as of v0.0.0: + Features: - one - two diff --git a/tests/testsuite/cargo_add/list_features_path/stderr.log b/tests/testsuite/cargo_add/list_features_path/stderr.log index 60419c148..af6747fe8 100644 --- a/tests/testsuite/cargo_add/list_features_path/stderr.log +++ b/tests/testsuite/cargo_add/list_features_path/stderr.log @@ -1,5 +1,5 @@ Adding your-face (local) to dependencies. - Features as of v0.1.3: + Features: + mouth + nose - eyes diff --git a/tests/testsuite/cargo_add/list_features_path_no_default/stderr.log b/tests/testsuite/cargo_add/list_features_path_no_default/stderr.log index 9f63857dc..7f47a220e 100644 --- a/tests/testsuite/cargo_add/list_features_path_no_default/stderr.log +++ b/tests/testsuite/cargo_add/list_features_path_no_default/stderr.log @@ -1,5 +1,5 @@ Adding your-face (local) to dependencies. - Features as of v0.1.3: + Features: - eyes - mouth - nose diff --git a/tests/testsuite/cargo_add/overwrite_name_dev_noop/stderr.log b/tests/testsuite/cargo_add/overwrite_name_dev_noop/stderr.log index a9d0c65d7..2fe3f6a29 100644 --- a/tests/testsuite/cargo_add/overwrite_name_dev_noop/stderr.log +++ b/tests/testsuite/cargo_add/overwrite_name_dev_noop/stderr.log @@ -1,4 +1,4 @@ Adding your-face (local) to dev-dependencies. - Features as of v0.0.0: + Features: + mouth + nose diff --git a/tests/testsuite/cargo_add/overwrite_name_noop/stderr.log b/tests/testsuite/cargo_add/overwrite_name_noop/stderr.log index fdd8d51a1..2f0b90de0 100644 --- a/tests/testsuite/cargo_add/overwrite_name_noop/stderr.log +++ b/tests/testsuite/cargo_add/overwrite_name_noop/stderr.log @@ -1,4 +1,4 @@ Adding your-face (local) to optional dependencies. - Features as of v0.0.0: + Features: + mouth + nose diff --git a/tests/testsuite/cargo_add/overwrite_path_noop/stderr.log b/tests/testsuite/cargo_add/overwrite_path_noop/stderr.log index fdd8d51a1..2f0b90de0 100644 --- a/tests/testsuite/cargo_add/overwrite_path_noop/stderr.log +++ b/tests/testsuite/cargo_add/overwrite_path_noop/stderr.log @@ -1,4 +1,4 @@ Adding your-face (local) to optional dependencies. - Features as of v0.0.0: + Features: + mouth + nose diff --git a/tests/testsuite/cargo_add/overwrite_workspace_dep_features/stderr.log b/tests/testsuite/cargo_add/overwrite_workspace_dep_features/stderr.log index e5579fda6..18ed7c2d8 100644 --- a/tests/testsuite/cargo_add/overwrite_workspace_dep_features/stderr.log +++ b/tests/testsuite/cargo_add/overwrite_workspace_dep_features/stderr.log @@ -1,5 +1,5 @@ Adding foo (local) to dependencies. - Features as of v0.0.0: + Features: + default-base + default-merge-base + default-test-base