1use gh_workflow::*;
2
3use crate::tasks::workflows::{
4 runners,
5 steps::{self, NamedJob, named, upload_artifact},
6 vars::Input,
7};
8
9pub fn compare_perf() -> Workflow {
10 let head = Input::string("head", None);
11 let base = Input::string("base", None);
12 let run_perf = run_perf(&base, &head);
13 named::workflow()
14 .on(Event::default().workflow_dispatch(
15 WorkflowDispatch::default()
16 .add_input(head.name, head.input())
17 .add_input(base.name, base.input()),
18 ))
19 .add_job(run_perf.name, run_perf.job)
20}
21
22pub fn run_perf(base: &Input, head: &Input) -> NamedJob {
23 fn echo_inputs(base: &Input, head: &Input) -> Step<Run> {
24 named::bash(&format!("echo {} {}", base.var(), head.var()))
25 }
26
27 fn cargo_perf_test(ref_name: String) -> Step<Run> {
28 // TODO: vim not gpui, and ideally allow args
29 named::bash(&format!("cargo perf-test -p gpui -- --json={ref_name}"))
30 }
31
32 fn git_checkout(ref_name: String) -> Step<Run> {
33 named::bash(
34 &format!("git fetch origin {ref_name} && git checkout {ref_name}"))
35 }
36
37 fn compare_runs(head: String, base: String) -> Step<Run> {
38 // TODO: this should really be swapped...
39 named::bash(&format!("cargo perf-compare {base} {head} --save=results.md"))
40 }
41
42 named::job(
43 Job::default()
44 .runs_on(runners::LINUX_DEFAULT)
45 .add_step(steps::checkout_repo())
46 .add_step(echo_inputs(base, head))
47 .add_step(git_checkout(base.var()))
48 .add_step(cargo_perf_test(base.var()))
49 .add_step(git_checkout(head.var()))
50 .add_step(cargo_perf_test(head.var()))
51 .add_step(compare_runs(head.var(), base.var()))
52 .add_step(upload_artifact("results.md", "results.md")),
53 )
54}