Skip to content

Commit ea259a0

Browse files
committed
Auto merge of #10337 - WaffleLapkin:merge_futures_with_all_features, r=alexcrichton
Do not ignore `--features` when `--all-features` is present This allows to specify dependency features when using `--all-features`, for example: ```shell $ cargo run --example example --all-features --features="tracing/log" ``` You can test this in this repository: https://github.com/WaffleLapkin/cargo_all_some_features, it contains an example with ``required-features = [..., "tracing/log"]`` that is impossible to run with `--all-features` without this patch. An attempt to fix #10333
2 parents 641a515 + b7e5186 commit ea259a0

File tree

7 files changed

+101
-26
lines changed

7 files changed

+101
-26
lines changed

src/cargo/core/resolver/dep_cache.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,14 +323,14 @@ fn build_requirements<'a, 'b: 'a>(
323323
return Err(e.into_activate_error(parent, s));
324324
}
325325
}
326-
} else {
327-
for fv in features.iter() {
328-
if let Err(e) = reqs.require_value(fv) {
329-
return Err(e.into_activate_error(parent, s));
330-
}
326+
}
327+
328+
for fv in features.iter() {
329+
if let Err(e) = reqs.require_value(fv) {
330+
return Err(e.into_activate_error(parent, s));
331331
}
332-
handle_default(*uses_default_features, &mut reqs)?;
333332
}
333+
handle_default(*uses_default_features, &mut reqs)?;
334334
}
335335
RequestedFeatures::DepFeatures {
336336
features,

src/cargo/core/resolver/features.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -680,19 +680,18 @@ impl<'a, 'cfg> FeatureResolver<'a, 'cfg> {
680680
) -> Vec<FeatureValue> {
681681
let summary = self.resolve.summary(pkg_id);
682682
let feature_map = summary.features();
683+
684+
let mut result: Vec<FeatureValue> = cli_features.features.iter().cloned().collect();
685+
let default = InternedString::new("default");
686+
if cli_features.uses_default_features && feature_map.contains_key(&default) {
687+
result.push(FeatureValue::Feature(default));
688+
}
689+
683690
if cli_features.all_features {
684-
feature_map
685-
.keys()
686-
.map(|k| FeatureValue::Feature(*k))
687-
.collect()
688-
} else {
689-
let mut result: Vec<FeatureValue> = cli_features.features.iter().cloned().collect();
690-
let default = InternedString::new("default");
691-
if cli_features.uses_default_features && feature_map.contains_key(&default) {
692-
result.push(FeatureValue::Feature(default));
693-
}
694-
result
691+
result.extend(feature_map.keys().map(|k| FeatureValue::Feature(*k)))
695692
}
693+
694+
result
696695
}
697696

698697
/// Returns the dependencies for a package, filtering out inactive targets.

src/cargo/core/workspace.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,7 +1117,7 @@ impl<'cfg> Workspace<'cfg> {
11171117
cli_features: &CliFeatures,
11181118
found_features: &mut BTreeSet<FeatureValue>,
11191119
) -> CliFeatures {
1120-
if cli_features.features.is_empty() || cli_features.all_features {
1120+
if cli_features.features.is_empty() {
11211121
return cli_features.clone();
11221122
}
11231123

@@ -1185,7 +1185,7 @@ impl<'cfg> Workspace<'cfg> {
11851185
}
11861186
CliFeatures {
11871187
features: Rc::new(features),
1188-
all_features: false,
1188+
all_features: cli_features.all_features,
11891189
uses_default_features: cli_features.uses_default_features,
11901190
}
11911191
}

src/cargo/ops/tree/graph.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -473,12 +473,12 @@ fn add_cli_features(
473473
let mut to_add: HashSet<FeatureValue> = HashSet::new();
474474
if cli_features.all_features {
475475
to_add.extend(feature_map.keys().map(|feat| FeatureValue::Feature(*feat)));
476-
} else {
477-
if cli_features.uses_default_features {
478-
to_add.insert(FeatureValue::Feature(InternedString::new("default")));
479-
}
480-
to_add.extend(cli_features.features.iter().cloned());
481-
};
476+
}
477+
478+
if cli_features.uses_default_features {
479+
to_add.insert(FeatureValue::Feature(InternedString::new("default")));
480+
}
481+
to_add.extend(cli_features.features.iter().cloned());
482482

483483
// Add each feature as a node, and mark as "from command-line" in graph.cli_features.
484484
for fv in to_add {

tests/testsuite/features2.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2398,3 +2398,77 @@ foo v0.1.0 [..]
23982398
)
23992399
.run();
24002400
}
2401+
2402+
#[cargo_test]
2403+
fn all_features_merges_with_features() {
2404+
Package::new("dep", "0.1.0")
2405+
.feature("feat1", &[])
2406+
.file(
2407+
"src/lib.rs",
2408+
r#"
2409+
#[cfg(feature="feat1")]
2410+
pub fn work() {
2411+
println!("it works");
2412+
}
2413+
"#,
2414+
)
2415+
.publish();
2416+
2417+
let p = project()
2418+
.file(
2419+
"Cargo.toml",
2420+
r#"
2421+
[package]
2422+
name = "foo"
2423+
version = "0.1.0"
2424+
edition = "2018"
2425+
2426+
[features]
2427+
a = []
2428+
2429+
[dependencies]
2430+
dep = "0.1"
2431+
2432+
[[example]]
2433+
name = "ex"
2434+
required-features = ["a", "dep/feat1"]
2435+
"#,
2436+
)
2437+
.file(
2438+
"examples/ex.rs",
2439+
r#"
2440+
fn main() {
2441+
dep::work();
2442+
}
2443+
"#,
2444+
)
2445+
.file("src/lib.rs", "")
2446+
.build();
2447+
2448+
p.cargo("run --example ex --all-features --features dep/feat1")
2449+
.with_stderr(
2450+
"\
2451+
[UPDATING] [..]
2452+
[DOWNLOADING] crates ...
2453+
[DOWNLOADED] [..]
2454+
[COMPILING] dep v0.1.0
2455+
[COMPILING] foo v0.1.0 [..]
2456+
[FINISHED] [..]
2457+
[RUNNING] `target/debug/examples/ex[EXE]`
2458+
",
2459+
)
2460+
.with_stdout("it works")
2461+
.run();
2462+
2463+
switch_to_resolver_2(&p);
2464+
2465+
p.cargo("run --example ex --all-features --features dep/feat1")
2466+
.with_stderr(
2467+
"\
2468+
[FINISHED] [..]
2469+
[RUNNING] `target/debug/examples/ex[EXE]`
2470+
",
2471+
)
2472+
.with_stdout("it works")
2473+
.run();
2474+
}

tests/testsuite/features_namespaced.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,8 @@ foo v0.1.0 ([ROOT]/foo)
849849
bar v1.0.0
850850
└── bar feature \"default\"
851851
└── foo v0.1.0 ([ROOT]/foo)
852-
└── foo feature \"a\" (command-line)
852+
├── foo feature \"a\" (command-line)
853+
└── foo feature \"default\" (command-line)
853854
",
854855
)
855856
.run();

tests/testsuite/tree_graph_features.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ foo v0.1.0 ([..]/foo)
275275
opt2 v1.0.0
276276
└── opt2 feature \"default\"
277277
└── foo v0.1.0 ([..]/foo)
278+
├── foo feature \"default\" (command-line)
278279
├── foo feature \"f1\" (command-line)
279280
│ └── foo feature \"f2\" (command-line)
280281
├── foo feature \"f2\" (command-line)

0 commit comments

Comments
 (0)