Change-Id: I6c6847fac56f0a9a1a2209792e00a3aec5e672b9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10809 Autosubmit: aspen <root@gws.fyi> Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI Reviewed-by: lukegb <lukegb@tvl.fyi>
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; -*- 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 . ,(or (->> pr (pull-request-author) (alist-get 'name))
 | |
|                              "no author"))
 | |
|               (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)))
 |