Skip to content

Commit 3a4348b

Browse files
committed
Add to mergeable queue on PR open, reopen and push
1 parent b52bba7 commit 3a4348b

File tree

7 files changed

+109
-22
lines changed

7 files changed

+109
-22
lines changed

src/bors/handlers/info.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub(super) async fn command_info(
1212
) -> anyhow::Result<()> {
1313
// Geting PR info from database
1414
let pr_model = db
15-
.get_or_create_pull_request(
15+
.upsert_pull_request(
1616
repo.client.repository(),
1717
pr.number,
1818
&pr.base.name,

src/bors/handlers/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,15 @@ pub async fn handle_bors_repository_event(
140140
let span =
141141
tracing::info_span!("Pull request pushed", repo = payload.repository.to_string());
142142

143-
handle_push_to_pull_request(repo, db, payload)
143+
handle_push_to_pull_request(repo, db, mergeable_queue_tx, payload)
144144
.instrument(span.clone())
145145
.await?;
146146
}
147147
BorsRepositoryEvent::PullRequestOpened(payload) => {
148148
let span =
149149
tracing::info_span!("Pull request opened", repo = payload.repository.to_string());
150150

151-
handle_pull_request_opened(repo, db, payload)
151+
handle_pull_request_opened(repo, db, mergeable_queue_tx, payload)
152152
.instrument(span.clone())
153153
.await?;
154154
}
@@ -174,7 +174,7 @@ pub async fn handle_bors_repository_event(
174174
repo = payload.repository.to_string()
175175
);
176176

177-
handle_pull_request_reopened(repo, db, payload)
177+
handle_pull_request_reopened(repo, db, mergeable_queue_tx, payload)
178178
.instrument(span.clone())
179179
.await?;
180180
}
@@ -501,7 +501,7 @@ async fn has_permission(
501501
}
502502

503503
let pr_model = db
504-
.get_or_create_pull_request(
504+
.upsert_pull_request(
505505
repo_state.repository(),
506506
pr.number,
507507
&pr.base.name,

src/bors/handlers/pr_events.rs

+93-7
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub(super) async fn handle_pull_request_edited(
2020
let pr = &payload.pull_request;
2121
let pr_number = pr.number;
2222
let pr_model = db
23-
.get_or_create_pull_request(
23+
.upsert_pull_request(
2424
repo_state.repository(),
2525
pr_number,
2626
&pr.base.name,
@@ -48,12 +48,13 @@ pub(super) async fn handle_pull_request_edited(
4848
pub(super) async fn handle_push_to_pull_request(
4949
repo_state: Arc<RepositoryState>,
5050
db: Arc<PgDbClient>,
51+
mergeable_queue: MergeableQueueSender,
5152
payload: PullRequestPushed,
5253
) -> anyhow::Result<()> {
5354
let pr = &payload.pull_request;
5455
let pr_number = pr.number;
5556
let pr_model = db
56-
.get_or_create_pull_request(
57+
.upsert_pull_request(
5758
repo_state.repository(),
5859
pr_number,
5960
&pr.base.name,
@@ -62,6 +63,8 @@ pub(super) async fn handle_push_to_pull_request(
6263
)
6364
.await?;
6465

66+
mergeable_queue.enqueue(repo_state.repository().clone(), pr_number);
67+
6568
if !pr_model.is_approved() {
6669
return Ok(());
6770
}
@@ -74,6 +77,7 @@ pub(super) async fn handle_push_to_pull_request(
7477
pub(super) async fn handle_pull_request_opened(
7578
repo_state: Arc<RepositoryState>,
7679
db: Arc<PgDbClient>,
80+
mergeable_queue: MergeableQueueSender,
7781
payload: PullRequestOpened,
7882
) -> anyhow::Result<()> {
7983
let pr_status = if payload.draft {
@@ -87,7 +91,11 @@ pub(super) async fn handle_pull_request_opened(
8791
&payload.pull_request.base.name,
8892
pr_status,
8993
)
90-
.await
94+
.await?;
95+
96+
mergeable_queue.enqueue(repo_state.repository().clone(), payload.pull_request.number);
97+
98+
Ok(())
9199
}
92100

93101
pub(super) async fn handle_pull_request_closed(
@@ -119,14 +127,23 @@ pub(super) async fn handle_pull_request_merged(
119127
pub(super) async fn handle_pull_request_reopened(
120128
repo_state: Arc<RepositoryState>,
121129
db: Arc<PgDbClient>,
130+
mergeable_queue: MergeableQueueSender,
122131
payload: PullRequestReopened,
123132
) -> anyhow::Result<()> {
124-
db.set_pr_status(
133+
let pr = &payload.pull_request;
134+
let pr_number = pr.number;
135+
db.upsert_pull_request(
125136
repo_state.repository(),
126-
payload.pull_request.number,
127-
PullRequestStatus::Open,
137+
pr_number,
138+
&pr.base.name,
139+
pr.mergeable_state.clone().into(),
140+
&pr.status,
128141
)
129-
.await
142+
.await?;
143+
144+
mergeable_queue.enqueue(repo_state.repository().clone(), pr_number);
145+
146+
Ok(())
130147
}
131148

132149
pub(super) async fn handle_pull_request_converted_to_draft(
@@ -507,4 +524,73 @@ mod tests {
507524
})
508525
.await;
509526
}
527+
528+
#[sqlx::test]
529+
async fn enqueue_prs_on_pr_opened(pool: sqlx::PgPool) {
530+
run_test(pool, |mut tester| async {
531+
tester.open_pr(default_repo_name(), false).await?;
532+
tester
533+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::Unknown)
534+
.await?;
535+
tester
536+
.default_repo()
537+
.lock()
538+
.get_pr_mut(default_pr_number())
539+
.mergeable_state = OctocrabMergeableState::Dirty;
540+
tester
541+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::HasConflicts)
542+
.await?;
543+
Ok(tester)
544+
})
545+
.await;
546+
}
547+
548+
#[sqlx::test]
549+
async fn enqueue_prs_on_pr_reopened(pool: sqlx::PgPool) {
550+
run_test(pool, |mut tester| async {
551+
tester
552+
.default_repo()
553+
.lock()
554+
.get_pr_mut(default_pr_number())
555+
.mergeable_state = OctocrabMergeableState::Unknown;
556+
tester
557+
.reopen_pr(default_repo_name(), default_pr_number())
558+
.await?;
559+
tester
560+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::Unknown)
561+
.await?;
562+
tester
563+
.default_repo()
564+
.lock()
565+
.get_pr_mut(default_pr_number())
566+
.mergeable_state = OctocrabMergeableState::Dirty;
567+
tester
568+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::HasConflicts)
569+
.await?;
570+
Ok(tester)
571+
})
572+
.await;
573+
}
574+
575+
#[sqlx::test]
576+
async fn enqueue_prs_on_push_to_pr(pool: sqlx::PgPool) {
577+
run_test(pool, |mut tester| async {
578+
tester
579+
.push_to_pr(default_repo_name(), default_pr_number())
580+
.await?;
581+
tester
582+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::Unknown)
583+
.await?;
584+
tester
585+
.default_repo()
586+
.lock()
587+
.get_pr_mut(default_pr_number())
588+
.mergeable_state = OctocrabMergeableState::Dirty;
589+
tester
590+
.wait_for_default_pr(|pr| pr.mergeable_state == MergeableState::HasConflicts)
591+
.await?;
592+
Ok(tester)
593+
})
594+
.await;
595+
}
510596
}

src/bors/handlers/review.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub(super) async fn command_approve(
4141
sha: pr.head.sha.to_string(),
4242
};
4343
let pr_model = db
44-
.get_or_create_pull_request(
44+
.upsert_pull_request(
4545
repo_state.repository(),
4646
pr.number,
4747
&pr.base.name,
@@ -70,7 +70,7 @@ pub(super) async fn command_unapprove(
7070
return Ok(());
7171
};
7272
let pr_model = db
73-
.get_or_create_pull_request(
73+
.upsert_pull_request(
7474
repo_state.repository(),
7575
pr.number,
7676
&pr.base.name,
@@ -98,7 +98,7 @@ pub(super) async fn command_set_priority(
9898
return Ok(());
9999
};
100100
let pr_model = db
101-
.get_or_create_pull_request(
101+
.upsert_pull_request(
102102
repo_state.repository(),
103103
pr.number,
104104
&pr.base.name,
@@ -129,7 +129,7 @@ pub(super) async fn command_delegate(
129129
}
130130

131131
let pr_model = db
132-
.get_or_create_pull_request(
132+
.upsert_pull_request(
133133
repo_state.repository(),
134134
pr.number,
135135
&pr.base.name,
@@ -155,7 +155,7 @@ pub(super) async fn command_undelegate(
155155
return Ok(());
156156
}
157157
let pr_model = db
158-
.get_or_create_pull_request(
158+
.upsert_pull_request(
159159
repo_state.repository(),
160160
pr.number,
161161
&pr.base.name,
@@ -181,7 +181,7 @@ pub(super) async fn command_set_rollup(
181181
return Ok(());
182182
}
183183
let pr_model = db
184-
.get_or_create_pull_request(
184+
.upsert_pull_request(
185185
repo_state.repository(),
186186
pr.number,
187187
&pr.base.name,

src/bors/handlers/trybuild.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub(super) async fn command_try_build(
5656
// Create pr model based on CI repo, so we can retrieve the pr later when
5757
// the CI repo emits events
5858
let pr_model = db
59-
.get_or_create_pull_request(
59+
.upsert_pull_request(
6060
repo.client.repository(),
6161
pr.number,
6262
&pr.base.name,
@@ -208,7 +208,7 @@ pub(super) async fn command_try_cancel(
208208

209209
let pr_number: PullRequestNumber = pr.number;
210210
let pr = db
211-
.get_or_create_pull_request(
211+
.upsert_pull_request(
212212
repo.client.repository(),
213213
pr_number,
214214
&pr.base.name,

src/database/client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ impl PgDbClient {
9393
get_pull_request(&self.pool, repo, pr_number).await
9494
}
9595

96-
pub async fn get_or_create_pull_request(
96+
pub async fn upsert_pull_request(
9797
&self,
9898
repo: &GithubRepoName,
9999
pr_number: PullRequestNumber,

src/tests/mocks/bors.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use tower::Service;
1414

1515
use crate::bors::mergeable_queue::MergeableQueueSender;
1616
use crate::bors::{RollupMode, WAIT_FOR_REFRESH};
17-
use crate::database::{BuildStatus, DelegatedPermission, PullRequestModel};
17+
use crate::database::{BuildStatus, DelegatedPermission, OctocrabMergeableState, PullRequestModel};
1818
use crate::github::api::load_repositories;
1919
use crate::github::server::BorsProcess;
2020
use crate::github::{GithubRepoName, PullRequestNumber};
@@ -510,6 +510,7 @@ impl BorsTester {
510510
.get_mut(&pr_number)
511511
.expect("PR must be initialized before pushing to it");
512512
pr.head_sha = format!("pr-{pr_number}-commit-{counter}");
513+
pr.mergeable_state = OctocrabMergeableState::Unknown;
513514
pr.clone()
514515
};
515516

0 commit comments

Comments
 (0)