forge-llm/forge-llm.el
2025-03-12 14:06:58 -03:00

83 lines
3.5 KiB
EmacsLisp

(require 'forge)
;;;###autoload
(defun forge-llm-hello ()
"Display pull request branch information and show git diff in a Forge PR buffer."
(interactive)
(if (not (derived-mode-p 'forge-post-mode))
(message "Not in a Forge pull request buffer")
(let ((head (and (boundp 'forge--buffer-head-branch) forge--buffer-head-branch))
(base (and (boundp 'forge--buffer-base-branch) forge--buffer-base-branch)))
(if (and head base)
(let* ((default-directory (file-name-directory
(directory-file-name
(file-name-directory
(or buffer-file-name default-directory)))))
(pr-desc (format "Pull Request: %s → %s" head base))
(repo-root (locate-dominating-file default-directory ".git")))
;; First show the PR branches in the message area
(message "%s" pr-desc)
;; Now create a buffer with the git diff
(when repo-root
(let ((diff-command (format "git diff %s..%s" base head))
(buffer (get-buffer-create "*forge-llm-diff*")))
(with-current-buffer buffer
(setq buffer-read-only nil)
(erase-buffer)
(insert (format "Diff for %s\n\n" pr-desc))
(let ((default-directory repo-root))
(call-process-shell-command diff-command nil buffer))
(diff-mode)
(setq buffer-read-only t)
(goto-char (point-min)))
(display-buffer buffer))))
(message "Branch information not available")))))
;;;###autoload
(defun forge-llm-debug ()
"Debug function to show all relevant forge and magit variables."
(interactive)
(with-output-to-temp-buffer "*forge-llm-debug*"
(let ((vars '()))
;; Collect global variables with forge or magit in name
(mapatoms
(lambda (sym)
(when (and (boundp sym)
(not (keywordp sym))
(symbolp sym)
(or (string-match-p "forge" (symbol-name sym))
(string-match-p "magit" (symbol-name sym))))
(push sym vars))))
;; Sort and print global variables
(setq vars (sort vars (lambda (a b) (string< (symbol-name a) (symbol-name b)))))
(princ "=== Global Variables ===\n\n")
(dolist (var vars)
(princ (format "%s: %S\n\n" var (symbol-value var))))
;; Print local variables
(princ "\n\n=== Buffer-Local Variables ===\n\n")
(dolist (var (buffer-local-variables))
(when (and (symbolp (car var))
(or (string-match-p "forge" (symbol-name (car var)))
(string-match-p "magit" (symbol-name (car var)))))
(princ (format "%s: %S\n\n" (car var) (cdr var))))))))
;;;###autoload
(defun forge-llm-setup ()
"Set up forge-llm integration with Forge's new-pullreq buffer."
(interactive)
(add-hook 'forge-post-mode-hook #'forge-llm-setup-pullreq-hook)
(message "forge-llm has been set up successfully"))
(defun forge-llm-setup-pullreq-hook ()
"Hook function to set up forge-llm in a new-pullreq buffer."
;; Only add our keybinding if this is a pull request post
(when (and buffer-file-name
(string-match-p "new-pullreq" buffer-file-name))
(local-set-key (kbd "C-c C-l") #'forge-llm-hello)
(local-set-key (kbd "C-c C-d") #'forge-llm-debug)))
(provide 'forge-llm)