Skip to content

Commit 40b78fe

Browse files
committed
Auto merge of #12702 - Angelin01:refactor-cargo-add-features-display, r=epage
Cargo add displays either feature list or summarized count
2 parents e4de526 + 72dccec commit 40b78fe

File tree

16 files changed

+64
-137
lines changed

16 files changed

+64
-137
lines changed

src/cargo/ops/cargo_add/mod.rs

Lines changed: 47 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -943,72 +943,69 @@ fn print_dep_table_msg(shell: &mut Shell, dep: &DependencyUI) -> CargoResult<()>
943943
if matches!(shell.verbosity(), crate::core::shell::Verbosity::Quiet) {
944944
return Ok(());
945945
}
946+
946947
let (activated, deactivated) = dep.features();
947948
if !activated.is_empty() || !deactivated.is_empty() {
948949
let prefix = format!("{:>13}", " ");
949-
let suffix = if let Some(version) = &dep.available_version {
950-
let mut version = version.clone();
951-
version.build = Default::default();
952-
let version = version.to_string();
953-
// Avoid displaying the version if it will visually look like the version req that we
954-
// showed earlier
955-
let version_req = dep
956-
.version()
957-
.and_then(|v| semver::VersionReq::parse(v).ok())
958-
.and_then(|v| precise_version(&v));
959-
if version_req.as_deref() != Some(version.as_str()) {
960-
format!(" as of v{version}")
961-
} else {
962-
"".to_owned()
963-
}
964-
} else {
965-
"".to_owned()
966-
};
950+
let suffix = format_features_version_suffix(&dep);
967951

968-
shell.write_stderr(format_args!("{}Features{}:\n", prefix, suffix), &style::NOP)?;
952+
shell.write_stderr(format_args!("{prefix}Features{suffix}:\n"), &style::NOP)?;
969953

970-
const MAX_FEATURE_PRINTS: usize = 50;
971-
972-
let mut activated_printed = 0;
954+
const MAX_FEATURE_PRINTS: usize = 30;
973955
let total_activated = activated.len();
974-
for feat in activated {
975-
if activated_printed >= MAX_FEATURE_PRINTS {
976-
let remaining = total_activated - activated_printed;
977-
shell.write_stderr(
978-
format_args!("{prefix}... {remaining} more activated features\n"),
979-
&style::NOP,
980-
)?;
981-
break;
982-
}
956+
let total_deactivated = deactivated.len();
983957

984-
shell.write_stderr(&prefix, &style::NOP)?;
985-
shell.write_stderr('+', &style::GOOD)?;
986-
shell.write_stderr(format_args!(" {}\n", feat), &style::NOP)?;
987-
activated_printed += 1;
958+
if total_activated <= MAX_FEATURE_PRINTS {
959+
for feat in activated {
960+
shell.write_stderr(&prefix, &style::NOP)?;
961+
shell.write_stderr('+', &style::GOOD)?;
962+
shell.write_stderr(format_args!(" {feat}\n"), &style::NOP)?;
963+
}
964+
} else {
965+
shell.write_stderr(
966+
format_args!("{prefix}{total_activated} activated features\n"),
967+
&style::NOP,
968+
)?;
988969
}
989970

990-
let mut deactivated_printed = 0;
991-
let total_deactivated = deactivated.len();
992-
for feat in deactivated {
993-
if activated_printed + deactivated_printed >= MAX_FEATURE_PRINTS {
994-
let remaining = total_deactivated - deactivated_printed;
995-
shell.write_stderr(
996-
format_args!("{prefix}... {remaining} more deactivated features\n"),
997-
&style::NOP,
998-
)?;
999-
break;
971+
if total_activated + total_deactivated <= MAX_FEATURE_PRINTS {
972+
for feat in deactivated {
973+
shell.write_stderr(&prefix, &style::NOP)?;
974+
shell.write_stderr('-', &style::ERROR)?;
975+
shell.write_stderr(format_args!(" {feat}\n"), &style::NOP)?;
1000976
}
1001-
1002-
shell.write_stderr(&prefix, &style::NOP)?;
1003-
shell.write_stderr('-', &style::ERROR)?;
1004-
shell.write_stderr(format_args!(" {}\n", feat), &style::NOP)?;
1005-
deactivated_printed += 1;
977+
} else {
978+
shell.write_stderr(
979+
format_args!("{prefix}{total_deactivated} deactivated features\n"),
980+
&style::NOP,
981+
)?;
1006982
}
1007983
}
1008984

1009985
Ok(())
1010986
}
1011987

988+
fn format_features_version_suffix(dep: &DependencyUI) -> String {
989+
if let Some(version) = &dep.available_version {
990+
let mut version = version.clone();
991+
version.build = Default::default();
992+
let version = version.to_string();
993+
// Avoid displaying the version if it will visually look like the version req that we
994+
// showed earlier
995+
let version_req = dep
996+
.version()
997+
.and_then(|v| semver::VersionReq::parse(v).ok())
998+
.and_then(|v| precise_version(&v));
999+
if version_req.as_deref() != Some(version.as_str()) {
1000+
format!(" as of v{version}")
1001+
} else {
1002+
"".to_owned()
1003+
}
1004+
} else {
1005+
"".to_owned()
1006+
}
1007+
}
1008+
10121009
// Based on Iterator::is_sorted from nightly std; remove in favor of that when stabilized.
10131010
fn is_sorted(mut it: impl Iterator<Item = impl PartialOrd>) -> bool {
10141011
let Some(mut last) = it.next() else {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Updating `dummy-registry` index
2+
Adding your-face v99999.0.0 to dependencies.
3+
Features:
4+
100 activated features
5+
100 deactivated features

tests/testsuite/cargo_add/features_too_many_few_activated/mod.rs renamed to tests/testsuite/cargo_add/features_deactivated_over_limit/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use cargo_test_support::curr_dir;
88
#[cargo_test]
99
fn case() {
1010
const MANY_FEATURES_COUNT: usize = 200;
11-
const ACTIVATED_FEATURES_COUNT: usize = 10;
11+
const ACTIVATED_FEATURES_COUNT: usize = 30;
1212

1313
cargo_test_support::registry::init();
1414
let mut test_package =
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[workspace]
2+
3+
[package]
4+
name = "cargo-list-test-fixture"
5+
version = "0.0.0"
6+
7+
[dependencies]
8+
your-face = { version = "99999.0.0", features = ["eyes000", "eyes001", "eyes002", "eyes003", "eyes004", "eyes005", "eyes006", "eyes007", "eyes008", "eyes009", "eyes010", "eyes011", "eyes012", "eyes013", "eyes014", "eyes015", "eyes016", "eyes017", "eyes018", "eyes019", "eyes020", "eyes021", "eyes022", "eyes023", "eyes024", "eyes025", "eyes026", "eyes027", "eyes028", "eyes029"] }

tests/testsuite/cargo_add/features_too_many_activated/stderr.log renamed to tests/testsuite/cargo_add/features_deactivated_over_limit/stderr.log

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,4 @@
3131
+ eyes027
3232
+ eyes028
3333
+ eyes029
34-
+ eyes030
35-
+ eyes031
36-
+ eyes032
37-
+ eyes033
38-
+ eyes034
39-
+ eyes035
40-
+ eyes036
41-
+ eyes037
42-
+ eyes038
43-
+ eyes039
44-
+ eyes040
45-
+ eyes041
46-
+ eyes042
47-
+ eyes043
48-
+ eyes044
49-
+ eyes045
50-
+ eyes046
51-
+ eyes047
52-
+ eyes048
53-
+ eyes049
54-
... 50 more activated features
55-
... 100 more deactivated features
34+
170 deactivated features

tests/testsuite/cargo_add/features_too_many_few_activated/out/Cargo.toml

Lines changed: 0 additions & 8 deletions
This file was deleted.

tests/testsuite/cargo_add/features_too_many_few_activated/stderr.log

Lines changed: 0 additions & 54 deletions
This file was deleted.

tests/testsuite/cargo_add/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ mod dev_prefer_existing_version;
1818
mod dry_run;
1919
mod empty_dep_table;
2020
mod features;
21+
mod features_activated_over_limit;
22+
mod features_deactivated_over_limit;
2123
mod features_empty;
2224
mod features_multiple_occurrences;
2325
mod features_preserve;
2426
mod features_spaced_values;
25-
mod features_too_many_activated;
26-
mod features_too_many_few_activated;
2727
mod features_unknown;
2828
mod features_unknown_no_features;
2929
mod git;

0 commit comments

Comments
 (0)