Round 213: Forge - Magit GitHub/GitLab integration (20 commands)

ober

5cc7bb894d29c091fd287acd5845345cdeb2fd6a

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index c24ba6e..96232de 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -4583,6 +4583,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | ebib-import-file | :orange_circle: | Import file into Ebib |
 | ebib-push-citation | :orange_circle: | Push Ebib citation to buffer |
 
+### Round 213 — Forge (Magit GitHub/GitLab)
+
+| Command | Status | Description |
+|---------|--------|-------------|
+| forge-list-pullreqs | :orange_circle: | List pull requests |
+| forge-list-issues | :orange_circle: | List issues |
+| forge-list-notifications | :orange_circle: | List notifications |
+| forge-list-repositories | :orange_circle: | List repositories |
+| forge-list-topics | :orange_circle: | List topics |
+| forge-pull-pullreq | :orange_circle: | Pull PR data from remote |
+| forge-pull-topic | :orange_circle: | Pull topic data from remote |
+| forge-create-pullreq | :orange_circle: | Create new pull request |
+| forge-create-issue | :orange_circle: | Create new issue |
+| forge-create-post | :orange_circle: | Create new post/comment |
+| forge-edit-post | :orange_circle: | Edit post/comment |
+| forge-delete-post | :orange_circle: | Delete post/comment |
+| forge-merge | :orange_circle: | Merge pull request |
+| forge-fork | :orange_circle: | Fork repository |
+| forge-browse-pullreq | :orange_circle: | Browse PR in browser |
+| forge-browse-issue | :orange_circle: | Browse issue in browser |
+| forge-browse-commit | :orange_circle: | Browse commit in browser |
+| forge-browse-remote | :orange_circle: | Browse remote in browser |
+| forge-copy-url-at-point | :orange_circle: | Copy URL at point |
+| forge-visit-pullreq | :orange_circle: | Visit pull request |
+
 ### Round 212 — Evil extensions
 
 | Command | Status | Description |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index e5e97b8..10fa931 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -18814,3 +18814,45 @@
 (def (cmd-evil-quick-diff-cancel app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Evil: cancelled quick diff")))
+
+;;; Round 213 — Forge (batch 2)
+
+(def (cmd-forge-edit-post app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: editing post")))
+
+(def (cmd-forge-delete-post app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: deleted post")))
+
+(def (cmd-forge-merge app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: merging pull request")))
+
+(def (cmd-forge-fork app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: forking repository")))
+
+(def (cmd-forge-browse-pullreq app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: browsing pull request in browser")))
+
+(def (cmd-forge-browse-issue app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: browsing issue in browser")))
+
+(def (cmd-forge-browse-commit app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: browsing commit in browser")))
+
+(def (cmd-forge-browse-remote app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: browsing remote in browser")))
+
+(def (cmd-forge-copy-url-at-point app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: copied URL at point")))
+
+(def (cmd-forge-visit-pullreq app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: visiting pull request")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index f1fdbfa..623a29d 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -19431,3 +19431,49 @@
     (echo-read-string echo "Chars: "
       (lambda (chs)
         (echo-message! echo (str "Evil: owl goto 2-char " chs))))))
+
+;;; Round 213 — Forge (batch 1)
+
+(def (cmd-forge-list-pullreqs app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: listing pull requests")))
+
+(def (cmd-forge-list-issues app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: listing issues")))
+
+(def (cmd-forge-list-notifications app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: listing notifications")))
+
+(def (cmd-forge-list-repositories app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: listing repositories")))
+
+(def (cmd-forge-list-topics app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: listing topics")))
+
+(def (cmd-forge-pull-pullreq app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: pulling pull request data")))
+
+(def (cmd-forge-pull-topic app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: pulling topic data")))
+
+(def (cmd-forge-create-pullreq app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "PR title: "
+      (lambda (title)
+        (echo-message! echo (str "Forge: creating PR: " title))))))
+
+(def (cmd-forge-create-issue app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Issue title: "
+      (lambda (title)
+        (echo-message! echo (str "Forge: creating issue: " title))))))
+
+(def (cmd-forge-create-post app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Forge: creating new post")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 568f330..1767af5 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -5906,4 +5906,25 @@
   (register-command! 'evil-indent-plus-indent-up cmd-evil-indent-plus-indent-up)
   (register-command! 'evil-quick-diff cmd-evil-quick-diff)
   (register-command! 'evil-quick-diff-cancel cmd-evil-quick-diff-cancel)
+  ;; Round 213
+  (register-command! 'forge-list-pullreqs cmd-forge-list-pullreqs)
+  (register-command! 'forge-list-issues cmd-forge-list-issues)
+  (register-command! 'forge-list-notifications cmd-forge-list-notifications)
+  (register-command! 'forge-list-repositories cmd-forge-list-repositories)
+  (register-command! 'forge-list-topics cmd-forge-list-topics)
+  (register-command! 'forge-pull-pullreq cmd-forge-pull-pullreq)
+  (register-command! 'forge-pull-topic cmd-forge-pull-topic)
+  (register-command! 'forge-create-pullreq cmd-forge-create-pullreq)
+  (register-command! 'forge-create-issue cmd-forge-create-issue)
+  (register-command! 'forge-create-post cmd-forge-create-post)
+  (register-command! 'forge-edit-post cmd-forge-edit-post)
+  (register-command! 'forge-delete-post cmd-forge-delete-post)
+  (register-command! 'forge-merge cmd-forge-merge)
+  (register-command! 'forge-fork cmd-forge-fork)
+  (register-command! 'forge-browse-pullreq cmd-forge-browse-pullreq)
+  (register-command! 'forge-browse-issue cmd-forge-browse-issue)
+  (register-command! 'forge-browse-commit cmd-forge-browse-commit)
+  (register-command! 'forge-browse-remote cmd-forge-browse-remote)
+  (register-command! 'forge-copy-url-at-point cmd-forge-copy-url-at-point)
+  (register-command! 'forge-visit-pullreq cmd-forge-visit-pullreq)
 )