diff options
Diffstat (limited to 'crates/rebel/src/main.rs')
-rw-r--r-- | crates/rebel/src/main.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/crates/rebel/src/main.rs b/crates/rebel/src/main.rs new file mode 100644 index 0000000..bd08f18 --- /dev/null +++ b/crates/rebel/src/main.rs @@ -0,0 +1,79 @@ +mod args; +mod context; +mod driver; +mod parse; +mod paths; +mod pin; +mod recipe; +mod resolve; +mod task; +mod template; + +use std::collections::HashSet; + +use clap::Parser; + +use runner::Runner; + +#[derive(Parser)] +#[clap(version, about)] +struct Opts { + /// Allow N jobs at once. + /// Defaults to the number of available CPUs + #[clap(short, long)] + jobs: Option<usize>, + /// Keep going after some tasks have failed + #[clap(short, long)] + keep_going: bool, + /// The tasks to run + #[clap(name = "task", required = true)] + tasks: Vec<String>, +} + +fn main() { + let opts: Opts = Opts::parse(); + + let runner = unsafe { Runner::new(&runner::Options { jobs: opts.jobs }) }.unwrap(); + + let ctx = context::Context::new( + recipe::read_recipes("examples/recipes").unwrap(), + pin::read_pins("examples/pins.yml").unwrap(), + ) + .unwrap(); + + let mut rsv = resolve::Resolver::new(&ctx); + let mut force_run = HashSet::new(); + + for task in opts.tasks { + let (task_ref, flags) = match ctx.parse(&task) { + Ok(task_ref) => task_ref, + Err(err) => { + eprintln!("{}", err); + std::process::exit(1); + } + }; + let errors = rsv.add_goal(&task_ref); + if !errors.is_empty() { + for error in errors { + eprintln!("{}", error); + } + std::process::exit(1); + } + if flags.force_run { + force_run.insert(task_ref); + } + } + let taskset = rsv.into_taskset(); + let mut driver = driver::Driver::new(&ctx, taskset, force_run).unwrap(); + match driver.run(&runner, opts.keep_going) { + Ok(success) => { + if !success { + std::process::exit(1); + } + } + Err(error) => { + eprintln!("{}", error); + std::process::exit(1); + } + } +} |