Auto merge of #12702 - Angelin01:refactor-cargo-add-features-display, r=epage

Cargo add displays either feature list or summarized count
This commit is contained in:
bors 2023-09-19 16:34:41 +00:00
commit 40b78fe5f3
16 changed files with 66 additions and 139 deletions

View File

@ -943,72 +943,69 @@ fn print_dep_table_msg(shell: &mut Shell, dep: &DependencyUI) -> CargoResult<()>
if matches!(shell.verbosity(), crate::core::shell::Verbosity::Quiet) { if matches!(shell.verbosity(), crate::core::shell::Verbosity::Quiet) {
return Ok(()); return Ok(());
} }
let (activated, deactivated) = dep.features(); let (activated, deactivated) = dep.features();
if !activated.is_empty() || !deactivated.is_empty() { if !activated.is_empty() || !deactivated.is_empty() {
let prefix = format!("{:>13}", " "); let prefix = format!("{:>13}", " ");
let suffix = if let Some(version) = &dep.available_version { let suffix = format_features_version_suffix(&dep);
let mut version = version.clone();
version.build = Default::default(); shell.write_stderr(format_args!("{prefix}Features{suffix}:\n"), &style::NOP)?;
let version = version.to_string();
// Avoid displaying the version if it will visually look like the version req that we const MAX_FEATURE_PRINTS: usize = 30;
// showed earlier let total_activated = activated.len();
let version_req = dep let total_deactivated = deactivated.len();
.version()
.and_then(|v| semver::VersionReq::parse(v).ok()) if total_activated <= MAX_FEATURE_PRINTS {
.and_then(|v| precise_version(&v)); for feat in activated {
if version_req.as_deref() != Some(version.as_str()) { shell.write_stderr(&prefix, &style::NOP)?;
format!(" as of v{version}") shell.write_stderr('+', &style::GOOD)?;
} else { shell.write_stderr(format_args!(" {feat}\n"), &style::NOP)?;
"".to_owned()
} }
} else { } else {
"".to_owned() shell.write_stderr(
}; format_args!("{prefix}{total_activated} activated features\n"),
&style::NOP,
shell.write_stderr(format_args!("{}Features{}:\n", prefix, suffix), &style::NOP)?; )?;
const MAX_FEATURE_PRINTS: usize = 50;
let mut activated_printed = 0;
let total_activated = activated.len();
for feat in activated {
if activated_printed >= MAX_FEATURE_PRINTS {
let remaining = total_activated - activated_printed;
shell.write_stderr(
format_args!("{prefix}... {remaining} more activated features\n"),
&style::NOP,
)?;
break;
}
shell.write_stderr(&prefix, &style::NOP)?;
shell.write_stderr('+', &style::GOOD)?;
shell.write_stderr(format_args!(" {}\n", feat), &style::NOP)?;
activated_printed += 1;
} }
let mut deactivated_printed = 0; if total_activated + total_deactivated <= MAX_FEATURE_PRINTS {
let total_deactivated = deactivated.len(); for feat in deactivated {
for feat in deactivated { shell.write_stderr(&prefix, &style::NOP)?;
if activated_printed + deactivated_printed >= MAX_FEATURE_PRINTS { shell.write_stderr('-', &style::ERROR)?;
let remaining = total_deactivated - deactivated_printed; shell.write_stderr(format_args!(" {feat}\n"), &style::NOP)?;
shell.write_stderr(
format_args!("{prefix}... {remaining} more deactivated features\n"),
&style::NOP,
)?;
break;
} }
} else {
shell.write_stderr(&prefix, &style::NOP)?; shell.write_stderr(
shell.write_stderr('-', &style::ERROR)?; format_args!("{prefix}{total_deactivated} deactivated features\n"),
shell.write_stderr(format_args!(" {}\n", feat), &style::NOP)?; &style::NOP,
deactivated_printed += 1; )?;
} }
} }
Ok(()) Ok(())
} }
fn format_features_version_suffix(dep: &DependencyUI) -> String {
if let Some(version) = &dep.available_version {
let mut version = version.clone();
version.build = Default::default();
let version = version.to_string();
// Avoid displaying the version if it will visually look like the version req that we
// showed earlier
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()
}
}
// Based on Iterator::is_sorted from nightly std; remove in favor of that when stabilized. // Based on Iterator::is_sorted from nightly std; remove in favor of that when stabilized.
fn is_sorted(mut it: impl Iterator<Item = impl PartialOrd>) -> bool { fn is_sorted(mut it: impl Iterator<Item = impl PartialOrd>) -> bool {
let Some(mut last) = it.next() else { let Some(mut last) = it.next() else {

View File

@ -0,0 +1,5 @@
Updating `dummy-registry` index
Adding your-face v99999.0.0 to dependencies.
Features:
100 activated features
100 deactivated features

View File

@ -8,7 +8,7 @@ use cargo_test_support::curr_dir;
#[cargo_test] #[cargo_test]
fn case() { fn case() {
const MANY_FEATURES_COUNT: usize = 200; const MANY_FEATURES_COUNT: usize = 200;
const ACTIVATED_FEATURES_COUNT: usize = 10; const ACTIVATED_FEATURES_COUNT: usize = 30;
cargo_test_support::registry::init(); cargo_test_support::registry::init();
let mut test_package = let mut test_package =

View File

@ -0,0 +1,8 @@
[workspace]
[package]
name = "cargo-list-test-fixture"
version = "0.0.0"
[dependencies]
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"] }

View File

@ -31,25 +31,4 @@
+ eyes027 + eyes027
+ eyes028 + eyes028
+ eyes029 + eyes029
+ eyes030 170 deactivated features
+ eyes031
+ eyes032
+ eyes033
+ eyes034
+ eyes035
+ eyes036
+ eyes037
+ eyes038
+ eyes039
+ eyes040
+ eyes041
+ eyes042
+ eyes043
+ eyes044
+ eyes045
+ eyes046
+ eyes047
+ eyes048
+ eyes049
... 50 more activated features
... 100 more deactivated features

View File

@ -1,8 +0,0 @@
[workspace]
[package]
name = "cargo-list-test-fixture"
version = "0.0.0"
[dependencies]
your-face = { version = "99999.0.0", features = ["eyes000", "eyes001", "eyes002", "eyes003", "eyes004", "eyes005", "eyes006", "eyes007", "eyes008", "eyes009"] }

View File

@ -1,54 +0,0 @@
Updating `dummy-registry` index
Adding your-face v99999.0.0 to dependencies.
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
- eyes030
- eyes031
- eyes032
- eyes033
- eyes034
- eyes035
- eyes036
- eyes037
- eyes038
- eyes039
- eyes040
- eyes041
- eyes042
- eyes043
- eyes044
- eyes045
- eyes046
- eyes047
- eyes048
- eyes049
... 150 more deactivated features

View File

@ -18,12 +18,12 @@ mod dev_prefer_existing_version;
mod dry_run; mod dry_run;
mod empty_dep_table; mod empty_dep_table;
mod features; mod features;
mod features_activated_over_limit;
mod features_deactivated_over_limit;
mod features_empty; mod features_empty;
mod features_multiple_occurrences; mod features_multiple_occurrences;
mod features_preserve; mod features_preserve;
mod features_spaced_values; mod features_spaced_values;
mod features_too_many_activated;
mod features_too_many_few_activated;
mod features_unknown; mod features_unknown;
mod features_unknown_no_features; mod features_unknown_no_features;
mod git; mod git;