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