From aaf2652890697b34d73c14438925cdd360668000 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 13 Jun 2023 20:10:26 -0600 Subject: [PATCH] add more config options for no_merges - option for excluding PRs with certain labels - option for adding a label when merge commits are detected - option for setting a custom comment message --- src/config.rs | 11 +++++++- src/handlers/no_merges.rs | 53 ++++++++++++++++++++++++++++----------- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/config.rs b/src/config.rs index 3bfcc64e..31895d2d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -94,8 +94,17 @@ pub(crate) struct AssignConfig { #[derive(PartialEq, Eq, Debug, serde::Deserialize)] pub(crate) struct NoMergesConfig { + /// No action will be taken on PRs with these labels. #[serde(default)] - _empty: (), + pub(crate) exclude_labels: Vec, + /// Set this label on the PR when merge commits are detected. + pub(crate) label: Option, + /// Override the default message to post when merge commits are detected. + /// + /// This message will always be followed up with + /// "The following commits are merge commits:" and then + /// a list of the merge commits. + pub(crate) message: Option, } #[derive(PartialEq, Eq, Debug, serde::Deserialize)] diff --git a/src/handlers/no_merges.rs b/src/handlers/no_merges.rs index b9ed89ff..8d89219a 100644 --- a/src/handlers/no_merges.rs +++ b/src/handlers/no_merges.rs @@ -4,7 +4,7 @@ use crate::{ config::NoMergesConfig, db::issue_data::IssueData, - github::{IssuesAction, IssuesEvent}, + github::{IssuesAction, IssuesEvent, Label}, handlers::Context, }; use anyhow::Context as _; @@ -38,16 +38,23 @@ pub(super) async fn parse_input( return Ok(None); } - // Require an empty configuration block to enable no-merges notifications. - if config.is_none() { + // Require a `[no_merges]` configuration block to enable no-merges notifications. + let Some(config) = config else { return Ok(None); - } + }; // Don't ping on rollups or draft PRs. if event.issue.title.starts_with("Rollup of") || event.issue.draft { return Ok(None); } + // Don't trigger if the PR has any of the excluded labels. + for label in event.issue.labels() { + if config.exclude_labels.contains(&label.name) { + return Ok(None); + } + } + let mut merge_commits = HashSet::new(); let commits = event .issue @@ -73,7 +80,7 @@ pub(super) async fn parse_input( pub(super) async fn handle_input( ctx: &Context, - _config: &NoMergesConfig, + config: &NoMergesConfig, event: &IssuesEvent, input: NoMergesInput, ) -> anyhow::Result<()> { @@ -81,14 +88,9 @@ pub(super) async fn handle_input( let mut state: IssueData<'_, NoMergesState> = IssueData::load(&mut client, &event.issue, NO_MERGES_KEY).await?; - let since_last_posted = if state.data.mentioned_merge_commits.is_empty() { - "" + let mut message = if let Some(ref message) = config.message { + message.clone() } else { - " (since this message was last posted)" - }; - - let mut should_send = false; - let mut message = format!( " There are merge commits (commits with multiple parents) in your changes. We have a [no merge policy](https://rustc-dev-guide.rust-lang.org/git.html#no-merge-policy) so @@ -102,11 +104,24 @@ pub(super) async fn handle_input( $ # delete any merge commits in the editor that appears $ git push --force-with-lease ``` + " + .to_string() + }; + let since_last_posted = if state.data.mentioned_merge_commits.is_empty() { + "" + } else { + " (since this message was last posted)" + }; + write!( + message, + " The following commits are merge commits{since_last_posted}: + " + ) + .unwrap(); - " - ); + let mut should_send = false; for commit in &input.merge_commits { if state.data.mentioned_merge_commits.contains(commit) { continue; @@ -118,6 +133,16 @@ pub(super) async fn handle_input( } if should_send { + // Set label + if let Some(ref name) = config.label { + event + .issue + .add_labels(&ctx.github, vec![Label { name: name.clone() }]) + .await + .context("failed to set no_merges labels")?; + } + + // Post comment event .issue .post_comment(&ctx.github, &message)