workflows.rs

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