From df7655ab99ff1b8605a3a710f37d980272f72b59 Mon Sep 17 00:00:00 2001 From: "Renaud N\\'zaou" Date: Mon, 24 Jun 2024 13:46:37 +0200 Subject: [PATCH] forward unstable feature flags to cargo commands --- src/bin/commands/run.rs | 1 + src/cargo.rs | 7 +++++++ src/cli.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/src/bin/commands/run.rs b/src/bin/commands/run.rs index 836a90bd0..488817b3e 100644 --- a/src/bin/commands/run.rs +++ b/src/bin/commands/run.rs @@ -39,6 +39,7 @@ impl Run { let args = Args { cargo_args: vec![], rest_args: vec![], + unstable_features: vec![], subcommand: None, channel: None, target: Some(target.clone()), diff --git a/src/cargo.rs b/src/cargo.rs index 010c655ef..0bdfdbdb4 100644 --- a/src/cargo.rs +++ b/src/cargo.rs @@ -153,6 +153,13 @@ pub fn cargo_metadata_with_args( if let Some(features) = args.map(|a| &a.features).filter(|v| !v.is_empty()) { command.args([String::from("--features"), features.join(",")]); } + if let Some(unstable_features) = args.map(|a| &a.unstable_features).filter(|v| !v.is_empty()) { + command.args( + unstable_features + .iter() + .flat_map(|f| [String::from("-Z"), f.to_owned()]), + ); + } let output = command.run_and_get_output(msg_info)?; if !output.status.success() { msg_info.warn("unable to get metadata for package")?; diff --git a/src/cli.rs b/src/cli.rs index 982ebde66..956969636 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -16,6 +16,7 @@ pub struct Args { pub channel: Option, pub target: Option, pub features: Vec, + pub unstable_features: Vec, pub target_dir: Option, pub manifest_path: Option, pub version: bool, @@ -170,6 +171,7 @@ pub fn parse(target_list: &TargetList) -> Result { let mut quiet = false; let mut verbose = 0; let mut color = None; + let mut unstable_features = Vec::new(); { let mut args = env::args().skip(1); @@ -264,6 +266,29 @@ pub fn parse(target_list: &TargetList) -> Result { )?); } } + } else if let Some(kind) = is_value_arg(&arg, "-Z") { + match kind { + ArgKind::Next => { + let next = parse_next_arg( + arg, + &mut cargo_args, + str_to_owned, + identity, + &mut args, + )?; + if let Some(feature) = next { + unstable_features.push(feature); + } + } + ArgKind::Equal => { + unstable_features.push(parse_equal_arg( + arg, + &mut cargo_args, + str_to_owned, + identity, + )?); + } + } } else if let Some(kind) = is_value_arg(&arg, "--target-dir") { match kind { ArgKind::Next => { @@ -299,6 +324,7 @@ pub fn parse(target_list: &TargetList) -> Result { rest_args, subcommand: sc, channel, + unstable_features, target, features, target_dir,