From 8a4d85eb822642aba97abf102c523d4bffab2863 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 24 Oct 2025 00:16:12 -0600 Subject: [PATCH] Try gh_workflow generation --- Cargo.lock | 108 +++++++++++++++++++ Cargo.toml | 1 + crates/zed/Cargo.toml | 1 + tooling/xtask/Cargo.toml | 1 + tooling/xtask/src/main.rs | 2 + tooling/xtask/src/tasks.rs | 1 + tooling/xtask/src/tasks/generate_workflow.rs | 41 +++++++ 7 files changed, 155 insertions(+) create mode 100644 tooling/xtask/src/tasks/generate_workflow.rs diff --git a/Cargo.lock b/Cargo.lock index 58577d21f2bc2481451b12f98354ac6d8b474db1..db63eb976446ca185179fe349b381a87e84798d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4902,6 +4902,18 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "derive_setters" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae5c625eda104c228c06ecaf988d1c60e542176bd7a490e60eeda3493244c0c9" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "deunicode" version = "1.6.2" @@ -6942,6 +6954,35 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gh-workflow" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fffeec7bd9dfa73ffe1db38979cca5716ec6ffd944f03fae65fee81f16082ae" +dependencies = [ + "async-trait", + "derive_more 2.0.1", + "derive_setters", + "gh-workflow-macros", + "indexmap 2.11.4", + "merge", + "serde", + "serde_json", + "serde_yaml", + "strum_macros 0.27.2", +] + +[[package]] +name = "gh-workflow-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eafb4d2a1005d4ac6d041ce929af10be1de1e1eae478795d9d634b84ccf8191" +dependencies = [ + "heck 0.5.0", + "quote", + "syn 2.0.106", +] + [[package]] name = "gif" version = "0.13.3" @@ -9812,6 +9853,28 @@ dependencies = [ "gpui", ] +[[package]] +name = "merge" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10bbef93abb1da61525bbc45eeaff6473a41907d19f8f9aa5168d214e10693e9" +dependencies = [ + "merge_derive", + "num-traits", +] + +[[package]] +name = "merge_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209d075476da2e63b4b29e72a2ef627b840589588e71400a25e3565c4f849d07" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "metal" version = "0.29.0" @@ -12801,6 +12864,30 @@ dependencies = [ "toml_edit 0.23.7", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -15226,6 +15313,19 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.11.4", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "serial2" version = "0.2.33" @@ -18397,6 +18497,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.9.0" @@ -20806,6 +20912,7 @@ dependencies = [ "cargo_metadata", "cargo_toml", "clap", + "gh-workflow", "indoc", "toml 0.8.23", "toml_edit 0.22.27", @@ -21037,6 +21144,7 @@ dependencies = [ "file_finder", "fs", "futures 0.3.31", + "gh-workflow", "git", "git_hosting_providers", "git_ui", diff --git a/Cargo.toml b/Cargo.toml index e0682924bc377d40a0711630c77ad4dd000515b6..623314cc327bc3dd61efc98147879431c89204cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -506,6 +506,7 @@ fork = "0.2.0" futures = "0.3" futures-batch = "0.6.1" futures-lite = "1.13" +gh-workflow = "0.8.0" git2 = { version = "0.20.1", default-features = false } globset = "0.4" handlebars = "4.3" diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index c84fa8261fe2efdc4c8c831fcd239514c2d16526..b70a0cd012814c7f2ab48a784b03603b69bc5b3f 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -165,6 +165,7 @@ zeta.workspace = true zeta2.workspace = true zlog.workspace = true zlog_settings.workspace = true +gh-workflow = "0.8.0" [target.'cfg(target_os = "windows")'.dependencies] windows.workspace = true diff --git a/tooling/xtask/Cargo.toml b/tooling/xtask/Cargo.toml index aa06e6164683edd3bb011136a127b9fb99215e52..f51a24f3e97b2e636c6ef3badc76c645fe57ea19 100644 --- a/tooling/xtask/Cargo.toml +++ b/tooling/xtask/Cargo.toml @@ -16,3 +16,4 @@ clap = { workspace = true, features = ["derive"] } toml.workspace = true indoc.workspace = true toml_edit.workspace = true +gh-workflow.workspace = true diff --git a/tooling/xtask/src/main.rs b/tooling/xtask/src/main.rs index 5b265392f4035c205c4387dd10f1410f6c04d064..52f2285e0a80f59e40cf85561c445ec8a0af31ad 100644 --- a/tooling/xtask/src/main.rs +++ b/tooling/xtask/src/main.rs @@ -20,6 +20,7 @@ enum CliCommand { PackageConformity(tasks::package_conformity::PackageConformityArgs), /// Publishes GPUI and its dependencies to crates.io. PublishGpui(tasks::publish_gpui::PublishGpuiArgs), + GenerateWorkflow(tasks::generate_workflow::GenerateWorkflowArgs), } fn main() -> Result<()> { @@ -32,5 +33,6 @@ fn main() -> Result<()> { tasks::package_conformity::run_package_conformity(args) } CliCommand::PublishGpui(args) => tasks::publish_gpui::run_publish_gpui(args), + CliCommand::GenerateWorkflow(args) => tasks::generate_workflow::run_generate_workflow(args), } } diff --git a/tooling/xtask/src/tasks.rs b/tooling/xtask/src/tasks.rs index b73aeb0e7fce47980d61e326c8f41cebc06e07b2..e5cbaa2262ac6fceaa410bfc63a3515f2f173443 100644 --- a/tooling/xtask/src/tasks.rs +++ b/tooling/xtask/src/tasks.rs @@ -1,4 +1,5 @@ pub mod clippy; +pub mod generate_workflow; pub mod licenses; pub mod package_conformity; pub mod publish_gpui; diff --git a/tooling/xtask/src/tasks/generate_workflow.rs b/tooling/xtask/src/tasks/generate_workflow.rs new file mode 100644 index 0000000000000000000000000000000000000000..375ba461e068f15d9b80de7477c6ad53e66fe6f1 --- /dev/null +++ b/tooling/xtask/src/tasks/generate_workflow.rs @@ -0,0 +1,41 @@ +use anyhow::Result; +use clap::Parser; + +use gh_workflow::*; + +#[derive(Parser)] +pub struct GenerateWorkflowArgs {} + +pub fn run_generate_workflow(_args: GenerateWorkflowArgs) -> Result<()> { + // Create the "Run tests" composite action workflow + let workflow = Workflow::default().name("Run tests").add_job( + "run_tests", + Job::default() + .add_step(Step::new("Install Rust").run("cargo install cargo-nextest --locked")) + .add_step( + Step::new("Install Node") + .uses( + "actions", + "setup-node", + "49933ea5288caeca8642d1e84afbd3f7d6820020", + ) + .add_with(("node-version", "18")), + ) + .add_step( + Step::new("Limit target directory size") + .run("script/clear-target-dir-if-larger-than ${{ env.MAX_SIZE }}") + .env(("MAX_SIZE", "${{ runner.os == 'macOS' && 300 || 100 }}")), + ) + .add_step(Step::new("Run tests").run( + "cargo nextest run --workspace --no-fail-fast --failure-output immediate-final", + )), + ); + + // Generate and print the workflow YAML + let yaml = workflow + .to_string() + .map_err(|e| anyhow::anyhow!("{:?}", e))?; + println!("{}", yaml); + + Ok(()) +}