autofix_pr.rs

 1use gh_workflow::*;
 2
 3use crate::tasks::workflows::{
 4    runners,
 5    steps::{self, FluentBuilder, 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 run_prettier_fix() -> Step<Run> {
49        named::bash("./script/prettier --write")
50    }
51
52    fn commit_and_push(token: &StepOutput) -> Step<Run> {
53        named::bash(indoc::indoc! {r#"
54            if git diff --quiet; then
55                echo "No changes to commit"
56            else
57                git add -A
58                git commit -m "Autofix"
59                git push
60            fi
61        "#})
62        .add_env(("GIT_COMMITTER_NAME", "Zed Zippy"))
63        .add_env((
64            "GIT_COMMITTER_EMAIL",
65            "234243425+zed-zippy[bot]@users.noreply.github.com",
66        ))
67        .add_env(("GIT_AUTHOR_NAME", "Zed Zippy"))
68        .add_env((
69            "GIT_AUTHOR_EMAIL",
70            "234243425+zed-zippy[bot]@users.noreply.github.com",
71        ))
72        .add_env(("GITHUB_TOKEN", token))
73    }
74
75    let (authenticate, token) = authenticate_as_zippy();
76
77    named::job(
78        Job::default()
79            .runs_on(runners::LINUX_DEFAULT)
80            .add_step(authenticate)
81            .add_step(steps::checkout_repo_with_token(&token))
82            .add_step(checkout_pr(pr_number, &token))
83            .add_step(steps::setup_cargo_config(runners::Platform::Linux))
84            .add_step(steps::cache_rust_dependencies_namespace())
85            .map(steps::install_linux_dependencies)
86            .add_step(steps::setup_pnpm())
87            .add_step(run_prettier_fix())
88            .add_step(run_cargo_fmt())
89            .add_step(run_clippy_fix())
90            .add_step(commit_and_push(&token))
91            .add_step(steps::cleanup_cargo_config(runners::Platform::Linux)),
92    )
93}