From e12a721d84a612fe0e31e2c450f46f0907f6ec37 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 20 Jul 2022 07:42:08 -0400 Subject: [PATCH] no need for an exhaustive enum of subcommands --- cargo-miri/bin.rs | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/cargo-miri/bin.rs b/cargo-miri/bin.rs index 233d81826ee..2ab854b906a 100644 --- a/cargo-miri/bin.rs +++ b/cargo-miri/bin.rs @@ -1,3 +1,4 @@ +#![feature(let_else)] #![allow(clippy::useless_format, clippy::derive_partial_eq_without_eq)] mod version; @@ -34,11 +35,12 @@ cargo miri test -- test-suite-filter "#; -#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug)] enum MiriCommand { - Run, - Test, + /// Our own special 'setup' command. Setup, + /// A command to be forwarded to cargo. + Forward(String), } /// The information to run a crate with the given environment. @@ -339,9 +341,10 @@ fn write_to_file(filename: &Path, content: &str) { /// Performs the setup required to make `cargo miri` work: Getting a custom-built libstd. Then sets /// `MIRI_SYSROOT`. Skipped if `MIRI_SYSROOT` is already set, in which case we expect the user has /// done all this already. -fn setup(subcommand: MiriCommand) { +fn setup(subcommand: &MiriCommand) { + let only_setup = matches!(subcommand, MiriCommand::Setup); if std::env::var_os("MIRI_SYSROOT").is_some() { - if subcommand == MiriCommand::Setup { + if only_setup { println!("WARNING: MIRI_SYSROOT already set, not doing anything.") } return; @@ -349,7 +352,7 @@ fn setup(subcommand: MiriCommand) { // Subcommands other than `setup` will do a setup if necessary, but // interactively confirm first. - let ask_user = subcommand != MiriCommand::Setup; + let ask_user = !only_setup; // First, we need xargo. if xargo_version().map_or(true, |v| v < XARGO_MIN_VERSION) { @@ -495,11 +498,11 @@ fn setup(subcommand: MiriCommand) { let sysroot = if target == &host { dir.join("HOST") } else { PathBuf::from(dir) }; std::env::set_var("MIRI_SYSROOT", &sysroot); // pass the env var to the processes we spawn, which will turn it into "--sysroot" flags // Figure out what to print. - let print_sysroot = subcommand == MiriCommand::Setup && has_arg_flag("--print-sysroot"); // whether we just print the sysroot path + let print_sysroot = only_setup && has_arg_flag("--print-sysroot"); // whether we just print the sysroot path if print_sysroot { // Print just the sysroot and nothing else; this way we do not need any escaping. println!("{}", sysroot.display()); - } else if subcommand == MiriCommand::Setup { + } else if only_setup { println!("A libstd for Miri is now available in `{}`.", sysroot.display()); } } @@ -573,10 +576,12 @@ fn phase_cargo_miri(mut args: env::Args) { // Require a subcommand before any flags. // We cannot know which of those flags take arguments and which do not, // so we cannot detect subcommands later. - let subcommand = match args.next().as_deref() { - Some("test" | "t") => MiriCommand::Test, - Some("run" | "r") => MiriCommand::Run, - Some("setup") => MiriCommand::Setup, + let Some(subcommand) = args.next() else { + show_error(format!("`cargo miri` needs to be called with a subcommand (`run`, `test`)")); + }; + let subcommand = match &*subcommand { + "setup" => MiriCommand::Setup, + "test" | "t" | "run" | "r" => MiriCommand::Forward(subcommand), // Invalid command. _ => show_error(format!( @@ -586,7 +591,7 @@ fn phase_cargo_miri(mut args: env::Args) { let verbose = has_arg_flag("-v"); // We always setup. - setup(subcommand); + setup(&subcommand); // Invoke actual cargo for the job, but with different flags. // We re-use `cargo test` and `cargo run`, which makes target and binary handling very easy but @@ -596,8 +601,7 @@ fn phase_cargo_miri(mut args: env::Args) { // harder. let cargo_miri_path = std::env::current_exe().expect("current executable path invalid"); let cargo_cmd = match subcommand { - MiriCommand::Test => "test", - MiriCommand::Run => "run", + MiriCommand::Forward(s) => s, MiriCommand::Setup => return, // `cargo miri setup` stops here. }; let mut cmd = cargo(); -- 2.44.0