1pub mod commands;
2pub mod context;
3pub mod environment;
4pub mod logging;
5pub mod utils;
6mod versions;
7
8pub mod prelude {
10 pub use anyhow;
11 pub use clap;
12 pub use derive_more;
13 pub use env_logger;
14 pub use rand;
15 pub use serde_json;
16
17 pub mod macros {
18 pub use tracel_xtask_macros::base_commands;
19 pub use tracel_xtask_macros::declare_command_args;
20 pub use tracel_xtask_macros::extend_command_args;
21 pub use tracel_xtask_macros::extend_subcommands;
22 pub use tracel_xtask_macros::extend_targets;
23 }
24
25 pub use crate::XtaskArgs;
26 pub use crate::commands as base_commands;
27 pub use crate::commands::Target;
28 pub use crate::commands::build::BuildCmdArgs;
29 pub use crate::commands::bump::BumpCmdArgs;
30 pub use crate::commands::bump::BumpSubCommand;
31 pub use crate::commands::check::CheckCmdArgs;
32 pub use crate::commands::check::CheckSubCommand;
33 pub use crate::commands::compile::CompileCmdArgs;
34 pub use crate::commands::container::ContainerCmdArgs;
35 pub use crate::commands::container::ContainerSubCommand;
36 pub use crate::commands::coverage::CoverageCmdArgs;
37 pub use crate::commands::dependencies::DependenciesCmdArgs;
38 pub use crate::commands::dependencies::DependenciesSubCommand;
39 pub use crate::commands::doc::DocCmdArgs;
40 pub use crate::commands::doc::DocSubCommand;
41 pub use crate::commands::docker_compose::DockerComposeCmdArgs;
42 pub use crate::commands::docker_compose::DockerComposeSubCommand;
43 pub use crate::commands::fix::FixCmdArgs;
44 pub use crate::commands::fix::FixSubCommand;
45 pub use crate::commands::host::HostCmdArgs;
46 pub use crate::commands::host::HostSubCommand;
47 pub use crate::commands::infra::InfraCmdArgs;
48 pub use crate::commands::infra::InfraSubCommand;
49 pub use crate::commands::publish::PublishCmdArgs;
50 pub use crate::commands::secrets::SecretsCmdArgs;
51 pub use crate::commands::secrets::SecretsSubCommand;
52 pub use crate::commands::test::TestCmdArgs;
53 pub use crate::commands::test::TestSubCommand;
54 pub use crate::commands::validate::ValidateCmdArgs;
55 pub use crate::commands::vulnerabilities::VulnerabilitiesCmdArgs;
56 pub use crate::commands::vulnerabilities::VulnerabilitiesSubCommand;
57 pub use crate::context::Context;
58 pub use crate::endgroup;
59 pub use crate::environment::Environment;
60 pub use crate::environment::EnvironmentIndex;
61 pub use crate::environment::EnvironmentName;
62 pub use crate::environment::ExplicitIndex;
63 pub use crate::group;
64 pub use crate::group_info;
65 pub use crate::handle_cleanup;
66 pub use crate::init_xtask;
67 pub use crate::parse_args;
68 pub use crate::register_cleanup;
69 pub use crate::utils::aws;
70 pub use crate::utils::cargo::ensure_cargo_crate_is_installed;
71 pub use crate::utils::cleanup::CLEANUP_HANDLER;
72 pub use crate::utils::git;
73 pub use crate::utils::helpers;
74 pub use crate::utils::process::random_port;
75 pub use crate::utils::process::run_process;
76 pub use crate::utils::process::run_process_for_package;
77 pub use crate::utils::process::run_process_for_workspace;
78 pub use crate::utils::prompt::ask_once;
79 pub use crate::utils::rustup::is_current_toolchain_nightly;
80 pub use crate::utils::rustup::rustup_add_component;
81 pub use crate::utils::rustup::rustup_add_target;
82 pub use crate::utils::rustup::rustup_get_installed_targets;
83 pub use crate::utils::terraform;
84 pub use crate::utils::time::format_duration;
85 }
87
88use environment::EnvironmentName;
89use prelude::Environment;
90
91use crate::context::Context;
92use crate::logging::init_logger;
93
94#[macro_use]
95extern crate log;
96
97#[derive(clap::Parser)]
98#[command(author, version, about, long_about = None)]
99pub struct XtaskArgs<C: clap::Subcommand> {
100 #[arg(long)]
102 pub enable_coverage: bool,
103 #[arg(short = 'e', long = "env_name", default_value_t = EnvironmentName::default())]
105 pub environment_name: EnvironmentName,
106 #[arg(short = 'i', long = "env_index", default_value_t = 1, value_parser = clap::value_parser!(u8).range(1..=255))]
108 pub environment_index: u8,
109 #[arg(short = 'c', long, default_value_t = Context::default())]
111 pub context: Context,
112 #[command(subcommand)]
113 pub command: C,
114}
115
116pub fn parse_args<C: clap::Subcommand>() -> anyhow::Result<(XtaskArgs<C>, Environment)> {
117 init_logger().init();
119 let args = <XtaskArgs<C> as clap::Parser>::parse();
120 let env = Environment::new(args.environment_name.clone(), args.environment_index);
121 Ok((args, env))
122}
123
124pub fn init_xtask<C: clap::Subcommand>(
125 config: (XtaskArgs<C>, Environment),
126) -> anyhow::Result<(XtaskArgs<C>, Environment)> {
127 let args = config.0;
128 let env = config.1;
129 group_info!("Environment: {}", env.long());
130 env.load(None)?;
131 group_info!("Context: {}", args.context);
132 if args.enable_coverage {
134 group_info!("Enabling coverage support...");
135 setup_coverage()?;
136 }
137 Ok((args, env))
138}
139
140fn setup_coverage() -> anyhow::Result<()> {
141 unsafe {
142 std::env::set_var("RUSTFLAGS", "-Cinstrument-coverage");
143 std::env::set_var("LLVM_PROFILE_FILE", "burn-%p-%m.profraw");
144 }
145 Ok(())
146}