Skip to content

Commit 003bf5b

Browse files
committed
Implemented --ignore-unknown-features with --include-features.
1 parent 27d71cb commit 003bf5b

10 files changed

Lines changed: 90 additions & 30 deletions

File tree

src/cli.rs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -430,21 +430,16 @@ impl Args {
430430

431431
term::set_coloring(color.as_deref())?;
432432

433-
if ignore_unknown_features {
434-
if features.is_empty() && include_features.is_empty() && group_features.is_empty() {
435-
requires("--ignore-unknown-features", &[
436-
"--features",
437-
"--include-features",
438-
"--group-features",
439-
])?;
440-
}
441-
if !include_features.is_empty() {
442-
let _guard = term::warn::scoped(false);
443-
// TODO: implement
444-
warn!(
445-
"--ignore-unknown-features for --include-features is not fully implemented and may not work as intended"
446-
);
447-
}
433+
if ignore_unknown_features
434+
&& features.is_empty()
435+
&& include_features.is_empty()
436+
&& group_features.is_empty()
437+
{
438+
requires("--ignore-unknown-features", &[
439+
"--features",
440+
"--include-features",
441+
"--group-features",
442+
])?;
448443
}
449444
if !each_feature && !feature_powerset {
450445
if optional_deps.is_some() {

src/main.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,17 @@ fn determine_kind(cx: &Context, id: PackageId, multiple_packages: bool) -> Optio
301301
cx.include_features.iter().filter(filter).collect()
302302
};
303303

304+
let features = features
305+
.into_iter()
306+
.filter(|feature| match feature {
307+
Feature::Normal { name } => package.features.contains_key(name.as_str()),
308+
Feature::Group { list, .. } => {
309+
list.iter().any(|name| package.features.contains_key(name.as_str()))
310+
}
311+
Feature::Path { .. } => true,
312+
})
313+
.collect::<Vec<_>>();
314+
304315
if cx.each_feature {
305316
if (pkg_features.normal().is_empty() && pkg_features.optional_deps().is_empty()
306317
|| !cx.include_features.is_empty())
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[workspace]
2+
resolver = "2"
3+
members = ["features-a-b", "features-a-c", "features-c-d"]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "features-a-b"
3+
version = "0.0.0"
4+
publish = false
5+
6+
[features]
7+
a = []
8+
b = []

tests/fixtures/include_features_ignore_unknown/features-a-b/src/lib.rs

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "features-a-c"
3+
version = "0.0.0"
4+
publish = false
5+
6+
[features]
7+
a = []
8+
c = []

tests/fixtures/include_features_ignore_unknown/features-a-c/src/lib.rs

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "features-c-d"
3+
version = "0.0.0"
4+
publish = false
5+
6+
[features]
7+
c = []
8+
d = []

tests/fixtures/include_features_ignore_unknown/features-c-d/src/lib.rs

Whitespace-only changes.

tests/test.rs

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -468,21 +468,6 @@ fn ignore_unknown_features_failure() {
468468
or --group-features
469469
",
470470
);
471-
472-
cargo_hack([
473-
"check",
474-
"--ignore-unknown-features",
475-
"--feature-powerset",
476-
"--include-features",
477-
"a",
478-
])
479-
.assert_success("real")
480-
.stderr_contains(
481-
"
482-
--ignore-unknown-features for --include-features is not fully implemented and may not \
483-
work as intended
484-
",
485-
);
486471
}
487472

488473
#[test]
@@ -2068,3 +2053,45 @@ fn update_readme() {
20682053
let command = "cargo hack --help";
20692054
test_helper::doc::sync_command_output_to_markdown(path, "readme-long-help", command, new);
20702055
}
2056+
2057+
#[test]
2058+
fn include_features_ignore_unknown() {
2059+
cargo_hack([
2060+
"check",
2061+
"--each-feature",
2062+
"--include-features",
2063+
"a,b",
2064+
"--ignore-unknown-features",
2065+
])
2066+
.assert_success("include_features_ignore_unknown")
2067+
.stderr_contains(
2068+
"
2069+
running `cargo check --no-default-features --features a` on features-a-b (1/4)
2070+
running `cargo check --no-default-features --features b` on features-a-b (2/4)
2071+
running `cargo check --no-default-features --features a` on features-a-c (3/4)
2072+
running `cargo check` on features-c-d (4/4)
2073+
",
2074+
)
2075+
.stderr_not_contains("--features c")
2076+
.stderr_not_contains("--features d");
2077+
2078+
cargo_hack([
2079+
"check",
2080+
"--feature-powerset",
2081+
"--include-features",
2082+
"a,b",
2083+
"--ignore-unknown-features",
2084+
])
2085+
.assert_success("include_features_ignore_unknown")
2086+
.stderr_contains(
2087+
"
2088+
running `cargo check --no-default-features --features a,b` on features-a-b (1/5)
2089+
running `cargo check --no-default-features --features a` on features-a-b (2/5)
2090+
running `cargo check --no-default-features --features b` on features-a-b (3/5)
2091+
running `cargo check --no-default-features --features a` on features-a-c (4/5)
2092+
running `cargo check` on features-c-d (5/5)
2093+
",
2094+
)
2095+
.stderr_not_contains("--features c")
2096+
.stderr_not_contains("--features d");
2097+
}

0 commit comments

Comments
 (0)