1use gh_workflow::*;
2
3use crate::tasks::workflows::{
4 runners,
5 steps::{self, NamedJob, named},
6 vars::{self, StepOutput, WorkflowInput},
7};
8
9pub fn autofix_pr() -> Workflow {
10 let pr_number = WorkflowInput::string("pr_number", None);
11 let autofix = run_autofix(&pr_number);
12 named::workflow()
13 .run_name(format!("autofix PR #{pr_number}"))
14 .on(Event::default().workflow_dispatch(
15 WorkflowDispatch::default().add_input(pr_number.name, pr_number.input()),
16 ))
17 .add_job(autofix.name, autofix.job)
18}
19
20fn run_autofix(pr_number: &WorkflowInput) -> NamedJob {
21 fn authenticate_as_zippy() -> (Step<Use>, StepOutput) {
22 let step = named::uses(
23 "actions",
24 "create-github-app-token",
25 "bef1eaf1c0ac2b148ee2a0a74c65fbe6db0631f1",
26 )
27 .add_with(("app-id", vars::ZED_ZIPPY_APP_ID))
28 .add_with(("private-key", vars::ZED_ZIPPY_APP_PRIVATE_KEY))
29 .id("get-app-token");
30 let output = StepOutput::new(&step, "token");
31 (step, output)
32 }
33
34 fn checkout_pr(pr_number: &WorkflowInput, token: &StepOutput) -> Step<Run> {
35 named::bash(&format!("gh pr checkout {pr_number}")).add_env(("GITHUB_TOKEN", token))
36 }
37
38 fn run_cargo_fmt() -> Step<Run> {
39 named::bash("cargo fmt --all")
40 }
41
42 fn run_clippy_fix() -> Step<Run> {
43 named::bash(
44 "cargo clippy --workspace --release --all-targets --all-features --fix --allow-dirty --allow-staged",
45 )
46 }
47
48 fn commit_and_push(token: &StepOutput) -> Step<Run> {
49 named::bash(indoc::indoc! {r#"
50 if git diff --quiet; then
51 echo "No changes to commit"
52 else
53 git add -A
54 git commit -m "Apply cargo fmt and clippy --fix"
55 git push
56 fi
57 "#})
58 .add_env(("GIT_COMMITTER_NAME", "Zed Zippy"))
59 .add_env(("GIT_COMMITTER_EMAIL", "hi@zed.dev"))
60 .add_env(("GIT_AUTHOR_NAME", "Zed Zippy"))
61 .add_env(("GIT_AUTHOR_EMAIL", "hi@zed.dev"))
62 .add_env(("GITHUB_TOKEN", token))
63 }
64
65 let (authenticate, token) = authenticate_as_zippy();
66
67 named::job(
68 Job::default()
69 .runs_on(runners::LINUX_SMALL)
70 .add_step(authenticate)
71 .add_step(steps::checkout_repo_with_token(&token))
72 .add_step(checkout_pr(pr_number, &token))
73 .add_step(run_cargo_fmt())
74 .add_step(run_clippy_fix())
75 .add_step(commit_and_push(&token)),
76 )
77}