diff --git a/code-review-actions.el b/code-review-actions.el index 4854388..334b398 100644 --- a/code-review-actions.el +++ b/code-review-actions.el @@ -223,6 +223,12 @@ Optionally set a FEEDBACK message." (interactive) (code-review--submit "COMMENT")) +;;;###autoload +(defun code-review-close-pr () + "Close the current PR." + (interactive) + (code-review-close-pr)) + ;;;###autoload (defun code-review-submit-request-changes () "Submit a Request Change for the current PR." @@ -384,6 +390,26 @@ Optionally set a FEEDBACK message." (switch-to-buffer-other-window buffer) (code-review-comment-mode)))) +;;;###autoload +(defun code-review-close-pr () + "Close current PR. Sent immediately." + (interactive) + (let ((buffer (get-buffer-create code-review-comment-buffer-name)) + (pr (code-review-db-get-pullreq))) + (if (code-review-github-repo-p pr) + (progn + (oset pr state "CLOSED") + (code-review-close + pr + (lambda () + (code-review-db-update pr)))) + (message "Not supported in %s yet." + (cond + ((code-review-gitlab-repo-p pr) + "Gitlab") + ((code-review-bitbucket-repo-p pr) + "Bitbucket")))))) + ;;;###autoload (defun code-review-set-title () "Change the title of current PR. Sent immediately." diff --git a/code-review-bitbucket.el b/code-review-bitbucket.el index 20d10ae..b9c0f61 100644 --- a/code-review-bitbucket.el +++ b/code-review-bitbucket.el @@ -397,6 +397,10 @@ For internal usage only.") "Set title for your pr in BITBUCKET and call CALLBACK." (code-review-bitbucket-not-supported-message)) +(cl-defmethod code-review-close ((_bitbucket code-review-bitbucket-repo) _callback) + "Close pullreq in BITBUCKET and call CALLBACK afterward." + (code-review-bitbucket-not-supported-message)) + (cl-defmethod code-review-send-description ((_bitbucket code-review-bitbucket-repo) _callback) "Set description for your pr in BITBUCKET and call CALLBACK." (code-review-bitbucket-not-supported-message)) diff --git a/code-review-github.el b/code-review-github.el index 2b7652c..c473deb 100644 --- a/code-review-github.el +++ b/code-review-github.el @@ -633,6 +633,20 @@ Optionally ask for the FALLBACK? query." :errorback #'code-review-github-errback :callback (lambda (&rest _) (funcall callback)))) +(cl-defmethod code-review-close ((github code-review-github-repo) callback) + "Close pullreq in GITHUB and call CALLBACK afterward." + (message "Closing PR...") + (ghub-patch (format "/repos/%s/%s/pulls/%s" + (oref github owner) + (oref github repo) + (oref github number)) + nil + :auth code-review-auth-login-marker + :host code-review-github-host + :payload (a-alist 'state (oref github state)) + :errorback #'code-review-github-errback + :callback (lambda (&rest _) (funcall callback)))) + (cl-defmethod code-review-send-description ((github code-review-github-repo) callback) "Set description for a pullreq in GITHUB and call CALLBACK." (message "Sending new description...") @@ -783,7 +797,7 @@ Optionally ask for the FALLBACK? query." (cl-defmethod code-review-get-assignable-users ((github code-review-github-repo)) "Get a list of assignable users for current PR in GITHUB." (let ((infos (oref github raw-infos)) - (query "query($repo_owner:String!, $repo_name:String!, $cursor:String) { + (query "query($repo_owner:String!, $repo_name:String!, $cursor:String = null) { repository(owner: $repo_owner, name: $repo_name) { assignableUsers(first: 100, after: $cursor) { pageInfo { @@ -803,12 +817,13 @@ Optionally ask for the FALLBACK? query." (let ((has-next-page t) cursor res) (while has-next-page - (let ((graphql-res (ghub-graphql query - `((repo_owner . ,(oref github owner)) - (repo_name . ,(oref github repo)) - (cursor . ,cursor)) - :auth code-review-auth-login-marker - :host code-review-github-graphql-host))) + (let* ((baseData `((repo_owner . ,(oref github owner)) + (repo_name . ,(oref github repo)))) + (data (if cursor (cons `(cursor . ,cursor) baseData) baseData)) + + (graphql-res (ghub-graphql query data + :auth code-review-auth-login-marker + :host code-review-github-graphql-host))) (let-alist graphql-res (setq has-next-page .data.repository.assignableUsers.pageInfo.hasNextPage cursor .data.repository.assignableUsers.pageInfo.endCursor diff --git a/code-review-gitlab.el b/code-review-gitlab.el index f6afc9f..d6caac2 100644 --- a/code-review-gitlab.el +++ b/code-review-gitlab.el @@ -567,6 +567,10 @@ Optionally sets FALLBACK? to get minimal query." :payload `((title .,(oref gitlab title))) :callback (lambda (&rest _) (funcall callback)))) +(cl-defmethod code-review-close ((_gitlab code-review-gitlab-repo) _callback) + "Close pullreq in GITLAB and call CALLBACK afterward." + (code-review-gitlab-not-supported-message)) + (cl-defmethod code-review-send-description ((_gitlab code-review-gitlab-repo) _callback) "Set description for your pr in GITLAB and call CALLBACK." (code-review-gitlab-not-supported-message)) diff --git a/code-review-interfaces.el b/code-review-interfaces.el index 8fe2a82..8006412 100644 --- a/code-review-interfaces.el +++ b/code-review-interfaces.el @@ -81,6 +81,9 @@ (cl-defgeneric code-review-send-title (obj callback) "Set a pullrequest title for an OBJ and call CALLBACK afterward.") +(cl-defgeneric code-review-close (obj callback) + "Close a PR for an OBJ and call CALLBACK afterward.") + (cl-defgeneric code-review-send-description (obj callback) "Set a pullrequest description for an OBJ and call CALLBACK afterward.") diff --git a/code-review.el b/code-review.el index eb0c5e8..6462150 100644 --- a/code-review.el +++ b/code-review.el @@ -137,6 +137,7 @@ OUTDATED." ("a" "Approve" code-review-submit-approve) ("r" "Request Changes" code-review-submit-request-changes) ("c" "Comment" code-review-submit-comments) + ("C" "Close" code-review-close-pr) ("C-c C-s" "Save Unfinished Review" code-review-save-unfinished-review) ("C-c C-r" "Open Unfinished Review" code-review-open-unfinished-review)] ["Merge"