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)