From df7db1301e3a820aeadf0c9af1f956389a3bd5b1 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Sat, 12 Aug 2023 10:24:17 +1000 Subject: Moving some github related functions to my-github also some minor changes in ycp-org and my-buffer --- emacs/.emacs.d/lisp/my/my-github.el | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'emacs/.emacs.d/lisp/my/my-github.el') 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 -- cgit v1.2.3