about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--config.el68
-rw-r--r--github-org.el98
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)))