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

davidarthur pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new d964574ab90 KAFKA-18942: Add reviewers to PR body with committer-tools 
(#19168)
d964574ab90 is described below

commit d964574ab9032c4b5d51a17aedba2532732a44a0
Author: Ming-Yen Chung <[email protected]>
AuthorDate: Wed Mar 12 21:41:05 2025 +0800

    KAFKA-18942: Add reviewers to PR body with committer-tools (#19168)
    
    Allow `reviewers.py` to set the "Reviewers:" line in a PR body.
    
    Reviewers: Chia-Ping Tsai <[email protected]>, David Arthur 
<[email protected]>
---
 committer-tools/README.md    |  8 ++++---
 committer-tools/reviewers.py | 53 +++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/committer-tools/README.md b/committer-tools/README.md
index 92558d4a296..94f714f959a 100644
--- a/committer-tools/README.md
+++ b/committer-tools/README.md
@@ -46,11 +46,13 @@ See: https://cli.github.com/
 brew install gh
 ```
 
-## Find Reviewers
+## Find Reviewers and Update to PR body
 
 The reviewers.py script is used to simplify the process of producing our 
"Reviewers:"
-Git trailer. It parses the Git log to gather a set of "Authors" and 
"Reviewers". 
-Some simple string prefix matching is done to find candidates.
+Git trailer to PR body. It parses the Git log to gather a set of "Authors" and 
"Reviewers". 
+Some simple string prefix matching is done to find candidates. 
+After entering the pull request number, the script updates the "Reviewers:" 
trailer accordingly. 
+If the PR body already contains a "Reviewers:" trailer, the script replaces it 
with the updated list of reviewers.
 
 Usage:
 
diff --git a/committer-tools/reviewers.py b/committer-tools/reviewers.py
index ccac5e3182c..a3539f9d9c3 100755
--- a/committer-tools/reviewers.py
+++ b/committer-tools/reviewers.py
@@ -1,6 +1,10 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
+import json
+import shlex
+import subprocess
+import tempfile
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -35,6 +39,42 @@ def prompt_for_user():
             return clean_input
 
 
+def update_trailers(body, trailer):
+    with tempfile.NamedTemporaryFile() as fp:
+        fp.write(body.encode())
+        fp.flush()
+        cmd = f"git interpret-trailers --if-exists replace --trailer 
'{trailer}' {fp.name} "
+        p = subprocess.run(shlex.split(cmd), capture_output=True, text=True)
+        fp.close()
+
+    return p.stdout
+
+
+def append_message_to_pr_body(pr: int , message: str):
+    try:
+        pr_url = f"https://github.com/apache/kafka/pull/{pr}";
+        cmd_get_pr = f"gh pr view {pr_url} --json title,body"
+        result = subprocess.run(shlex.split(cmd_get_pr), capture_output=True, 
text=True, check=True)
+        current_pr_body = json.loads(result.stdout).get("body", {}).strip() + 
"\n"
+        pr_title = json.loads(result.stdout).get("title", {})
+        updated_pr_body = update_trailers(current_pr_body, message)
+    except subprocess.CalledProcessError as e:
+        print("Failed to retrieve PR body:", e.stderr)
+        return
+
+    print(f"""New PR body will be:\n\n---\n{updated_pr_body}---\n""")
+    choice = input(f'Update the body of "{pr_title}"? (y/n): ').strip().lower()
+    if choice in ['n', 'no']:
+        return
+
+    try:
+        cmd_edit_body = f"gh pr edit {pr_url} --body 
{shlex.quote(updated_pr_body)}"
+        subprocess.run(shlex.split(cmd_edit_body), check=True)
+        print("PR body updated successfully!")
+    except subprocess.CalledProcessError as e:
+        print("Failed to update PR body:", e.stderr)
+
+
 if __name__ == "__main__":
     print("Utility to help generate 'Reviewers' string for Pull Requests. Use 
Ctrl+D or Ctrl+C to exit")
 
@@ -87,9 +127,12 @@ if __name__ == "__main__":
             continue
 
     if selected_reviewers:
-        out = "\n\nReviewers: "
-        out += ", ".join([f"{name} <{email}>" for name, email, _ in 
selected_reviewers])
-        out += "\n"
-        print(out)
-
+        reviewer_message = "Reviewers: "
+        reviewer_message += ", ".join([f"{name} <{email}>" for name, email, _ 
in selected_reviewers])
+        print(f"\n\n{reviewer_message}\n")
 
+        try:
+            pr_number = int(input("\nPull Request (Ctrl+D or Ctrl+C to skip): 
"))
+            append_message_to_pr_body(pr_number, reviewer_message)
+        except (EOFError, KeyboardInterrupt):
+            exit(0)

Reply via email to