Skip to content

Commit a6f30b0

Browse files
committed
Update merge_state on PR edit
1 parent 8dbe26b commit a6f30b0

File tree

9 files changed

+97
-15
lines changed

9 files changed

+97
-15
lines changed

.DS_Store

8 KB
Binary file not shown.

.sqlx/query-b8f88dd4e3e11019323d87b504e9dce620c26450ef53642339a86b1adf70d0c3.json

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

src/.DS_Store

6 KB
Binary file not shown.

src/bors/.DS_Store

6 KB
Binary file not shown.

src/bors/handlers/pr_events.rs

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,17 @@ pub(super) async fn handle_pull_request_edited(
1212
) -> anyhow::Result<()> {
1313
let pr = &payload.pull_request;
1414
let pr_number = pr.number;
15+
let pr_model = db
16+
.get_or_create_pull_request(repo_state.repository(), pr_number, &pr.base.name)
17+
.await?;
18+
db.update_pr_merge_state(&pr_model, pr.mergeable_state.clone().into())
19+
.await?;
1520

1621
// If the base branch has changed, unapprove the PR
1722
let Some(_) = payload.from_base_sha else {
1823
return Ok(());
1924
};
2025

21-
let pr_model = db
22-
.get_or_create_pull_request(repo_state.repository(), pr_number, &pr.base.name)
23-
.await?;
2426
db.update_pr_base_branch(&pr_model, &pr.base.name).await?;
2527
if !pr_model.is_approved() {
2628
return Ok(());
@@ -99,10 +101,13 @@ PR will need to be re-approved."#,
99101

100102
#[cfg(test)]
101103
mod tests {
102-
use crate::tests::mocks::{
103-
assert_pr_approved_by, assert_pr_unapproved, create_world_with_approve_config,
104-
default_branch_name, default_branch_sha, default_pr_number, run_test, BorsBuilder,
105-
GitHubPullRequest, PullRequestChangeEvent, User,
104+
use crate::{
105+
database::MergeState,
106+
tests::mocks::{
107+
assert_pr_approved_by, assert_pr_unapproved, create_world_with_approve_config,
108+
default_branch_name, default_branch_sha, default_pr_number, run_test, BorsBuilder,
109+
GitHubPullRequest, PullRequestChangeEvent, User,
110+
},
106111
};
107112

108113
#[sqlx::test]
@@ -299,4 +304,29 @@ PR will need to be re-approved."#,
299304
})
300305
.await;
301306
}
307+
308+
#[sqlx::test]
309+
async fn update_mergeable_state_on_pr_edited(pool: sqlx::PgPool) {
310+
run_test(pool, |mut tester| async {
311+
tester
312+
.edit_pull_request_with_pr(
313+
default_pr_number(),
314+
PullRequestChangeEvent {
315+
from_base_sha: None,
316+
from_base_ref: None,
317+
},
318+
GitHubPullRequest::new(default_pr_number())
319+
.with_mergeable_state(octocrab::models::pulls::MergeableState::HasHooks),
320+
)
321+
.await?;
322+
tester
323+
.wait_for(|| async {
324+
let pr = tester.get_default_pr().await?;
325+
Ok(pr.merge_state == MergeState::Mergeable)
326+
})
327+
.await?;
328+
Ok(tester)
329+
})
330+
.await;
331+
}
302332
}

src/database/client.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ use super::operations::{
1313
delegate_pull_request, find_build, find_pr_by_build, get_pull_request, get_repository,
1414
get_running_builds, get_workflow_urls_for_build, get_workflows_for_build, set_pr_priority,
1515
set_pr_rollup, unapprove_pull_request, undelegate_pull_request, update_build_status,
16-
update_pr_base_branch, update_pr_build_id, update_workflow_status, upsert_repository,
16+
update_pr_base_branch, update_pr_build_id, update_pr_merge_state, update_workflow_status,
17+
upsert_repository,
1718
};
18-
use super::{ApprovalInfo, RunId};
19+
use super::{ApprovalInfo, MergeState, RunId};
1920

2021
/// Provides access to a database using sqlx operations.
2122
#[derive(Clone)]
@@ -54,6 +55,14 @@ impl PgDbClient {
5455
undelegate_pull_request(&self.pool, pr.id).await
5556
}
5657

