1use gh_workflow::*;
2use indoc::indoc;
3
4use crate::tasks::workflows::{
5 run_tests::{orchestrate, tests_pass},
6 runners,
7 steps::{self, CommonJobConditions, FluentBuilder, NamedJob, named},
8 vars::{PathCondition, StepOutput, one_workflow_per_non_main_branch},
9};
10
11pub(crate) const ZED_EXTENSION_CLI_SHA: &str = "7cfce605704d41ca247e3f84804bf323f6c6caaf";
12
13// This is used by various extensions repos in the zed-extensions org to run automated tests.
14pub(crate) fn extension_tests() -> Workflow {
15 let should_check_rust = PathCondition::new("check_rust", r"^(Cargo.lock|Cargo.toml|.*\.rs)$");
16 let should_check_extension = PathCondition::new("check_extension", r"^.*\.scm$");
17
18 let orchestrate = orchestrate(&[&should_check_rust, &should_check_extension]);
19
20 let jobs = [
21 orchestrate,
22 should_check_rust.guard(check_rust()),
23 should_check_extension.guard(check_extension()),
24 ];
25
26 let tests_pass = tests_pass(&jobs);
27
28 named::workflow()
29 .add_event(Event::default().workflow_call(WorkflowCall::default()))
30 .concurrency(one_workflow_per_non_main_branch())
31 .add_env(("CARGO_TERM_COLOR", "always"))
32 .add_env(("RUST_BACKTRACE", 1))
33 .add_env(("CARGO_INCREMENTAL", 0))
34 .add_env(("ZED_EXTENSION_CLI_SHA", ZED_EXTENSION_CLI_SHA))
35 .add_env((
36 "CARGO_BUILD_TARGET",
37 extension::extension_builder::RUST_TARGET,
38 ))
39 .map(|workflow| {
40 jobs.into_iter()
41 .chain([tests_pass])
42 .fold(workflow, |workflow, job| {
43 workflow.add_job(job.name, job.job)
44 })
45 })
46}
47
48fn run_clippy() -> Step<Run> {
49 named::bash("cargo clippy --release --all-targets --all-features -- --deny warnings")
50}
51
52fn check_rust() -> NamedJob {
53 let job = Job::default()
54 .with_repository_owner_guard()
55 .runs_on(runners::LINUX_LARGE)
56 .timeout_minutes(6u32)
57 .add_step(steps::checkout_repo())
58 .add_step(steps::cache_rust_dependencies_namespace())
59 .add_step(steps::cargo_fmt())
60 .add_step(run_clippy())
61 .add_step(steps::cargo_install_nextest())
62 .add_step(
63 steps::cargo_nextest(runners::Platform::Linux).add_env(("NEXTEST_NO_TESTS", "warn")),
64 );
65
66 named::job(job)
67}
68
69pub(crate) fn check_extension() -> NamedJob {
70 let (cache_download, cache_hit) = cache_zed_extension_cli();
71 let job = Job::default()
72 .with_repository_owner_guard()
73 .runs_on(runners::LINUX_LARGE_RAM)
74 .timeout_minutes(4u32)
75 .add_step(steps::checkout_repo())
76 .add_step(cache_download)
77 .add_step(download_zed_extension_cli(cache_hit))
78 .add_step(check());
79
80 named::job(job)
81}
82
83pub fn cache_zed_extension_cli() -> (Step<Use>, StepOutput) {
84 let step = named::uses(
85 "actions",
86 "cache",
87 "0057852bfaa89a56745cba8c7296529d2fc39830",
88 )
89 .id("cache-zed-extension-cli")
90 .with(
91 Input::default()
92 .add("path", "zed-extension")
93 .add("key", "zed-extension-${{ env.ZED_EXTENSION_CLI_SHA }}"),
94 );
95 let output = StepOutput::new(&step, "cache-hit");
96 (step, output)
97}
98
99pub fn download_zed_extension_cli(cache_hit: StepOutput) -> Step<Run> {
100 named::bash(
101 indoc! {
102 r#"
103 wget --quiet "https://zed-extension-cli.nyc3.digitaloceanspaces.com/$ZED_EXTENSION_CLI_SHA/x86_64-unknown-linux-gnu/zed-extension"
104 chmod +x zed-extension
105 "#,
106 }
107 ).if_condition(Expression::new(format!("{} != 'true'", cache_hit.expr())))
108}
109
110pub fn check() -> Step<Run> {
111 named::bash(indoc! {
112 r#"
113 mkdir -p /tmp/ext-scratch
114 mkdir -p /tmp/ext-output
115 ./zed-extension --source-dir . --scratch-dir /tmp/ext-scratch --output-dir /tmp/ext-output
116 "#
117 })
118}