autofix_pr.rs

 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}