58+
pub async fn update_pr_merge_state(
59+
&self,
60+
pr: &PullRequestModel,
61+
merge_state: MergeState,
62+
) -> anyhow::Result<()> {
63+
update_pr_merge_state(&self.pool, &pr.repository, pr.id, merge_state).await
64+
}
65+
5766
pub async fn update_pr_base_branch(
5867
&self,
5968
pr: &PullRequestModel,

src/database/operations.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,24 @@ pub(crate) async fn update_pr_base_branch(
8787
"UPDATE pull_request SET base_branch = $1 WHERE id = $2 AND repository = $3",
8888
base_branch,
8989
pr_id,
90-
repo.to_string()
90+
repo as &GithubRepoName
91+
)
92+
.execute(executor)
93+
.await?;
94+
Ok(())
95+
}
96+
97+
pub(crate) async fn update_pr_merge_state(
98+
executor: impl PgExecutor<'_>,
99+
repo: &GithubRepoName,
100+
pr_id: i32,
101+
merge_state: MergeState,
102+
) -> anyhow::Result<()> {
103+
sqlx::query!(
104+
"UPDATE pull_request SET merge_state = $1 WHERE id = $2 AND repository = $3",
105+
merge_state as _,
106+
pr_id,
107+
repo as &GithubRepoName
91108
)
92109
.execute(executor)
93110
.await?;

src/github/webhook.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ mod tests {
514514
async fn pull_request_edited() {
515515
insta::assert_debug_snapshot!(
516516
check_webhook("webhook/pull-request-edited.json", "pull_request").await,
517-
@r###"
517+
@r#"
518518
Ok(
519519
GitHubWebhook(
520520
Repository(
@@ -542,6 +542,7 @@ mod tests {
542542
),
543543
},
544544
title: "Create test.txt",
545+
mergeable_state: Unknown,
545546
message: "",
546547
author: GithubUser {
547548
id: UserId(
@@ -575,15 +576,15 @@ mod tests {
575576
),
576577
),
577578
)
578-
"###
579+
"#
579580
);
580581
}
581582

582583
#[tokio::test]
583584
async fn pull_request_synchronized() {
584585
insta::assert_debug_snapshot!(
585586
check_webhook("webhook/pull-request-synchronize.json", "pull_request").await,
586-
@r###"
587+
@r#"
587588
Ok(
588589
GitHubWebhook(
589590
Repository(
@@ -611,6 +612,7 @@ mod tests {
611612
),
612613
},
613614
title: "Create test.txt",
615+
mergeable_state: Unknown,
614616
message: "",
615617
author: GithubUser {
616618
id: UserId(
@@ -639,7 +641,7 @@ mod tests {
639641
),
640642
),
641643
)
642-
"###
644+
"#
643645
);
644646
}
645647

@@ -724,6 +726,7 @@ mod tests {
724726
),
725727
},
726728
title: "New added branch",
729+
mergeable_state: Unknown,
727730
message: "This is a newly added branch from a just-opened PR. ",
728731
author: GithubUser {
729732
id: UserId(

src/tests/mocks/pull_request.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::github::GithubRepoName;
2-
use octocrab::models::LabelId;
2+
use octocrab::models::{pulls::MergeableState, LabelId};
33
use parking_lot::Mutex;
44
use serde::{Deserialize, Serialize};
55
use std::sync::Arc;
@@ -159,6 +159,7 @@ pub struct GitHubPullRequest {
159159
id: u64,
160160
title: String,
161161
body: String,
162+
mergeable_state: MergeableState,
162163

163164
/// The pull request number. Note that GitHub's REST API
164165
/// considers every pull-request an issue with the same number.
@@ -178,6 +179,7 @@ impl GitHubPullRequest {
178179
id: number + 1000,
179180
title: format!("PR #{number}"),
180181
body: format!("Description of PR #{number}"),
182+
mergeable_state: MergeableState::Unknown,
181183
number,
182184
head: Box::new(GitHubHead {
183185
label: format!("pr-{number}"),
@@ -195,6 +197,11 @@ impl GitHubPullRequest {
195197
self.base = Box::new(GitHubBase { ref_field, sha });
196198
self
197199
}
200+
201+
pub fn with_mergeable_state(mut self, state: MergeableState) -> Self {
202+
self.mergeable_state = state;
203+
self
204+
}
198205
}
199206

200207
impl Default for GitHubPullRequest {

0 commit comments

Comments
 (0)