diff options
author | Yuchen Pei <id@ypei.org> | 2023-08-12 10:24:17 +1000 |
---|---|---|
committer | Yuchen Pei <id@ypei.org> | 2023-08-12 10:24:17 +1000 |
commit | df7db1301e3a820aeadf0c9af1f956389a3bd5b1 (patch) | |
tree | 566ab020b0b3b1b2df3e9b04868a9bcd15654b04 /emacs/.emacs.d/lisp/my/my-github.el | |
parent | 5adae92bf16275c46d91dc43bbe70df2b1155235 (diff) |
Moving some github related functions to my-github
also some minor changes in ycp-org and my-buffer
Diffstat (limited to 'emacs/.emacs.d/lisp/my/my-github.el')
-rw-r--r-- | emacs/.emacs.d/lisp/my/my-github.el | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/emacs/.emacs.d/lisp/my/my-github.el b/emacs/.emacs.d/lisp/my/my-github.el index 7dc2248..2fe90fd 100644 --- a/emacs/.emacs.d/lisp/my/my-github.el +++ b/emacs/.emacs.d/lisp/my/my-github.el @@ -64,5 +64,72 @@ License; name; description; homepage; created at" (my-delete-http-header) (alist-get 'name (json-read)))) +;;; urls with github +;; TODO: generalise the following to common forges, including +;; savannah, cgit, gitlab etc. +(defun my-github-revision-url (file revision) + "Returns the github url of the upstream repo containing FILE at REVISION." + (let ((repo-url (vc-git-repository-url file)) + (revision (or revision (vc-working-revision default-directory)))) + (format "%s/commit/%s" repo-url revision))) + +(defun my-github-kill-revision-url (revision) + "Kill the github revision url for REVISION." + (kill-new (my-github-revision-url revision))) + +(defun my-github-file-loc-url (file-loc &optional revision) + "Convert a file location to a github url." + (pcase-let* ((`(,file ,line-no) (split-string file-loc ":")) + (revision (or revision (vc-working-revision file)))) + (my-github-file-loc-url-internal file line-no revision))) + +(defun my-github-file-loc-url-internal (file line-no revision) + "Convert a FILE location at LINE-NO to a github url. + +REVISION is the commit hash." + (let* ((repo-url (vc-git-repository-url file)) + (repo-root (vc-git-root file)) + (path (file-relative-name file repo-root))) + (format "%s/blob/%s/%s#L%s" repo-url revision path line-no))) + +(defun my-github-kill-current-file-loc-url () + "Kill the github url from where the point is at." + (interactive) + (kill-new (my-github-file-loc-url-internal + (buffer-file-name) + (1+ (current-line)) + (vc-working-revision (buffer-file-name))))) + +(defun my-org-backtrace-to-github (bt &optional revision) + (string-join + (mapcar + (lambda (link) + (string-match "\\[\\[\\(.*\\)\\]\\[\\(.*\\)\\]\\]" link) + (let ((target (match-string 1 link)) + (label (match-string 2 link))) + (format "[[%s][%s]]" + (my-github-file-loc-url target revision) + label))) + (split-string bt " > ")) + " > ")) + +(defun my-org-backtrace-to-github-region (beg end) + (interactive "r") + (kill-new + (my-org-backtrace-to-github (buffer-substring-no-properties beg end)))) + +(defun my-org-backtrace-to-github-slack (beg end) + (interactive "r") + (let ((bt (buffer-substring-no-properties beg end)) + (revision (when current-prefix-arg + (read-string "Rrevision: "))) + ) + (with-temp-buffer + (insert "#+options: ^:nil +") + (goto-char (point-max)) + (insert (my-org-backtrace-to-github bt revision)) + (org-md-export-as-markdown)))) + (provide 'my-github) ;;; my-github.el ends here |