Skip to content

Commit c888eda

Browse files
authored
Merge pull request #265 from Sakib25800/add-mergeable-queue-loop
Implement mergeable queue loop
2 parents bac3582 + b4c28c3 commit c888eda

14 files changed

+694
-26
lines changed

.sqlx/query-2d6d97641c85f3ac05f952644ef031aa4a035fc7f74cf773309e8d2079d48aba.json

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

.sqlx/query-3cc3661fb1e1ff945e415f80637e7d7614ffac5358b73ff039220ffed15c4fce.json

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

src/bin/bors.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ use std::time::Duration;
66

77
use anyhow::Context;
88
use bors::{
9-
BorsContext, BorsGlobalEvent, CommandParser, PgDbClient, ServerState, TeamApiClient,
10-
WebhookSecret, create_app, create_bors_process, create_github_client, load_repositories,
9+
BorsContext, BorsGlobalEvent, BorsProcess, CommandParser, PgDbClient, ServerState,
10+
TeamApiClient, WebhookSecret, create_app, create_bors_process, create_github_client,
11+
load_repositories,
1112
};
1213
use clap::Parser;
1314
use sqlx::postgres::PgConnectOptions;
@@ -109,7 +110,12 @@ fn try_main(opts: Opts) -> anyhow::Result<()> {
109110
}
110111

111112
let ctx = BorsContext::new(CommandParser::new(opts.cmd_prefix), Arc::new(db), repos);
112-
let (repository_tx, global_tx, bors_process) = create_bors_process(ctx, client, team_api);
113+
let BorsProcess {
114+
repository_tx,
115+
global_tx,
116+
bors_process,
117+
..
118+
} = create_bors_process(ctx, client, team_api);
113119

