From 5b1396304494337e1c3c2fbb4d5f9ab81e7e7b59 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 26 Apr 2023 11:18:51 -0500 Subject: [PATCH] perf(xtask): Split xtask binaries This will allow running an xtask without requiring building the world. In most cases, a user will already have been building cargo but not in CI. The packages keep an `xtask-` prefix to help raise awareness of them but exposed as `cargo ` to avoid having a direction proxy to wrap `cargo run -p xtask-` as `cargo xtask `. --- .cargo/config.toml | 2 +- Cargo.lock | 2 +- .../{xtask => xtask-unpublished}/Cargo.toml | 2 +- .../{xtask => xtask-unpublished}/src/main.rs | 1 - .../src/xtask.rs} | 73 +++++++++++++++- crates/xtask/src/xtask.rs | 83 ------------------- 6 files changed, 75 insertions(+), 88 deletions(-) rename crates/{xtask => xtask-unpublished}/Cargo.toml (86%) rename crates/{xtask => xtask-unpublished}/src/main.rs (96%) rename crates/{xtask/src/unpublished.rs => xtask-unpublished/src/xtask.rs} (53%) delete mode 100644 crates/xtask/src/xtask.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 35049cbcb..3cea81f34 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,2 @@ [alias] -xtask = "run --package xtask --" +unpublished = "run --package xtask-unpublished --" diff --git a/Cargo.lock b/Cargo.lock index 8e32c3d07..238f12f85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3695,7 +3695,7 @@ dependencies = [ ] [[package]] -name = "xtask" +name = "xtask-unpublished" version = "0.0.0" dependencies = [ "anyhow", diff --git a/crates/xtask/Cargo.toml b/crates/xtask-unpublished/Cargo.toml similarity index 86% rename from crates/xtask/Cargo.toml rename to crates/xtask-unpublished/Cargo.toml index ffe4cafbe..a7a85323f 100644 --- a/crates/xtask/Cargo.toml +++ b/crates/xtask-unpublished/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "xtask" +name = "xtask-unpublished" version = "0.0.0" edition = "2021" publish = false diff --git a/crates/xtask/src/main.rs b/crates/xtask-unpublished/src/main.rs similarity index 96% rename from crates/xtask/src/main.rs rename to crates/xtask-unpublished/src/main.rs index 9edb3c3d7..1942a3621 100644 --- a/crates/xtask/src/main.rs +++ b/crates/xtask-unpublished/src/main.rs @@ -1,4 +1,3 @@ -mod unpublished; mod xtask; fn main() { diff --git a/crates/xtask/src/unpublished.rs b/crates/xtask-unpublished/src/xtask.rs similarity index 53% rename from crates/xtask/src/unpublished.rs rename to crates/xtask-unpublished/src/xtask.rs index 7c1f44af4..095b483b7 100644 --- a/crates/xtask/src/unpublished.rs +++ b/crates/xtask-unpublished/src/xtask.rs @@ -5,10 +5,76 @@ use cargo::core::SourceId; use cargo::util::command_prelude::*; pub fn cli() -> clap::Command { - clap::Command::new("unpublished") + clap::Command::new("xtask-unpublished") + .arg( + opt( + "verbose", + "Use verbose output (-vv very verbose/build.rs output)", + ) + .short('v') + .action(ArgAction::Count) + .global(true), + ) + .arg_quiet() + .arg( + opt("color", "Coloring: auto, always, never") + .value_name("WHEN") + .global(true), + ) + .arg(flag("frozen", "Require Cargo.lock and cache are up to date").global(true)) + .arg(flag("locked", "Require Cargo.lock is up to date").global(true)) + .arg(flag("offline", "Run without accessing the network").global(true)) + .arg(multi_opt("config", "KEY=VALUE", "Override a configuration value").global(true)) + .arg( + Arg::new("unstable-features") + .help("Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details") + .short('Z') + .value_name("FLAG") + .action(ArgAction::Append) + .global(true), + ) } pub fn exec(args: &clap::ArgMatches, config: &mut cargo::util::Config) -> cargo::CliResult { + config_configure(config, args)?; + + unpublished(args, config)?; + + Ok(()) +} + +fn config_configure(config: &mut Config, args: &ArgMatches) -> CliResult { + let verbose = args.verbose(); + // quiet is unusual because it is redefined in some subcommands in order + // to provide custom help text. + let quiet = args.flag("quiet"); + let color = args.get_one::("color").map(String::as_str); + let frozen = args.flag("frozen"); + let locked = args.flag("locked"); + let offline = args.flag("offline"); + let mut unstable_flags = vec![]; + if let Some(values) = args.get_many::("unstable-features") { + unstable_flags.extend(values.cloned()); + } + let mut config_args = vec![]; + if let Some(values) = args.get_many::("config") { + config_args.extend(values.cloned()); + } + config.configure( + verbose, + quiet, + color, + frozen, + locked, + offline, + &None, + &unstable_flags, + &config_args, + )?; + Ok(()) +} + +fn unpublished(args: &clap::ArgMatches, config: &mut cargo::util::Config) -> cargo::CliResult { let ws = args.workspace(config)?; let mut results = Vec::new(); { @@ -84,3 +150,8 @@ pub fn exec(args: &clap::ArgMatches, config: &mut cargo::util::Config) -> cargo: Ok(()) } + +#[test] +fn verify_cli() { + cli().debug_assert(); +} diff --git a/crates/xtask/src/xtask.rs b/crates/xtask/src/xtask.rs deleted file mode 100644 index 1d6948fc7..000000000 --- a/crates/xtask/src/xtask.rs +++ /dev/null @@ -1,83 +0,0 @@ -use cargo::util::command_prelude::*; - -pub fn cli() -> clap::Command { - clap::Command::new("xtask") - .subcommand_required(true) - .arg_required_else_help(true) - .arg( - opt( - "verbose", - "Use verbose output (-vv very verbose/build.rs output)", - ) - .short('v') - .action(ArgAction::Count) - .global(true), - ) - .arg_quiet() - .arg( - opt("color", "Coloring: auto, always, never") - .value_name("WHEN") - .global(true), - ) - .arg(flag("frozen", "Require Cargo.lock and cache are up to date").global(true)) - .arg(flag("locked", "Require Cargo.lock is up to date").global(true)) - .arg(flag("offline", "Run without accessing the network").global(true)) - .arg(multi_opt("config", "KEY=VALUE", "Override a configuration value").global(true)) - .arg( - Arg::new("unstable-features") - .help("Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details") - .short('Z') - .value_name("FLAG") - .action(ArgAction::Append) - .global(true), - ) - .subcommands([crate::unpublished::cli()]) -} - -pub fn exec(args: &clap::ArgMatches, config: &mut cargo::util::Config) -> cargo::CliResult { - config_configure(config, args)?; - - match args.subcommand() { - Some(("unpublished", args)) => crate::unpublished::exec(args, config)?, - Some((name, _)) => unreachable!("clap enforces {name} to not exist"), - None => unreachable!("clap enforces a subcommand is present"), - } - - Ok(()) -} - -fn config_configure(config: &mut Config, args: &ArgMatches) -> CliResult { - let verbose = args.verbose(); - // quiet is unusual because it is redefined in some subcommands in order - // to provide custom help text. - let quiet = args.flag("quiet"); - let color = args.get_one::("color").map(String::as_str); - let frozen = args.flag("frozen"); - let locked = args.flag("locked"); - let offline = args.flag("offline"); - let mut unstable_flags = vec![]; - if let Some(values) = args.get_many::("unstable-features") { - unstable_flags.extend(values.cloned()); - } - let mut config_args = vec![]; - if let Some(values) = args.get_many::("config") { - config_args.extend(values.cloned()); - } - config.configure( - verbose, - quiet, - color, - frozen, - locked, - offline, - &None, - &unstable_flags, - &config_args, - )?; - Ok(()) -} - -#[test] -fn verify_cli() { - cli().debug_assert(); -}