Skip to repository content166 lines · 6.0 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T05:42:10.235Z Public web read
NIP-34 coordinate
30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omegaMaintainersHidden in public view
References2 branches · 1 tag
Read-only clone
git clone https://openagents.com/git/tenant.openagents/omega.gitBrowse files
autofix_pr.rs
1use gh_workflow::*;
2
3use crate::tasks::workflows::{
4 runners,
5 steps::{
6 self, CommonPermissionSets, DownloadArtifactStep, FluentBuilder, IfNoFilesFound, NamedJob,
7 RepositoryTarget, TokenPermissions, UploadArtifactStep, ZippyGitIdentity, named, use_clang,
8 },
9 vars::{self, StepOutput, WorkflowInput},
10};
11
12pub fn autofix_pr() -> Workflow {
13 let pr_number = WorkflowInput::string("pr_number", None);
14 let run_clippy = WorkflowInput::bool("run_clippy", Some(true));
15 let run_autofix = run_autofix(&pr_number, &run_clippy);
16 let commit_changes = commit_changes(&pr_number, &run_autofix);
17 named::workflow()
18 .with_minimal_permissions()
19 .run_name(format!("autofix PR #{pr_number}"))
20 .on(Event::default().workflow_dispatch(
21 WorkflowDispatch::default()
22 .add_input(pr_number.name, pr_number.input())
23 .add_input(run_clippy.name, run_clippy.input()),
24 ))
25 .concurrency(
26 Concurrency::new(Expression::new(format!(
27 "${{{{ github.workflow }}}}-{pr_number}"
28 )))
29 .cancel_in_progress(true),
30 )
31 .add_job(run_autofix.name.clone(), run_autofix.job)
32 .add_job(commit_changes.name, commit_changes.job)
33}
34
35const PATCH_ARTIFACT_NAME: &str = "autofix-patch";
36const PATCH_FILE_PATH: &str = "autofix.patch";
37
38fn upload_patch_artifact() -> UploadArtifactStep {
39 steps::upload_artifact(PATCH_ARTIFACT_NAME, PATCH_FILE_PATH)
40 .if_no_files_found(IfNoFilesFound::Ignore)
41 .retention_days(1)
42}
43
44fn download_patch_artifact() -> DownloadArtifactStep {
45 steps::download_artifact().artifact_name(PATCH_ARTIFACT_NAME)
46}
47
48fn run_autofix(pr_number: &WorkflowInput, run_clippy: &WorkflowInput) -> NamedJob {
49 fn checkout_pr(pr_number: &WorkflowInput) -> Step<Run> {
50 named::bash(r#"gh pr checkout "$PR_NUMBER""#)
51 .add_env(("PR_NUMBER", pr_number.to_string()))
52 .add_env(("GITHUB_TOKEN", vars::GITHUB_TOKEN))
53 }
54
55 fn install_cargo_machete() -> Step<Use> {
56 steps::taiki_install_action("cargo-machete@0.7.0")
57 }
58
59 fn run_cargo_fmt() -> Step<Run> {
60 named::bash("cargo fmt --all")
61 }
62
63 fn run_cargo_fix() -> Step<Run> {
64 named::bash("cargo fix --workspace --allow-dirty --allow-staged")
65 }
66
67 fn run_cargo_machete_fix() -> Step<Run> {
68 named::bash("cargo machete --fix")
69 }
70
71 fn run_clippy_fix() -> Step<Run> {
72 named::bash("cargo clippy --workspace --fix --allow-dirty --allow-staged")
73 }
74
75 fn run_prettier_fix() -> Step<Run> {
76 named::bash("./script/prettier --write")
77 }
78
79 fn create_patch() -> Step<Run> {
80 named::bash(indoc::indoc! {r#"
81 if git diff --quiet; then
82 echo "No changes to commit"
83 echo "has_changes=false" >> "$GITHUB_OUTPUT"
84 else
85 git diff > autofix.patch
86 echo "has_changes=true" >> "$GITHUB_OUTPUT"
87 fi
88 "#})
89 .id("create-patch")
90 }
91
92 named::job(use_clang(
93 Job::default()
94 .runs_on(runners::LINUX_DEFAULT)
95 .permissions(
96 Permissions::default()
97 .contents(Level::Read)
98 .pull_requests(Level::Read),
99 )
100 .outputs([(
101 "has_changes".to_owned(),
102 "${{ steps.create-patch.outputs.has_changes }}".to_owned(),
103 )])
104 .add_step(steps::checkout_repo())
105 .add_step(checkout_pr(pr_number))
106 .add_step(steps::setup_cargo_config(runners::Platform::Linux))
107 .add_step(steps::cache_rust_dependencies_namespace())
108 .map(steps::install_linux_dependencies)
109 .add_step(steps::setup_pnpm())
110 .add_step(install_cargo_machete().if_condition(Expression::new(run_clippy.to_string())))
111 .add_step(run_cargo_fix().if_condition(Expression::new(run_clippy.to_string())))
112 .add_step(run_cargo_machete_fix().if_condition(Expression::new(run_clippy.to_string())))
113 .add_step(run_clippy_fix().if_condition(Expression::new(run_clippy.to_string())))
114 .add_step(run_prettier_fix())
115 .add_step(run_cargo_fmt())
116 .add_step(create_patch())
117 .add_step(upload_patch_artifact())
118 .add_step(steps::cleanup_cargo_config(runners::Platform::Linux)),
119 ))
120}
121
122fn commit_changes(pr_number: &WorkflowInput, autofix_job: &NamedJob) -> NamedJob {
123 fn checkout_pr(pr_number: &WorkflowInput, token: &StepOutput) -> Step<Run> {
124 named::bash(r#"gh pr checkout "$PR_NUMBER""#)
125 .add_env(("PR_NUMBER", pr_number.to_string()))
126 .add_env(("GITHUB_TOKEN", token))
127 }
128
129 fn apply_patch() -> Step<Run> {
130 named::bash("git apply autofix.patch")
131 }
132
133 fn commit_and_push(token: &StepOutput) -> Step<Run> {
134 named::bash(indoc::indoc! {r#"
135 git commit -am "Autofix"
136 git push
137 "#})
138 .with_zippy_git_identity()
139 .add_env(("GITHUB_TOKEN", token))
140 }
141
142 let (authenticate, token) = steps::authenticate_as_zippy()
143 .for_repository(RepositoryTarget::current())
144 .with_permissions([
145 (TokenPermissions::Contents, Level::Write),
146 (TokenPermissions::Workflows, Level::Write),
147 ])
148 .into();
149
150 named::job(
151 Job::default()
152 .runs_on(runners::LINUX_SMALL)
153 .needs(vec![autofix_job.name.clone()])
154 .cond(Expression::new(format!(
155 "needs.{}.outputs.has_changes == 'true'",
156 autofix_job.name
157 )))
158 .add_step(authenticate)
159 .add_step(steps::checkout_repo().with_token(&token))
160 .add_step(checkout_pr(pr_number, &token))
161 .add_step(download_patch_artifact())
162 .add_step(apply_patch())
163 .add_step(commit_and_push(&token)),
164 )
165}
166