Skip to content

Commit bf1e6d4

Browse files
committed
Find unknown mergeable PRs on periodic refresh
1 parent 8b18d23 commit bf1e6d4

7 files changed

+212
-16
lines changed

.sqlx/query-1e5d97de9e3b8c34ac2cfa4c00a6dd191dc70a3db77def03371d8bdfde2ae5e6.json renamed to .sqlx/query-81feaa8d94edd26607d6415207f549cf5a104f426f71e3394ef0713d25020da6.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-8b97d98a060fcd7bb38cf072b33432ed024bc81b5af28e24202ddd23b3a03eaa.json

Lines changed: 124 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-9e8a84ab79912f65d2e2db8060bd5a0f2b98c91675d42fa0c767c13f9338b4ff.json renamed to .sqlx/query-94cb702b5a80ade4531a82ea6134b44e2d5d0cce600a11ceb9c55dfd5a8a59c4.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-b442044623f3fddd437ef8aa5750d0cb222493180c665e1d6223438a653939ef.json renamed to .sqlx/query-cc82e2bba5c969aea08dd95d381b3f711e70c2e182383d637c29edb4f5e122e9.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/bors/handlers/refresh.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ pub async fn refresh_repository(
1616
team_api_client: &TeamApiClient,
1717
) -> anyhow::Result<()> {
1818
let repo = repo.as_ref();
19-
if let (Ok(_), _, Ok(_)) = tokio::join!(
19+
if let (Ok(_), _, Ok(_), Ok(_)) = tokio::join!(
2020
cancel_timed_out_builds(repo, db.as_ref()),
2121
reload_permission(repo, team_api_client),
22-
reload_config(repo)
22+
reload_config(repo),
23+
reload_unknown_mergeable_prs(repo, db.as_ref())
2324
) {
2425
Ok(())
2526
} else {
@@ -79,6 +80,31 @@ async fn reload_permission(
7980
Ok(())
8081
}
8182

83+
async fn reload_unknown_mergeable_prs(
84+
repo: &RepositoryState,
85+
db: &PgDbClient,
86+
) -> anyhow::Result<()> {
87+
let prs = db
88+
.get_prs_with_unknown_mergeable_state(repo.repository())
89+
.await?;
90+
91+
tracing::info!(
92+
"Refreshing {} PR(s) with unknown mergeable state",
93+
prs.len()
94+
);
95+
96+
if prs.is_empty() {
97+
return Ok(());
98+
}
99+
100+
for pr in prs {
101+
tracing::info!("PR #{} has unknown mergeable state", pr.number);
102+
// Add to 'queue'
103+
}
104+
105+
Ok(())
106+
}
107+
82108
async fn reload_config(repo: &RepositoryState) -> anyhow::Result<()> {
83109
let config = repo.client.load_config().await?;
84110
repo.config.store(Arc::new(config));

src/database/client.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ use crate::github::{CommitSha, GithubRepoName};
1010

1111
use super::operations::{
1212
approve_pull_request, create_build, create_pull_request, create_workflow,
13-
delegate_pull_request, find_build, find_pr_by_build, get_pull_request, get_repository,
14-
get_running_builds, get_workflow_urls_for_build, get_workflows_for_build, set_pr_priority,
15-
set_pr_rollup, set_pr_status, unapprove_pull_request, undelegate_pull_request,
16-
update_build_status, update_mergeable_states_by_base_branch, update_pr_build_id,
17-
update_workflow_status, upsert_pull_request, upsert_repository,
13+
delegate_pull_request, find_build, find_pr_by_build, get_prs_with_unknown_mergeable_state,
14+
get_pull_request, get_repository, get_running_builds, get_workflow_urls_for_build,
15+
get_workflows_for_build, set_pr_priority, set_pr_rollup, set_pr_status, unapprove_pull_request,
16+
undelegate_pull_request, update_build_status, update_mergeable_states_by_base_branch,
17+
update_pr_build_id, update_workflow_status, upsert_pull_request, upsert_repository,
1818
};
1919
use super::{ApprovalInfo, MergeableState, RunId};
2020

@@ -64,6 +64,13 @@ impl PgDbClient {
6464
update_mergeable_states_by_base_branch(&self.pool, repo, base_branch, mergeable_state).await
6565
}
6666

67+
pub async fn get_prs_with_unknown_mergeable_state(
68+
&self,
69+
repo: &GithubRepoName,
70+
) -> anyhow::Result<Vec<PullRequestModel>> {
71+
get_prs_with_unknown_mergeable_state(&self.pool, repo).await
72+
}
73+
6774
pub async fn set_rollup(
6875
&self,
6976
pr: &PullRequestModel,

src/database/operations.rs

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub(crate) async fn get_pull_request(
3939
pr.approved_by,
4040
pr.approved_sha
4141
) AS "approval_status!: ApprovalStatus",
42-
pr.status as "pr_status: PullRequestStatus",
42+
pr.status as "pr_status: PullRequestStatus",
4343
pr.priority,
4444
pr.rollup as "rollup: RollupMode",
4545
pr.delegated,
@@ -137,7 +137,7 @@ pub(crate) async fn upsert_pull_request(
137137
pr.approved_by,
138138
pr.approved_sha
139139
) AS "approval_status!: ApprovalStatus",
140-
pr.status as "pr_status: PullRequestStatus",
140+
pr.status as "pr_status: PullRequestStatus",
141141
pr.priority,
142142
pr.rollup as "rollup: RollupMode",
143143
pr.delegated,
@@ -189,6 +189,45 @@ pub(crate) async fn update_mergeable_states_by_base_branch(
189189
.await
190190
}
191191

192+
pub(crate) async fn get_prs_with_unknown_mergeable_state(
193+
executor: impl PgExecutor<'_>,
194+
repo: &GithubRepoName,
195+
) -> anyhow::Result<Vec<PullRequestModel>> {
196+
measure_db_query("get_prs_with_unknown_mergeable_state", || async {
197+
let prs = sqlx::query_as!(
198+
PullRequestModel,
199+
r#"
200+
SELECT
201+
pr.id,
202+
pr.repository as "repository: GithubRepoName",
203+
pr.number as "number!: i64",
204+
(
205+
pr.approved_by,
206+
pr.approved_sha
207+
) AS "approval_status!: ApprovalStatus",
208+
pr.status as "pr_status: PullRequestStatus",
209+
pr.priority,
210+
pr.rollup as "rollup: RollupMode",
211+
pr.delegated,
212+
pr.base_branch,
213+
pr.mergeable_state as "mergeable_state: MergeableState",
214+
pr.created_at as "created_at: DateTime<Utc>",
215+
build AS "try_build: BuildModel"
216+
FROM pull_request as pr
217+
LEFT JOIN build ON pr.build_id = build.id
218+
WHERE pr.repository = $1
219+
AND pr.mergeable_state = 'unknown'
220+
AND pr.status = 'open'
221+
"#,
222+
repo as &GithubRepoName,
223+
)
224+
.fetch_all(executor)
225+
.await?;
226+
Ok(prs)
227+
})
228+
.await
229+
}
230+
192231
pub(crate) async fn approve_pull_request(
193232
executor: impl PgExecutor<'_>,
194233
pr_id: i32,
@@ -285,7 +324,7 @@ SELECT
285324
pr.approved_by,
286325
pr.approved_sha
287326
) AS "approval_status!: ApprovalStatus",
288-
pr.status as "pr_status: PullRequestStatus",
327+
pr.status as "pr_status: PullRequestStatus",
289328
pr.delegated,
290329
pr.priority,
291330
pr.base_branch,

0 commit comments

Comments
 (0)