summaryrefslogtreecommitdiff
path: root/.config/nyxt/github.lisp
diff options
context:
space:
mode:
Diffstat (limited to '.config/nyxt/github.lisp')
-rw-r--r--.config/nyxt/github.lisp139
1 files changed, 139 insertions, 0 deletions
diff --git a/.config/nyxt/github.lisp b/.config/nyxt/github.lisp
new file mode 100644
index 0000000..78724a9
--- /dev/null
+++ b/.config/nyxt/github.lisp
@@ -0,0 +1,139 @@
+;; Could be an extension someday.
+(nyxt:define-package :nx-github-mode
+ (:documentation "Mode with GitHub-related commands."))
+(in-package :nx-github-mode)
+
+(nyxt:define-mode github-mode ()
+ "Manage Nyxt GitHub repository with convenient keybindings."
+ ((glyph "γ")
+ (keyscheme-map
+ (define-keyscheme-map "github-mode" ()
+ keyscheme:emacs
+ (list
+ "C-c C-c" 'approve-pull-request
+ "C-c C-m" 'new-feature-request
+ "C-c C-k" 'report-bug
+ "C-c C-r" 'review
+ "C-c C-0" 'notifications)))))
+
+(define-command notifications ()
+ (let* ((notification-links (clss:select "a[href^=\"https://github.com/notifications\"]"
+ (document-model (current-buffer))))
+ (back-to-notifications
+ (unless (uiop:emptyp notification-links)
+ (find-if (lambda (l) (search "Back to notifications" (nyxt/dom:body l)))
+ notification-links))))
+ (if back-to-notifications
+ (nyxt/dom:click-element back-to-notifications)
+ (buffer-load "https://github.com/notifications?query=reason:assign%20reason:mention%20reason:review-requested%20reason:team-mention%20reason:ci-activity"))))
+
+(define-command nyxt ()
+ (buffer-load "https://github.com/atlas-engineer/nyxt"))
+
+(defun debug-autofill ()
+ (ps-eval
+ (setf (ps:@ document active-element value) ""))
+ (format
+ nil "**Describe the bug**
+
+**Precise recipe to reproduce the issue**
+
+For website-specific issues:
+Can you reproduce this issue with Epiphany / GNOME Web (https://wiki.gnome.org/Apps/Web)?
+
+**Information**
+- OS name+version: GuixSD
+```sh
+$ guix describe
+~a
+```
+- Graphics card and driver: Intel UHD 620, `i915`
+``` sh
+$ lspci -v
+...
+00:02.0 VGA compatible controller: Intel Corporation UHD Graphics (rev 01) (prog-if 00 [VGA controller])
+ Subsystem: Lenovo Device 5089
+ Flags: bus master, fast devsel, latency 0, IRQ 165
+ Memory at 601c000000 (64-bit, non-prefetchable) [size=16M]
+ Memory at 4000000000 (64-bit, prefetchable) [size=256M]
+ I/O ports at 3000 [size=64]
+ Expansion ROM at 000c0000 [virtual] [disabled] [size=128K]
+ Capabilities: <access denied>
+ Kernel driver in use: i915
+ Kernel modules: i915
+...
+```
+- Desktop environment / Window manager name+version: StumpWM 20.11
+- How you installed Nyxt (Guix pack, package manager, build from source): `guix package -f nyxt.scm`
+- Information from `show-system-information`:
+```
+~a
+```
+
+**Output when started from a shell** "
+ (uiop:run-program "guix describe"
+ :output '(:string :stripped t))
+ (nyxt::system-information)))
+
+(define-command report-bug ()
+ "Report the bug on Nyxt GitHub, filling all the necessary information in the process."
+ (let* ((title (prompt1
+ :prompt "Title of the issue"
+ :sources (list (make-instance 'prompter:raw-source))))
+ (buffer (make-buffer-focus
+ :url (quri:uri (format nil "https://github.com/atlas-engineer/nyxt/issues/new?&template=bug_report.md&title=~a"
+ title)))))
+ (hooks:once-on (buffer-loaded-hook buffer)
+ (buffer)
+ (ps-eval
+ (ps:chain (nyxt/ps:qs document "#issue_body") (focus)))
+ (ffi-buffer-paste buffer (debug-autofill)))))
+
+(define-command new-feature-request ()
+ "Open a new feature request in Nyxt repo."
+ (let* ((title (prompt1
+ :prompt "Title of the issue"
+ :sources (list (make-instance 'prompter:raw-source))))
+ (buffer (make-buffer-focus
+ :url (quri:uri (format nil "https://github.com/atlas-engineer/nyxt/issues/new?assignees=&labels=feature&template=feature_request.md&title=~a"
+ title)))))
+ (hooks:once-on (buffer-loaded-hook buffer)
+ (buffer)
+ (ps-eval
+ (ps:chain (nyxt/ps:qs document "#issue_body") (focus))))))
+
+(define-command review ()
+ "Open the file diffing tab of the pull request."
+ (let* ((url (url (current-buffer)))
+ (files-url (quri:copy-uri
+ url
+ :path (str:concat (string-right-trim "/" (quri:uri-path url))
+ "/files"))))
+ (unless (or (search "/files" (render-url url))
+ (string/= "github.com" (quri:uri-domain url)))
+ (buffer-load files-url))))
+
+(define-command approve-pull-request ()
+ "Approve the pull request currently open."
+ (review)
+ (hooks:wait-on (buffer-loaded-hook (current-buffer))
+ buffer
+ ;; Make sure Nyxt DOM is fresh.
+ (update-document-model :buffer buffer)
+ (flet ((sel (selector)
+ (let ((result (clss:select selector (document-model buffer))))
+ (unless (uiop:emptyp result)
+ (elt result 0)))))
+ ;; Nyxt/DOM already has lots of things, so why not use them?
+ (nyxt/dom:toggle-details-element (sel "#review-changes-modal"))
+ (nyxt/dom:click-element (sel "input[type=radio][value=approve]"))
+ (nyxt/dom:click-element (sel "button[type=submit]")))))
+
+(define-command done ()
+ (let* ((button (elt (clss:select "button[type=\"submit\"][title=\"Done\"],
+button[type=\"submit\"][aria-label=\"Done\"]"
+ (document-model (current-buffer))) 0)))
+ (nyxt/dom:click-element button)))
+
+(define-auto-rule '(match-domain "github.com")
+ :included '(github-mode))