diff options
-rw-r--r-- | config.el | 68 | ||||
-rw-r--r-- | github-org.el | 98 |
2 files changed, 99 insertions, 67 deletions
diff --git a/config.el b/config.el index 734ea7f996b0..1ba55b2ad379 100644 --- a/config.el +++ b/config.el @@ -25,6 +25,7 @@ ;; (load! "nix-yapf-mode") (load! "show-matching-paren") (load! "irc") +(load! "github-org") (require 's) @@ -1080,73 +1081,6 @@ (cl-defstruct pull-request url number title author repository) -(defun grfn/alist->plist (alist) - (->> alist - (-mapcat (lambda (pair) - (list (intern (concat ":" (symbol-name (car pair)))) - (cdr pair)))))) - -(defun grfn/review-requests () - (let ((resp (ghub-graphql "query reviewRequests { - reviewRequests: search( - type:ISSUE, - query: \"is:open is:pr review-requested:glittershark archived:false\", - first: 100 - ) { - issueCount - nodes { - ... on PullRequest { - url - number - title - author { - login - ... on User { name } - } - repository { - name - owner { login } - } - } - } - } - }"))) - (->> resp - (alist-get 'data) - (alist-get 'reviewRequests) - (alist-get 'nodes) - (-map - (lambda (pr) - (apply - #'make-pull-request - (grfn/alist->plist pr))))))) - -(defun grfn/pr->org-headline (level pr) - (check-type level integer) - (check-type pr pull-request) - (format "%s TODO Review %s's PR on %s/%s: %s :pr: -SCHEDULED: <%s>" - (make-string level ?*) - (->> pr (pull-request-author) (alist-get 'name)) - (->> pr (pull-request-repository) - (alist-get 'owner) - (alist-get 'login)) - (->> pr (pull-request-repository) (alist-get 'name)) - (org-make-link-string - (pull-request-url pr) - (pull-request-title pr)) - (format-time-string "%Y-%m-%d %a"))) - -(require 'ghub) -(defun grfn/org-headlines-from-review-requests (level) - "Create org-mode headlines at LEVEL from all review-requested PRs on Github" - (interactive "*nLevel: ") - (let* ((prs (grfn/review-requests)) - (text (mapconcat (apply-partially #'grfn/pr->org-headline level) prs "\n"))) - (save-mark-and-excursion - (insert text)) - (org-align-tags 't))) - (defun grfn/num-inbox-items () (length (org-elements-agenda-match "inbox" t))) diff --git a/github-org.el b/github-org.el new file mode 100644 index 000000000000..942ed2d6297e --- /dev/null +++ b/github-org.el @@ -0,0 +1,98 @@ +;;; ~/.doom.d/github-org.el -*- lexical-binding: t; -*- + +(require 'ghub) + +(defun grfn/alist->plist (alist) + (->> alist + (-mapcat (lambda (pair) + (list (intern (concat ":" (symbol-name (car pair)))) + (cdr pair)))))) + +;;; + +(cl-defstruct pull-request url number title author repository) + +(defun grfn/query-pulls (query) + (let ((resp (ghub-graphql "query reviewRequests($query: String!) { + reviewRequests: search( + type:ISSUE, + query: $query, + first: 100 + ) { + issueCount + nodes { + ... on PullRequest { + url + number + title + author { + login + ... on User { name } + } + repository { + name + owner { login } + } + } + } + } + }" `((query . ,query))))) + (->> resp + (alist-get 'data) + (alist-get 'reviewRequests) + (alist-get 'nodes) + (-map + (lambda (pr) + (apply + #'make-pull-request + (grfn/alist->plist pr))))))) + +(defun grfn/requested-changes ()) + +(defun grfn/pull-request->org-headline (format-string level pr) + (check-type format-string string) + (check-type level integer) + (check-type pr pull-request) + (s-format (concat (make-string level ?*) " " format-string) + #'aget + `((author . ,(->> pr (pull-request-author) (alist-get 'name))) + (owner . ,(->> pr (pull-request-repository) + (alist-get 'owner) + (alist-get 'login))) + (repo . ,(->> pr (pull-request-repository) (alist-get 'name))) + (pr-link . ,(org-make-link-string + (pull-request-url pr) + (pull-request-title pr))) + (today . ,(format-time-string "%Y-%m-%d %a"))))) + +(defun grfn/org-headlines-from-review-requests (level) + "Create org-mode headlines at LEVEL from all review-requested PRs on Github" + (interactive "*nLevel: ") + (let* ((prs (grfn/query-pulls + "is:open is:pr review-requested:glittershark archived:false")) + (text (mapconcat + (apply-partially + #'grfn/pull-request->org-headline + "TODO Review ${author}'s PR on ${owner}/${repo}: ${pr-link} :pr: +SCHEDULED: <${today}>" + level) prs "\n"))) + (save-mark-and-excursion + (insert text)) + (org-align-tags 't))) + +(defun grfn/org-headlines-from-requested-changes (level) + "Create org-mode headlines at LEVEL from all PRs with changes requested + on Github" + (interactive "*nLevel: ") + (let* ((prs (grfn/query-pulls + (concat "is:pr is:open author:glittershark archived:false " + "sort:updated-desc review:changes-requested"))) + (text (mapconcat + (apply-partially + #'grfn/pull-request->org-headline + "TODO Address review comments on ${pr-link} :pr: +SCHEDULED: <${today}>" + level) prs "\n"))) + (save-mark-and-excursion + (insert text)) + (org-align-tags 't))) |