This is an automated email from the ASF dual-hosted git repository.

damccorm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new fa9c618cdbd Allow pr-bot to re-assign reviewers when stopped (#31436)
fa9c618cdbd is described below

commit fa9c618cdbd3414df4e30e6f41a2da4db6158aff
Author: Niel Markwick <[email protected]>
AuthorDate: Tue Jul 9 22:22:45 2024 +0200

    Allow pr-bot to re-assign reviewers when stopped (#31436)
    
    Fixes #31437
    
    Enables the command `assign set of reviewers` to restart notifications if 
stopped
---
 scripts/ci/pr-bot/processPrUpdate.ts       | 23 ++++++++---
 scripts/ci/pr-bot/shared/commentStrings.ts |  2 +-
 scripts/ci/pr-bot/shared/userCommand.ts    | 64 +++++++++++++++++++-----------
 3 files changed, 59 insertions(+), 30 deletions(-)

diff --git a/scripts/ci/pr-bot/processPrUpdate.ts 
b/scripts/ci/pr-bot/processPrUpdate.ts
index f9aa1571321..d38fa452a4b 100644
--- a/scripts/ci/pr-bot/processPrUpdate.ts
+++ b/scripts/ci/pr-bot/processPrUpdate.ts
@@ -83,6 +83,18 @@ async function processPrComment(
     stateClient,
     reviewerConfig
   );
+
+  // Check to see if notifications have been stopped before processing further.
+  // Notifications can be stopped by an "R: reviewer" comment,
+  // and then restarted by adding "assign set of reviewers" comment.
+  if (
+    (await stateClient.getPrState(getPullNumberFromPayload(payload)))
+      .stopReviewerNotifications
+  ) {
+    console.log("Notifications have been paused for this pull - skipping");
+    return;
+  }
+
   // If there's been a comment by a non-author, we can remove the slow review 
label
   if (commentAuthor !== pullAuthor && commentAuthor !== BOT_NAME) {
     await removeSlowReviewLabel(payload);
@@ -140,11 +152,6 @@ async function processPrUpdate() {
   const pullNumber = getPullNumberFromPayload(payload);
 
   const stateClient = new PersistentState();
-  const prState = await stateClient.getPrState(pullNumber);
-  if (prState.stopReviewerNotifications) {
-    console.log("Notifications have been paused for this pull - skipping");
-    return;
-  }
 
   switch (github.context.eventName) {
     case "issue_comment":
@@ -156,6 +163,12 @@ async function processPrUpdate() {
       await processPrComment(payload, stateClient, reviewerConfig);
       break;
     case "pull_request_target":
+      if (
+        (await stateClient.getPrState(pullNumber)).stopReviewerNotifications
+      ) {
+        console.log("Notifications have been paused for this pull - skipping");
+        return;
+      }
       if (payload.action === "synchronize") {
         console.log("Processing synchronize action");
         await setNextActionReviewers(payload, stateClient);
diff --git a/scripts/ci/pr-bot/shared/commentStrings.ts 
b/scripts/ci/pr-bot/shared/commentStrings.ts
index 138a494feb2..d1b366bcf77 100644
--- a/scripts/ci/pr-bot/shared/commentStrings.ts
+++ b/scripts/ci/pr-bot/shared/commentStrings.ts
@@ -58,7 +58,7 @@ export function someChecksFailing(reviewersToNotify: 
string[]): string {
 }
 
 export function stopNotifications(reason: string): string {
-  return `Stopping reviewer notifications for this pull request: ${reason}`;
+  return `Stopping reviewer notifications for this pull request: ${reason}. If 
you'd like to restart, comment \`assign set of reviewers\``;
 }
 
 export function remindReviewerAfterTestsPass(requester: string): string {
diff --git a/scripts/ci/pr-bot/shared/userCommand.ts 
b/scripts/ci/pr-bot/shared/userCommand.ts
index e32746eb7fc..6980468c3b1 100644
--- a/scripts/ci/pr-bot/shared/userCommand.ts
+++ b/scripts/ci/pr-bot/shared/userCommand.ts
@@ -39,32 +39,42 @@ export async function processCommand(
 
   const pullNumber = payload.issue?.number || payload.pull_request?.number;
   commentText = commentText.toLowerCase();
-  if (commentText.indexOf("r: @") > -1) {
-    await manuallyAssignedToReviewer(pullNumber, stateClient);
-  } else if (commentText.indexOf("assign to next reviewer") > -1) {
-    await assignToNextReviewer(
-      payload,
-      commentAuthor,
-      pullNumber,
-      stateClient,
-      reviewerConfig
-    );
-  } else if (commentText.indexOf("stop reviewer notifications") > -1) {
-    await stopReviewerNotifications(
-      pullNumber,
-      stateClient,
-      "requested by reviewer"
-    );
-  } else if (commentText.indexOf("remind me after tests pass") > -1) {
-    await remindAfterTestsPass(pullNumber, commentAuthor, stateClient);
-  } else if (commentText.indexOf("waiting on author") > -1) {
-    await waitOnAuthor(payload, pullNumber, stateClient);
-  } else if (commentText.indexOf("assign set of reviewers") > -1) {
-    await assignReviewerSet(payload, pullNumber, stateClient, reviewerConfig);
+
+  let prState = await stateClient.getPrState(pullNumber);
+  if(prState.stopReviewerNotifications) {
+    // Notifications stopped, only "allow assign set of reviewers"
+    if (commentText.indexOf("assign set of reviewers") > -1) {
+      await assignReviewerSet(payload, pullNumber, stateClient, 
reviewerConfig);
+    } else {
+      return false;
+    }
   } else {
-    return false;
+    if (commentText.indexOf("r: @") > -1) {
+      await manuallyAssignedToReviewer(pullNumber, stateClient);
+    } else if (commentText.indexOf("assign to next reviewer") > -1) {
+      await assignToNextReviewer(
+        payload,
+        commentAuthor,
+        pullNumber,
+        stateClient,
+        reviewerConfig
+      );
+    } else if (commentText.indexOf("stop reviewer notifications") > -1) {
+      await stopReviewerNotifications(
+        pullNumber,
+        stateClient,
+        "requested by reviewer"
+      );
+    } else if (commentText.indexOf("remind me after tests pass") > -1) {
+      await remindAfterTestsPass(pullNumber, commentAuthor, stateClient);
+    } else if (commentText.indexOf("waiting on author") > -1) {
+      await waitOnAuthor(payload, pullNumber, stateClient);
+    } else if (commentText.indexOf("assign set of reviewers") > -1) {
+      await assignReviewerSet(payload, pullNumber, stateClient, 
reviewerConfig);
+    } else {
+      return false;
+    }
   }
-
   return true;
 }
 
@@ -175,6 +185,12 @@ async function assignReviewerSet(
   reviewerConfig: typeof ReviewerConfig
 ) {
   let prState = await stateClient.getPrState(pullNumber);
+  if(prState.stopReviewerNotifications) {
+    // Restore notifications, and clear any existing reviewer set to
+    // allow new reviewers to be assigned.
+    prState.stopReviewerNotifications = false;
+    prState.reviewersAssignedForLabels = {};
+  }
   if (Object.values(prState.reviewersAssignedForLabels).length > 0) {
     await github.addPrComment(
       pullNumber,

Reply via email to