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}