diff --git a/src/cli.rs b/src/cli.rs index a8af01b5..554812f3 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -430,21 +430,16 @@ impl Args { term::set_coloring(color.as_deref())?; - if ignore_unknown_features { - if features.is_empty() && include_features.is_empty() && group_features.is_empty() { - requires("--ignore-unknown-features", &[ - "--features", - "--include-features", - "--group-features", - ])?; - } - if !include_features.is_empty() { - let _guard = term::warn::scoped(false); - // TODO: implement - warn!( - "--ignore-unknown-features for --include-features is not fully implemented and may not work as intended" - ); - } + if ignore_unknown_features + && features.is_empty() + && include_features.is_empty() + && group_features.is_empty() + { + requires("--ignore-unknown-features", &[ + "--features", + "--include-features", + "--group-features", + ])?; } if !each_feature && !feature_powerset { if optional_deps.is_some() { diff --git a/src/main.rs b/src/main.rs index 2f126eb7..5665a2d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -301,6 +301,17 @@ fn determine_kind(cx: &Context, id: PackageId, multiple_packages: bool) -> Optio cx.include_features.iter().filter(filter).collect() }; + let features = features + .into_iter() + .filter(|feature| match feature { + Feature::Normal { name } => package.features.contains_key(name.as_str()), + Feature::Group { list, .. } => { + list.iter().any(|name| package.features.contains_key(name.as_str())) + } + Feature::Path { .. } => true, + }) + .collect::>(); + if cx.each_feature { if (pkg_features.normal().is_empty() && pkg_features.optional_deps().is_empty() || !cx.include_features.is_empty()) diff --git a/tests/fixtures/include_features_ignore_unknown/Cargo.toml b/tests/fixtures/include_features_ignore_unknown/Cargo.toml new file mode 100644 index 00000000..03ba668c --- /dev/null +++ b/tests/fixtures/include_features_ignore_unknown/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +resolver = "2" +members = ["features-a-b", "features-a-c", "features-c-d"] diff --git a/tests/fixtures/include_features_ignore_unknown/features-a-b/Cargo.toml b/tests/fixtures/include_features_ignore_unknown/features-a-b/Cargo.toml new file mode 100644 index 00000000..f063aa8b --- /dev/null +++ b/tests/fixtures/include_features_ignore_unknown/features-a-b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "features-a-b" +version = "0.0.0" +publish = false + +[features] +a = [] +b = [] diff --git a/tests/fixtures/include_features_ignore_unknown/features-a-b/src/lib.rs b/tests/fixtures/include_features_ignore_unknown/features-a-b/src/lib.rs new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/fixtures/include_features_ignore_unknown/features-a-b/src/lib.rs @@ -0,0 +1 @@ + diff --git a/tests/fixtures/include_features_ignore_unknown/features-a-c/Cargo.toml b/tests/fixtures/include_features_ignore_unknown/features-a-c/Cargo.toml new file mode 100644 index 00000000..c81b83bc --- /dev/null +++ b/tests/fixtures/include_features_ignore_unknown/features-a-c/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "features-a-c" +version = "0.0.0" +publish = false + +[features] +a = [] +c = [] diff --git a/tests/fixtures/include_features_ignore_unknown/features-a-c/src/lib.rs b/tests/fixtures/include_features_ignore_unknown/features-a-c/src/lib.rs new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/fixtures/include_features_ignore_unknown/features-a-c/src/lib.rs @@ -0,0 +1 @@ + diff --git a/tests/fixtures/include_features_ignore_unknown/features-c-d/Cargo.toml b/tests/fixtures/include_features_ignore_unknown/features-c-d/Cargo.toml new file mode 100644 index 00000000..a8d54884 --- /dev/null +++ b/tests/fixtures/include_features_ignore_unknown/features-c-d/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "features-c-d" +version = "0.0.0" +publish = false + +[features] +c = [] +d = [] diff --git a/tests/fixtures/include_features_ignore_unknown/features-c-d/src/lib.rs b/tests/fixtures/include_features_ignore_unknown/features-c-d/src/lib.rs new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/fixtures/include_features_ignore_unknown/features-c-d/src/lib.rs @@ -0,0 +1 @@ + diff --git a/tests/test.rs b/tests/test.rs index 8b8d8e33..4e58f2ae 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -468,21 +468,6 @@ fn ignore_unknown_features_failure() { or --group-features ", ); - - cargo_hack([ - "check", - "--ignore-unknown-features", - "--feature-powerset", - "--include-features", - "a", - ]) - .assert_success("real") - .stderr_contains( - " - --ignore-unknown-features for --include-features is not fully implemented and may not \ - work as intended - ", - ); } #[test] @@ -2068,3 +2053,45 @@ fn update_readme() { let command = "cargo hack --help"; test_helper::doc::sync_command_output_to_markdown(path, "readme-long-help", command, new); } + +#[test] +fn include_features_ignore_unknown() { + cargo_hack([ + "check", + "--each-feature", + "--include-features", + "a,b", + "--ignore-unknown-features", + ]) + .assert_success("include_features_ignore_unknown") + .stderr_contains( + " + running `cargo check --no-default-features --features a` on features-a-b (1/4) + running `cargo check --no-default-features --features b` on features-a-b (2/4) + running `cargo check --no-default-features --features a` on features-a-c (3/4) + running `cargo check` on features-c-d (4/4) + ", + ) + .stderr_not_contains("--features c") + .stderr_not_contains("--features d"); + + cargo_hack([ + "check", + "--feature-powerset", + "--include-features", + "a,b", + "--ignore-unknown-features", + ]) + .assert_success("include_features_ignore_unknown") + .stderr_contains( + " + running `cargo check --no-default-features --features a,b` on features-a-b (1/5) + running `cargo check --no-default-features --features a` on features-a-b (2/5) + running `cargo check --no-default-features --features b` on features-a-b (3/5) + running `cargo check --no-default-features --features a` on features-a-c (4/5) + running `cargo check` on features-c-d (5/5) + ", + ) + .stderr_not_contains("--features c") + .stderr_not_contains("--features d"); +}