@@ -5,6 +5,7 @@ use crate::bors::event::{
5
5
PushToBranch ,
6
6
} ;
7
7
use crate :: bors:: handlers:: labels:: handle_label_trigger;
8
+ use crate :: bors:: mergeable_queue:: MergeableQueueSender ;
8
9
use crate :: bors:: { Comment , PullRequestStatus , RepositoryState } ;
9
10
use crate :: database:: MergeableState ;
10
11
use crate :: github:: { CommitSha , LabelTrigger , PullRequestNumber } ;
@@ -13,6 +14,7 @@ use std::sync::Arc;
13
14
pub ( super ) async fn handle_pull_request_edited (
14
15
repo_state : Arc < RepositoryState > ,
15
16
db : Arc < PgDbClient > ,
17
+ mergeable_queue : MergeableQueueSender ,
16
18
payload : PullRequestEdited ,
17
19
) -> anyhow:: Result < ( ) > {
18
20
let pr = & payload. pull_request ;
@@ -32,6 +34,8 @@ pub(super) async fn handle_pull_request_edited(
32
34
return Ok ( ( ) ) ;
33
35
} ;
34
36
37
+ mergeable_queue. enqueue ( pr_model. repository . clone ( ) , pr_number) ;
38
+
35
39
if !pr_model. is_approved ( ) {
36
40
return Ok ( ( ) ) ;
37
41
}
@@ -154,6 +158,7 @@ pub(super) async fn handle_pull_request_ready_for_review(
154
158
pub ( super ) async fn handle_push_to_branch (
155
159
repo_state : Arc < RepositoryState > ,
156
160
db : Arc < PgDbClient > ,
161
+ mergeable_queue : MergeableQueueSender ,
157
162
payload : PushToBranch ,
158
163
) -> anyhow:: Result < ( ) > {
159
164
let rows = db
@@ -163,8 +168,18 @@ pub(super) async fn handle_push_to_branch(
163
168
MergeableState :: Unknown ,
164
169
)
165
170
. await ?;
171
+ let affected_prs = db
172
+ . get_nonclosed_pull_requests_by_base_branch ( repo_state. repository ( ) , & payload. branch )
173
+ . await ?;
166
174
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
+ }
168
183
169
184
Ok ( ( ) )
170
185
}
@@ -207,7 +222,7 @@ mod tests {
207
222
use crate :: bors:: PullRequestStatus ;
208
223
use crate :: tests:: mocks:: default_pr_number;
209
224
use crate :: {
210
- database:: MergeableState ,
225
+ database:: { MergeableState , OctocrabMergeableState } ,
211
226
tests:: mocks:: { User , default_branch_name, default_repo_name, run_test} ,
212
227
} ;
213
228
@@ -344,7 +359,7 @@ mod tests {
344
359
run_test ( pool. clone ( ) , |mut tester| async {
345
360
tester
346
361
. edit_pr ( default_repo_name ( ) , default_pr_number ( ) , |pr| {
347
- pr. mergeable_state = octocrab :: models :: pulls :: MergeableState :: Dirty ;
362
+ pr. mergeable_state = OctocrabMergeableState :: Dirty ;
348
363
} )
349
364
. await ?;
350
365
tester
@@ -425,6 +440,7 @@ mod tests {
425
440
. await ;
426
441
}
427
442
443
+ #[ tracing_test:: traced_test]
428
444
#[ sqlx:: test]
429
445
async fn open_and_merge_pr ( pool : sqlx:: PgPool ) {
430
446
run_test ( pool, |mut tester| async {
@@ -444,4 +460,51 @@ mod tests {
444
460
} )
445
461
. await ;
446
462
}
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
+ }
447
510
}
0 commit comments