From 90f46e4ec360c9d38c0591d37ddde93632607c6c Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Mon, 13 Jan 2025 20:38:24 +0100 Subject: [PATCH] forge-{approve-pullreq,request-changes}: New commands Closes #377. --- lisp/forge-commands.el | 35 +++++++++++++++++++++++++++++++++++ lisp/forge-github.el | 16 ++++++++++++++++ lisp/forge-topic.el | 4 +++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lisp/forge-commands.el b/lisp/forge-commands.el index 0e7391cc..a2d54744 100644 --- a/lisp/forge-commands.el +++ b/lisp/forge-commands.el @@ -643,6 +643,41 @@ point is currently on." (insert (replace-regexp-in-string "^" "> " quote) "\n\n"))) (forge--display-post-buffer buf))) +(transient-define-suffix forge-approve-pullreq () + "Approve the current pull-request." + :description "approve pull-request" + :inapt-if-not #'forge-current-pullreq + :transient nil + (interactive) + (let ((pullreq (forge-current-pullreq t))) + (unless (cl-typep (forge-get-repository pullreq) 'forge-github-repository) + (user-error "This command is only available for Github")) + (when-let ((buf (forge--prepare-post-buffer + (forge--format pullreq "%i;new-approval") + (forge--format pullreq "Approve pull-request #%i of %p")))) + (with-current-buffer buf + (setq forge--buffer-post-object pullreq) + (setq forge--submit-post-function #'forge--submit-approve-pullreq)) + (forge--display-post-buffer buf)))) + +(transient-define-suffix forge-request-changes () + "Request changes to the current pull-request." + :description "request changes" + :inapt-if-not #'forge-current-pullreq + :transient nil + (interactive) + (let ((pullreq (forge-current-pullreq t))) + (unless (cl-typep (forge-get-repository pullreq) 'forge-github-repository) + (user-error "This command is only available for Github")) + (when-let ((buf (forge--prepare-post-buffer + (forge--format pullreq "%i;new-request") + (forge--format + pullreq "Request changes for pull-request #%i of %p")))) + (with-current-buffer buf + (setq forge--buffer-post-object pullreq) + (setq forge--submit-post-function #'forge--submit-request-changes)) + (forge--display-post-buffer buf)))) + ;;; Edit (defun forge-edit-post () diff --git a/lisp/forge-github.el b/lisp/forge-github.el index b34ac5ed..44b63182 100644 --- a/lisp/forge-github.el +++ b/lisp/forge-github.el @@ -649,6 +649,22 @@ :callback (forge--post-submit-callback) :errorback (forge--post-submit-errorback))) +(cl-defmethod forge--submit-approve-pullreq ((_ forge-github-repository) repo) + (let ((body (magit--buffer-string nil nil t))) + (forge--ghub-post repo "/repos/:owner/:repo/pulls/:number/reviews" + `((event . "APPROVE") + ,@(and (not (equal body "")) `((body . ,body)))) + :callback (forge--post-submit-callback) + :errorback (forge--post-submit-errorback)))) + +(cl-defmethod forge--submit-request-changes ((_ forge-github-repository) repo) + (let ((body (magit--buffer-string nil nil t))) + (forge--ghub-post repo "/repos/:owner/:repo/pulls/:number/reviews" + `((event . "REQUEST_CHANGES") + ,@(and (not (equal body "")) `((body . ,body)))) + :callback (forge--post-submit-callback) + :errorback (forge--post-submit-errorback)))) + (cl-defmethod forge--set-topic-title ((_repo forge-github-repository) topic title) (forge--ghub-patch topic diff --git a/lisp/forge-topic.el b/lisp/forge-topic.el index d4a4e123..79260891 100644 --- a/lisp/forge-topic.el +++ b/lisp/forge-topic.el @@ -1349,7 +1349,9 @@ This mode itself is never used directly." ["Actions" ("/f" forge-pull-this-topic) ("/b" forge-browse-this-topic) - ("/c" forge-checkout-this-pullreq)]] + ("/c" forge-checkout-this-pullreq) + ("/A" forge-approve-pullreq) + ("/R" forge-request-changes)]] [forge--lists-group ["Set " ("-m" forge-topic-set-milestone)