diff --git a/src/bors/handlers/mod.rs b/src/bors/handlers/mod.rs index 3ac68178..8f8dbc4a 100644 --- a/src/bors/handlers/mod.rs +++ b/src/bors/handlers/mod.rs @@ -148,9 +148,16 @@ pub async fn handle_bors_repository_event( let span = tracing::info_span!("Pull request opened", repo = payload.repository.to_string()); - handle_pull_request_opened(repo, db, mergeability_queue_tx, payload) - .instrument(span.clone()) - .await?; + handle_pull_request_opened( + repo, + db, + ctx, + mergeability_queue_tx, + merge_queue_tx, + payload, + ) + .instrument(span.clone()) + .await?; } BorsRepositoryEvent::PullRequestClosed(payload) => { let span = diff --git a/src/bors/handlers/pr_events.rs b/src/bors/handlers/pr_events.rs index fe7e7f07..83eaec94 100644 --- a/src/bors/handlers/pr_events.rs +++ b/src/bors/handlers/pr_events.rs @@ -1,11 +1,15 @@ use crate::PgDbClient; use crate::bors::event::{ - PullRequestAssigned, PullRequestClosed, PullRequestConvertedToDraft, PullRequestEdited, - PullRequestMerged, PullRequestOpened, PullRequestPushed, PullRequestReadyForReview, - PullRequestReopened, PullRequestUnassigned, PushToBranch, + PullRequestAssigned, PullRequestClosed, PullRequestComment, PullRequestConvertedToDraft, + PullRequestEdited, PullRequestMerged, PullRequestOpened, PullRequestPushed, + PullRequestReadyForReview, PullRequestReopened, PullRequestUnassigned, PushToBranch, }; + +use crate::bors::BorsContext; +use crate::bors::handlers::handle_comment; use crate::bors::handlers::unapprove_pr; use crate::bors::handlers::workflow::{AutoBuildCancelReason, maybe_cancel_auto_build}; +use crate::bors::merge_queue::MergeQueueSender; use crate::bors::mergeability_queue::MergeabilityQueueSender; use crate::bors::{Comment, PullRequestStatus, RepositoryState}; use crate::database::MergeableState; @@ -90,7 +94,9 @@ pub(super) async fn handle_push_to_pull_request( pub(super) async fn handle_pull_request_opened( repo_state: Arc, db: Arc, + ctx: Arc, mergeability_queue: MergeabilityQueueSender, + merge_queue_tx: MergeQueueSender, payload: PullRequestOpened, ) -> anyhow::Result<()> { let pr_status = if payload.draft { @@ -101,8 +107,8 @@ pub(super) async fn handle_pull_request_opened( let assignees: Vec = payload .pull_request .assignees - .into_iter() - .map(|user| user.username) + .iter() + .map(|user| user.username.clone()) .collect(); db.create_pull_request( repo_state.repository(), @@ -115,6 +121,8 @@ pub(super) async fn handle_pull_request_opened( ) .await?; + process_pr_description_commands(&payload, repo_state.clone(), db, ctx, merge_queue_tx).await?; + mergeability_queue.enqueue_pr(repo_state.repository().clone(), payload.pull_request.number); Ok(()) @@ -256,6 +264,30 @@ pub(super) async fn handle_push_to_branch( Ok(()) } +async fn process_pr_description_commands( + payload: &PullRequestOpened, + repo: Arc, + database: Arc, + ctx: Arc, + merge_queue_tx: MergeQueueSender, +) -> anyhow::Result<()> { + let pr_description_comment = create_pr_description_comment(payload); + handle_comment(repo, database, ctx, pr_description_comment, merge_queue_tx).await +} + +fn create_pr_description_comment(payload: &PullRequestOpened) -> PullRequestComment { + PullRequestComment { + repository: payload.repository.clone(), + author: payload.pull_request.author.clone(), + pr_number: payload.pull_request.number, + text: payload.pull_request.message.clone(), + html_url: format!( + "https://github.com/{}/pull/{}", + payload.repository, payload.pull_request.number + ), + } +} + async fn notify_of_edited_pr( repo: &RepositoryState, pr_number: PullRequestNumber, @@ -743,4 +775,20 @@ mod tests { }) .await; } + + #[sqlx::test] + async fn process_bors_commands_in_pr_description(pool: sqlx::PgPool) { + run_test(pool, async |tester: &mut BorsTester| { + let pr = tester + .open_pr(default_repo_name(), |pr| { + pr.description = "@bors p=2".to_string(); + }) + .await?; + tester + .wait_for_pr(pr.number, |pr| pr.priority == Some(2)) + .await?; + Ok(()) + }) + .await; + } }