1use anyhow::{Context, Result};
2use clap::Parser;
3use std::fs;
4use std::path::Path;
5
6mod cherry_pick;
7mod compare_perf;
8mod danger;
9mod nix_build;
10mod release_nightly;
11mod run_bundling;
12
13mod release;
14mod run_agent_evals;
15mod run_tests;
16mod runners;
17mod steps;
18mod vars;
19
20#[derive(Parser)]
21pub struct GenerateWorkflowArgs {}
22
23pub fn run_workflows(_: GenerateWorkflowArgs) -> Result<()> {
24 let dir = Path::new(".github/workflows");
25
26 let workflows = vec![
27 ("danger.yml", danger::danger()),
28 ("run_bundling.yml", run_bundling::run_bundling()),
29 ("release_nightly.yml", release_nightly::release_nightly()),
30 ("run_tests.yml", run_tests::run_tests()),
31 ("release.yml", release::release()),
32 ("cherry_pick.yml", cherry_pick::cherry_pick()),
33 ("compare_perf.yml", compare_perf::compare_perf()),
34 ("run_unit_evals.yml", run_agent_evals::run_unit_evals()),
35 ("run_agent_evals.yml", run_agent_evals::run_agent_evals()),
36 ];
37 fs::create_dir_all(dir)
38 .with_context(|| format!("Failed to create directory: {}", dir.display()))?;
39
40 for (filename, workflow) in workflows {
41 let content = workflow
42 .to_string()
43 .map_err(|e| anyhow::anyhow!("{}: {:?}", filename, e))?;
44 let content = format!(
45 "# Generated from xtask::workflows::{}\n# Rebuild with `cargo xtask workflows`.\n{}",
46 workflow.name.unwrap(),
47 content
48 );
49 let file_path = dir.join(filename);
50 fs::write(&file_path, content)?;
51 }
52
53 Ok(())
54}