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