Skip to content

Commit 1f250a5

Browse files
committed
Strip PR description in try merge messages
1 parent 1684926 commit 1f250a5

File tree

3 files changed

+112
-24
lines changed

3 files changed

+112
-24
lines changed

src/bors/handlers/trybuild.rs

Lines changed: 82 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::github::{CommitSha, GithubUser, LabelTrigger, MergeError, PullRequest
1919
use crate::permissions::PermissionType;
2020
use crate::utils::text::suppress_github_mentions;
2121
use anyhow::{Context, anyhow};
22+
use itertools::Itertools;
2223
use octocrab::params::checks::CheckRunConclusion;
2324
use octocrab::params::checks::CheckRunOutput;
2425
use octocrab::params::checks::CheckRunStatus;
@@ -87,7 +88,11 @@ pub(super) async fn command_try_build(
8788
&repo.client,
8889
&pr.github.head.sha,
8990
&base_sha,
90-
&auto_merge_commit_message(pr, repo.client.repository(), "<try>", jobs),
91+
&create_merge_commit_message(
92+
pr,
93+
repo.client.repository(),
94+
MergeType::Try { try_jobs: jobs },
95+
),
9196
)
9297
.await?
9398
{
@@ -339,28 +344,54 @@ fn get_pending_build(pr: &PullRequestModel) -> Option<&BuildModel> {
339344
.and_then(|b| (b.status == BuildStatus::Pending).then_some(b))
340345
}
341346

342-
fn auto_merge_commit_message(
347+
/// Prefix used to specify custom try jobs in PR descriptions.
348+
const CUSTOM_TRY_JOB_PREFIX: &str = "try-job:";
349+
350+
enum MergeType {
351+
Try { try_jobs: Vec<String> },
352+
}
353+
354+
fn create_merge_commit_message(
343355
pr: &PullRequestData,
344356
name: &GithubRepoName,
345-
reviewer: &str,
346-
jobs: Vec<String>,
357+
merge_type: MergeType,
347358
) -> String {
348359
let pr_number = pr.number();
360+
361+
let reviewer = match &merge_type {
362+
MergeType::Try { .. } => "<try>",
363+
};
364+
365+
let mut pr_description = suppress_github_mentions(&pr.github.message);
366+
match &merge_type {
367+
// Strip all PR text for try builds, to avoid useless issue pings on the repository.
368+
// Only keep any lines starting with `CUSTOM_TRY_JOB_PREFIX`.
369+
MergeType::Try { .. } => {
370+
pr_description = pr_description
371+
.lines()
372+
.map(|l| l.trim())
373+
.filter(|l| l.starts_with(CUSTOM_TRY_JOB_PREFIX))
374+
.join("\n");
375+
}
376+
};
377+
349378
let mut message = format!(
350379
r#"Auto merge of {repo_owner}/{repo_name}#{pr_number} - {pr_label}, r={reviewer}
351380
{pr_title}
352381
353-
{pr_message}"#,
382+
{pr_description}"#,
354383
pr_label = pr.github.head_label,
355384
pr_title = pr.github.title,
356-
pr_message = suppress_github_mentions(&pr.github.message),
357385
repo_owner = name.owner(),
358386
repo_name = name.name()
359387
);
360388

361-
// if jobs is empty, try-job won't be added to the message
362-
for job in jobs {
363-
message.push_str(&format!("\ntry-job: {}", job));
389+
match merge_type {
390+
MergeType::Try { try_jobs } => {
391+
for job in try_jobs {
392+
message.push_str(&format!("\n{CUSTOM_TRY_JOB_PREFIX} {}", job));
393+
}
394+
}
364395
}
365396
message
366397
}
@@ -470,15 +501,55 @@ mod tests {
470501
}
471502

472503
#[sqlx::test]
473-
async fn try_merge_commit_message(pool: sqlx::PgPool) {
504+
async fn try_commit_message_strip_description(pool: sqlx::PgPool) {
474505
run_test(pool, async |tester: &mut BorsTester| {
506+
tester
507+
.edit_pr(default_repo_name(), default_pr_number(), |pr| {
508+
pr.description = r"This is a very good PR.
509+
510+
It fixes so many issues, sir."
511+
.to_string();
512+
})
513+
.await?;
514+
475515
tester.post_comment("@bors try").await?;
476516
tester.expect_comments(1).await;
517+
518+
insta::assert_snapshot!(tester.get_branch_commit_message(&tester.try_branch()), @r"
519+
Auto merge of rust-lang/borstest#1 - pr-1, r=<try>
520+
PR #1
521+
");
522+
Ok(())
523+
})
524+
.await;
525+
}
526+
527+
#[sqlx::test]
528+
async fn try_commit_message_strip_description_keep_try_jobs(pool: sqlx::PgPool) {
529+
run_test(pool, async |tester: &mut BorsTester| {
530+
tester
531+
.edit_pr(default_repo_name(), default_pr_number(), |pr| {
532+
pr.description = r"This is a very good PR.
533+
534+
try-job: Foo
535+
536+
It fixes so many issues, sir.
537+
538+
try-job: Bar
539+
"
540+
.to_string();
541+
})
542+
.await?;
543+
544+
tester.post_comment("@bors try").await?;
545+
tester.expect_comments(1).await;
546+
477547
insta::assert_snapshot!(tester.get_branch_commit_message(&tester.try_branch()), @r"
478548
Auto merge of rust-lang/borstest#1 - pr-1, r=<try>
479549
PR #1
480550
481-
Description of PR #1
551+
try-job: Foo
552+
try-job: Bar
482553
");
483554
Ok(())
484555
})

src/tests/mocks/pull_request.rs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -199,28 +199,43 @@ pub struct GitHubPullRequest {
199199

200200
impl From<PullRequest> for GitHubPullRequest {
201201
fn from(pr: PullRequest) -> Self {
202-
let number = pr.number.0;
202+
let PullRequest {
203+
number,
204+
repo: _,
205+
added_labels: _,
206+
removed_labels: _,
207+
comment_counter: _,
208+
head_sha,
209+
author,
210+
base_branch,
211+
mergeable_state,
212+
status,
213+
merged_at,
214+
closed_at,
215+
assignees,
216+
description,
217+
} = pr;
203218
GitHubPullRequest {
204-
user: pr.author.clone().into(),
219+
user: author.clone().into(),
205220
url: "https://test.com".to_string(),
206-
id: number + 1000,
221+
id: number.0 + 1000,
207222
title: format!("PR #{number}"),
208-
body: format!("Description of PR #{number}"),
209-
mergeable_state: pr.mergeable_state,
210-
draft: pr.status == PullRequestStatus::Draft,
211-
number,
223+
body: description,
224+
mergeable_state,
225+
draft: status == PullRequestStatus::Draft,
226+
number: number.0,
212227
head: Box::new(GitHubHead {
213228
label: format!("pr-{number}"),
214229
ref_field: format!("pr-{number}"),
215-
sha: pr.head_sha,
230+
sha: head_sha,
216231
}),
217232
base: Box::new(GitHubBase {
218-
ref_field: pr.base_branch.get_name().to_string(),
219-
sha: pr.base_branch.get_sha().to_string(),
233+
ref_field: base_branch.get_name().to_string(),
234+
sha: base_branch.get_sha().to_string(),
220235
}),
221-
merged_at: pr.merged_at,
222-
closed_at: pr.closed_at,
223-
assignees: pr.assignees.into_iter().map(Into::into).collect(),
236+
merged_at,
237+
closed_at,
238+
assignees: assignees.into_iter().map(Into::into).collect(),
224239
}
225240
}
226241
}

src/tests/mocks/repository.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ pub struct PullRequest {
5454
pub merged_at: Option<DateTime<Utc>>,
5555
pub closed_at: Option<DateTime<Utc>>,
5656
pub assignees: Vec<User>,
57+
pub description: String,
5758
}
5859

5960
impl PullRequest {
@@ -76,6 +77,7 @@ impl PullRequest {
7677
merged_at: None,
7778
closed_at: None,
7879
assignees: Vec::new(),
80+
description: format!("Description of PR {number}"),
7981
}
8082
}
8183
}

0 commit comments

Comments
 (0)