From a04a0750552fac5d723f6220a51d2d1f7cf42f81 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Sat, 20 Jan 2024 13:58:53 -0700 Subject: [PATCH] remove labels added by `no-merges` when rebase is pushed --- src/handlers/no_merges.rs | 54 +++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/src/handlers/no_merges.rs b/src/handlers/no_merges.rs index 9856c8719..eccdd5ea2 100644 --- a/src/handlers/no_merges.rs +++ b/src/handlers/no_merges.rs @@ -24,6 +24,9 @@ pub(super) struct NoMergesInput { struct NoMergesState { /// Hashes of merge commits that have already been mentioned by triagebot in a comment. mentioned_merge_commits: HashSet, + /// Labels that the bot added as part of the no-merges check. + #[serde(default)] + added_labels: Vec, } pub(super) async fn parse_input( @@ -72,10 +75,8 @@ pub(super) async fn parse_input( } } - if merge_commits.is_empty() { - return Ok(None); - } - + // Run the handler even if we have no merge commits, + // so we can take an action if some were removed. Ok(Some(NoMergesInput { merge_commits })) } @@ -103,6 +104,32 @@ pub(super) async fn handle_input( let mut client = ctx.db.get().await; let mut state: IssueData<'_, NoMergesState> = IssueData::load(&mut client, &event.issue, NO_MERGES_KEY).await?; + + // No merge commits. + if input.merge_commits.is_empty() { + if state.data.mentioned_merge_commits.is_empty() { + // No merge commits from before, so do nothing. + return Ok(()); + } + + // Merge commits were removed, so remove the labels we added. + for name in state.data.added_labels.iter() { + event + .issue + .remove_label(&ctx.github, name) + .await + .context("failed to remove label")?; + } + + // FIXME: Minimize prior no_merges comments. + + // Clear from state. + state.data.mentioned_merge_commits.clear(); + state.data.added_labels.clear(); + state.save().await?; + return Ok(()); + } + let first_time = state.data.mentioned_merge_commits.is_empty(); let mut message = config @@ -137,7 +164,7 @@ pub(super) async fn handle_input( if !first_time { // Check if the labels are still set. // Otherwise, they were probably removed manually. - let any_removed = config.labels.iter().any(|label| { + let any_removed = state.data.added_labels.iter().any(|label| { // No label on the issue matches. event.issue.labels().iter().all(|l| &l.name != label) }); @@ -150,13 +177,18 @@ pub(super) async fn handle_input( } } + let existing_labels = event.issue.labels(); + + let mut labels = Vec::new(); + for name in config.labels.iter() { + // Only add labels not already on the issue. + if existing_labels.iter().all(|l| &l.name != name) { + state.data.added_labels.push(name.clone()); + labels.push(Label { name: name.clone() }); + } + } + // Set labels - let labels = config - .labels - .iter() - .cloned() - .map(|name| Label { name }) - .collect(); event .issue .add_labels(&ctx.github, labels)