1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-09-06 13:18:42 +02:00

Add '--reviewer' option to 'git-obs pr review {approve,decline,interactive}' to support group reviews via group review bot

This commit is contained in:
2025-07-02 09:48:19 +02:00
parent 5724288ca8
commit 325c007247
4 changed files with 52 additions and 8 deletions

View File

@@ -23,6 +23,10 @@ class PullRequestReviewApproveCommand(osc.commandline_git.GitObsCommand):
"--commit",
help="Pin the review to the specified commit",
)
self.add_argument(
"--reviewer",
help="Review on behalf of the specified reviewer that is associated to group review bot",
)
def run(self, args):
from osc import gitea_api
@@ -32,12 +36,18 @@ class PullRequestReviewApproveCommand(osc.commandline_git.GitObsCommand):
self.print_gitea_settings()
if args.reviewer:
try:
gitea_api.User.get(self.gitea_conn, args.reviewer)
except gitea_api.UserDoesNotExist as e:
self.parser.error(f"Invalid reviewer: {e}")
pull_request_ids = args.id
for pr_index, pr_id in enumerate(pull_request_ids):
self.print_gitea_settings()
print(f"Approving {pr_id}...")
print(f"Approving {pr_id} ...")
owner, repo, number = gitea_api.PullRequest.split_id(pr_id)
gitea_api.PullRequest.approve_review(self.gitea_conn, owner, repo, number, msg=args.message, commit=args.commit)
gitea_api.PullRequest.approve_review(self.gitea_conn, owner, repo, number, msg=args.message, commit=args.commit, reviewer=args.reviewer)

View File

@@ -24,6 +24,10 @@ class PullRequestReviewDeclineCommand(osc.commandline_git.GitObsCommand):
"--commit",
help="Pin the review to the specified commit",
)
self.add_argument(
"--reviewer",
help="Review on behalf of the specified reviewer that is associated to group review bot",
)
def run(self, args):
from osc import gitea_api
@@ -33,12 +37,18 @@ class PullRequestReviewDeclineCommand(osc.commandline_git.GitObsCommand):
self.print_gitea_settings()
if args.reviewer:
try:
gitea_api.User.get(self.gitea_conn, args.reviewer)
except gitea_api.UserDoesNotExist as e:
self.parser.error(f"Invalid reviewer: {e}")
pull_request_ids = args.id
for pr_index, pr_id in enumerate(pull_request_ids):
self.print_gitea_settings()
print(f"Declining {pr_id}...")
print(f"Declining {pr_id} ...")
owner, repo, number = gitea_api.PullRequest.split_id(pr_id)
gitea_api.PullRequest.decline_review(self.gitea_conn, owner, repo, number, msg=args.message, commit=args.commit)
gitea_api.PullRequest.decline_review(self.gitea_conn, owner, repo, number, msg=args.message, commit=args.commit, reviewer=args.reviewer)

View File

@@ -50,11 +50,21 @@ class PullRequestReviewInteractiveCommand(osc.commandline_git.GitObsCommand):
nargs="*",
help="Pull request ID in <owner>/<repo>#<number> format",
)
self.add_argument(
"--reviewer",
help="Review on behalf of the specified reviewer that is associated to group review bot",
)
def run(self, args):
from osc import gitea_api
from osc.output import get_user_input
if args.reviewer:
try:
gitea_api.User.get(self.gitea_conn, args.reviewer)
except gitea_api.UserDoesNotExist as e:
self.parser.error(f"Invalid reviewer: {e}")
if args.id:
# TODO: deduplicate, skip those that do not require a review (print to stderr)
pull_request_ids = args.id
@@ -128,12 +138,12 @@ class PullRequestReviewInteractiveCommand(osc.commandline_git.GitObsCommand):
sys.exit(return_code)
def approve(self, owner: str, repo: str, number: int, *, commit: str):
def approve(self, owner: str, repo: str, number: int, *, commit: str, reviewer: Optional[str] = None):
from osc import gitea_api
gitea_api.PullRequest.approve_review(self.gitea_conn, owner, repo, number, commit=commit)
gitea_api.PullRequest.approve_review(self.gitea_conn, owner, repo, number, commit=commit, reviewer=reviewer)
def decline(self, owner: str, repo: str, number: int):
def decline(self, owner: str, repo: str, number: int, reviewer: Optional[str] = None):
from osc import gitea_api
message = gitea_api.edit_message(template=DECLINE_REVIEW_TEMPLATE.format(**locals()))
@@ -144,7 +154,7 @@ class PullRequestReviewInteractiveCommand(osc.commandline_git.GitObsCommand):
# strip leading and trailing spaces
message = message.strip()
gitea_api.PullRequest.decline_review(self.gitea_conn, owner, repo, number, msg=message)
gitea_api.PullRequest.decline_review(self.gitea_conn, owner, repo, number, msg=message, reviewer=reviewer)
def comment(self, owner: str, repo: str, number: int):
from osc import gitea_api

View File

@@ -426,6 +426,7 @@ class PullRequest:
*,
msg: Optional[str] = None,
commit: Optional[str] = None,
reviewer: Optional[str] = None,
) -> GiteaHTTPResponse:
"""
Approve review in a pull request.
@@ -435,6 +436,12 @@ class PullRequest:
if pr_obj.head_commit != commit:
raise RuntimeError("The pull request '{owner}/{repo}#{number}' has changed during the review")
if reviewer:
# group review bot is controlled via messages in comments
msg = f"@{reviewer} : approve\n\n" + (msg or "")
msg = msg.strip()
return cls.add_comment(conn, owner, repo, number, msg=msg)
url = conn.makeurl("repos", owner, repo, "pulls", str(number), "reviews")
# XXX[dmach]: commit_id has no effect; I thought it's going to approve if the commit matches with head and errors out otherwise
json_data = {
@@ -454,10 +461,17 @@ class PullRequest:
*,
msg: str,
commit: Optional[str] = None,
reviewer: Optional[str] = None,
) -> GiteaHTTPResponse:
"""
Decline review (request changes) in a pull request.
"""
if reviewer:
# group review bot is controlled via messages in comments
msg = f"@{reviewer} : decline\n\n" + (msg or "")
msg = msg.strip()
return cls.add_comment(conn, owner, repo, number, msg=msg)
url = conn.makeurl("repos", owner, repo, "pulls", str(number), "reviews")
json_data = {
"event": "REQUEST_CHANGES",