114120
let refresh_tx = global_tx.clone();
115121
let refresh_process = async move {

src/bors/handlers/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ use tracing::Instrument;
3131
#[cfg(test)]
3232
use crate::tests::util::TestSyncMarker;
3333

34+
use super::mergeable_queue::MergeableQueueSender;
35+
3436
mod help;
3537
mod info;
3638
mod labels;
@@ -48,6 +50,7 @@ pub static WAIT_FOR_WORKFLOW_STARTED: TestSyncMarker = TestSyncMarker::new();
4850
pub async fn handle_bors_repository_event(
4951
event: BorsRepositoryEvent,
5052
ctx: Arc<BorsContext>,
53+
mergeable_queue_tx: MergeableQueueSender,
5154
) -> anyhow::Result<()> {
5255
let db = Arc::clone(&ctx.db);
5356
let Some(repo) = ctx
@@ -129,7 +132,7 @@ pub async fn handle_bors_repository_event(
129132
let span =
130133
tracing::info_span!("Pull request edited", repo = payload.repository.to_string());
131134

132-
handle_pull_request_edited(repo, db, payload)
135+
handle_pull_request_edited(repo, db, mergeable_queue_tx, payload)
133136
.instrument(span.clone())
134137
.await?;
135138
}
@@ -199,7 +202,7 @@ pub async fn handle_bors_repository_event(
199202
let span =
200203
tracing::info_span!("Pushed to branch", repo = payload.repository.to_string());
201204

202-
handle_push_to_branch(repo, db, payload)
205+
handle_push_to_branch(repo, db, mergeable_queue_tx, payload)
203206
.instrument(span.clone())
204207
.await?;
205208
}

src/bors/handlers/pr_events.rs

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::bors::event::{
55
PushToBranch,
66
};
77
use crate::bors::handlers::labels::handle_label_trigger;
8+
use crate::bors::mergeable_queue::MergeableQueueSender;
89
use crate::bors::{Comment, PullRequestStatus, RepositoryState};
910
use crate::database::MergeableState;
1011
use crate::github::{CommitSha, LabelTrigger, PullRequestNumber};
@@ -13,6 +14,7 @@ use std::sync::Arc;
1314
pub(super) async fn handle_pull_request_edited(
1415
repo_state: Arc<RepositoryState>,
1516
db: Arc<PgDbClient>,
17+
mergeable_queue: MergeableQueueSender,
1618
payload: PullRequestEdited,
1719
) -> anyhow::Result<()> {
1820
let pr = &payload.pull_request;
@@ -32,6 +34,8 @@ pub(super) async fn handle_pull_request_edited(
3234
return Ok(());
3335
};
3436

37+
mergeable_queue.enqueue(pr_model.repository.clone(), pr_number);
38+
3539
if !pr_model.is_approved() {
3640
return Ok(());
3741
}
@@ -154,6 +158,7 @@ pub(super) async fn handle_pull_request_ready_for_review(
154158
pub(super) async fn handle_push_to_branch(
155159
repo_state: Arc<RepositoryState>,
156160
db: Arc<PgDbClient>,
161+
mergeable_queue: MergeableQueueSender,
157162
payload: PushToBranch,
158163
) -> anyhow::Result<()> {
159164
let rows = db
@@ -163,8 +168,18 @@ pub(super) async fn handle_push_to_branch(
163168
MergeableState::Unknown,
164169
)
165170
.await?;
171+
let affected_prs = db
172+
.get_nonclosed_pull_requests_by_base_branch(repo_state.repository(), &payload.branch)
173+
.await?;
166174

167-
tracing::info!("Updated mergeable_state to `unknown` for {} PR(s)", rows);
175+
tracing::info!(
176+
"Adding {} PR(s) to the mergeable queue due to base branch change",
177+
rows
178+
);
179+
180+
for pr in affected_prs {
181+
mergeable_queue.enqueue(repo_state.repository().clone(), pr.number);
182+
}
168183

169184
Ok(())
170185
}
@@ -207,7 +222,7 @@ mod tests {
207222
use crate::bors::PullRequestStatus;
208223
use crate::tests::mocks::default_pr_number;
209224
use crate::{
210-
database::MergeableState,
225+
database::{MergeableState, OctocrabMergeableState},
211226
tests::mocks::{User, default_branch_name, default_repo_name, run_test},
212227
};
213228

@@ -344,7 +359,7 @@ mod tests {
344359
run_test(pool.clone(), |mut tester| async {
345360
tester
346361
.edit_pr(default_repo_name(), default_pr_number(), |pr| {
347-
pr.mergeable_state = octocrab::models::pulls::MergeableState::Dirty;
362+
pr.mergeable_state = OctocrabMergeableState::Dirty;
348363
})
349364
.await?;
350365
tester
@@ -425,6 +440,7 @@ mod tests {
425440
.await;
426441
}
427442

443+
#[tracing_test::traced_test]
428444
#[sqlx::test]
429445
async fn open_and_merge_pr(pool: sqlx::PgPool) {
430446
run_test(pool, |mut tester| async {
@@ -444,4 +460,51 @@ mod tests {
444460
})
445461
.await;
446462
}
463+
464+
#[sqlx::test]
465+
async fn mergeable_queue_processes_pr_base_change(pool: sqlx::PgPool) {
466+
run_test(pool, |mut tester| async {
467+
let branch = tester.create_branch("beta").clone();
468+
tester
469+
.edit_pr(default_repo_name(), default_pr_number(), |pr| {
470+
pr.base_branch = branch;
471+
pr.mergeable_state = OctocrabMergeableState::Unknown;
472+
})
473+
.await?;
474+
tester
475+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::Unknown)
476+
.await?;
477+
tester
478+
.default_repo()
479+
.lock()
480+
.get_pr_mut(default_pr_number())
481+
.mergeable_state = OctocrabMergeableState::Dirty;
482+
tester
483+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::HasConflicts)
484+
.await?;
485+
Ok(tester)
486+
})
487+
.await;
488+
}
489+
490+
#[sqlx::test]
491+
async fn enqueue_prs_on_push_to_branch(pool: sqlx::PgPool) {
492+
run_test(pool, |mut tester| async {
493+
tester.open_pr(default_repo_name(), false).await?;
494+
tester.push_to_branch(default_branch_name()).await?;
495+
tester
496+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::Unknown)
497+
.await?;
498+
tester
499+
.default_repo()
500+
.lock()
501+
.get_pr_mut(default_pr_number())
502+
.mergeable_state = OctocrabMergeableState::Dirty;
503+
tester
504+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::HasConflicts)
505+
.await?;
506+
Ok(tester)
507+
})
508+
.await;
509+
}
447510
}

0 commit comments

Comments
 (0)