diff --git a/elsewhere-test.el b/elsewhere-test.el index 042c6fa..96804a7 100644 --- a/elsewhere-test.el +++ b/elsewhere-test.el @@ -6,8 +6,8 @@ ;; Maintainer: Wesley Nelson ;; Created: 23 Jul 2023 -;; Version: 1.2.1 -;; Package-Requires: ((emacs "29.1") (elsewhere "1.2.1")) +;; Version: 1.3.0 +;; Package-Requires: ((emacs "29.1") (elsewhere "1.3.0")) ;; Keywords: convenience @@ -47,7 +47,7 @@ Don't set it globally; the functions should be let-bound.") (cl-defstruct elsewhere--test-repo-spec-git - "Used for initializing data in a Git repo." + "Used for initializing data in a `Git' repo." remote branch test-file-name @@ -184,7 +184,7 @@ a `default-directory' equal to this temporary test directory." (message "Created repo with backend: %s" ,backend) (message "Initializing test data in repo") - (let* ((tmp-buff (elsewhere--test-initialize-repo ,spec))) + (let ((tmp-buff (elsewhere--test-initialize-repo ,spec))) (with-current-buffer tmp-buff (message "Executing test body in buffer: %s" tmp-buff) ,@body @@ -202,7 +202,7 @@ don't match, then the function will return nil. After all REGEXPS have been matched and removed, the remaining text left over will be checked to see if it appears to be in the format of a SHA hash." - (let* ((regexp (car regexps))) + (let ((regexp (car regexps))) (if regexp (progn (message "Checking regexp: %s" regexp) @@ -222,10 +222,10 @@ a SHA hash." (make-elsewhere--test-repo-spec-git :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (ert-fail "Bad URL was opened")))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (ert-fail "Bad URL was opened")))))) (should (length= browse-url-handlers 1)) (should-error (elsewhere-open nil nil nil t) @@ -238,10 +238,10 @@ a SHA hash." :remote "https://example.com/wesnel/elsewhere.git" :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (ert-fail "Bad URL was opened")))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (ert-fail "Bad URL was opened")))))) (should (length= browse-url-handlers 1)) (should-error (elsewhere-open nil nil nil t) @@ -254,11 +254,11 @@ a SHA hash." :remote "https://github.com/wesnel/elsewhere.git" :branch "branch" :test-file-name "elsewhere.el") - (let* ((elsewhere-recognized-backends nil) - (browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (ert-fail "Bad URL was opened")))))) + (let ((elsewhere-recognized-backends nil) + (browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (ert-fail "Bad URL was opened")))))) (should (length= browse-url-handlers 1)) (should-error (elsewhere-open nil nil nil t) @@ -272,11 +272,11 @@ a SHA hash." :branch "branch" :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el#L2-L5" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el#L2-L5" + url))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -284,8 +284,8 @@ a SHA hash." (forward-line 3) (should (equal 5 (line-number-at-pos))) (should (equal 2 (line-number-at-pos (mark)))) - (let* ((start (region-beginning)) - (end (region-end))) + (let ((start (region-beginning)) + (end (region-end))) (deactivate-mark) (should (not (use-region-p))) (should (equal 2 (line-number-at-pos start))) @@ -300,11 +300,11 @@ a SHA hash." :branch "branch" :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el" + url))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -312,7 +312,7 @@ a SHA hash." (forward-line 3) (should (equal 5 (line-number-at-pos))) (should (equal 2 (line-number-at-pos (mark)))) - (let* ((start (region-beginning))) + (let ((start (region-beginning))) (deactivate-mark) (should (not (use-region-p))) (elsewhere-open nil start nil t))))) @@ -324,11 +324,11 @@ a SHA hash." :remote "https://github.com/wesnel/elsewhere.git" :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el" + url))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -339,11 +339,11 @@ a SHA hash." :remote "git@github.com:wesnel/elsewhere.git" :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://github.com/wesnel/elsewhere/blob/branch/elsewhere.el" + url))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -354,16 +354,44 @@ a SHA hash." :remote "https://github.com/wesnel/elsewhere.git" :test-file-name "elsewhere.el" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://github.com/wesnel/elsewhere/blob/") - (rx "/elsewhere.el" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://github.com/wesnel/elsewhere/blob/") + (rx "/elsewhere.el" line-end)))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) +(ert-deftest elsewhere--test-elsewhere-open-github-http-rev-interactive () + (elsewhere--test-with-repo + 'Git + (make-elsewhere--test-repo-spec-git + :remote "https://github.com/wesnel/elsewhere.git" + :test-file-name "elsewhere.el" + :commit "message") + (let ((completing-read-function + (lambda (_prompt + _collection + &optional + _predicate + _require-match + _initial-input + _hist + def + _inherit-input-method) + def)) + (browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://github.com/wesnel/elsewhere/blob/") + (rx "/elsewhere.el" line-end)))))))) + (should (length= browse-url-handlers 1)) + (elsewhere-open nil nil nil)))) + (ert-deftest elsewhere--test-elsewhere-open-github-ssh-rev () (elsewhere--test-with-repo 'Git @@ -371,13 +399,13 @@ a SHA hash." :remote "git@github.com:wesnel/elsewhere.git" :test-file-name "elsewhere.el" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://github.com/wesnel/elsewhere/blob/") - (rx "/elsewhere.el" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://github.com/wesnel/elsewhere/blob/") + (rx "/elsewhere.el" line-end)))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -389,13 +417,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://github.com/wesnel/elsewhere/blob/") - (rx "/elsewhere.el#L2-L5" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://github.com/wesnel/elsewhere/blob/") + (rx "/elsewhere.el#L2-L5" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -414,13 +442,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://github.com/wesnel/elsewhere/blob/") - (rx "/elsewhere.el#L2-L5" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://github.com/wesnel/elsewhere/blob/") + (rx "/elsewhere.el#L2-L5" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -439,13 +467,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://github.com/wesnel/elsewhere/blob/") - (rx "/elsewhere.el#L2" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://github.com/wesnel/elsewhere/blob/") + (rx "/elsewhere.el#L2" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -463,13 +491,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://github.com/wesnel/elsewhere/blob/") - (rx "/elsewhere.el#L2" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://github.com/wesnel/elsewhere/blob/") + (rx "/elsewhere.el#L2" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -486,11 +514,11 @@ a SHA hash." :remote "https://gitlab.com/wesnel/elsewhere.git" :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://gitlab.com/wesnel/elsewhere/-/blob/branch/elsewhere.el" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://gitlab.com/wesnel/elsewhere/-/blob/branch/elsewhere.el" + url))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -501,11 +529,11 @@ a SHA hash." :remote "git@gitlab.com:wesnel/elsewhere.git" :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://gitlab.com/wesnel/elsewhere/-/blob/branch/elsewhere.el" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://gitlab.com/wesnel/elsewhere/-/blob/branch/elsewhere.el" + url))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -516,13 +544,13 @@ a SHA hash." :remote "https://gitlab.com/wesnel/elsewhere.git" :test-file-name "elsewhere.el" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") - (rx "/elsewhere.el" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") + (rx "/elsewhere.el" line-end)))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -533,13 +561,13 @@ a SHA hash." :remote "git@gitlab.com:wesnel/elsewhere.git" :test-file-name "elsewhere.el" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") - (rx "/elsewhere.el" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") + (rx "/elsewhere.el" line-end)))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -551,13 +579,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") - (rx "/elsewhere.el#L2-L5" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") + (rx "/elsewhere.el#L2-L5" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -576,13 +604,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") - (rx "/elsewhere.el#L2-L5" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") + (rx "/elsewhere.el#L2-L5" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -601,13 +629,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") - (rx "/elsewhere.el#L2" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") + (rx "/elsewhere.el#L2" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -625,13 +653,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") - (rx "/elsewhere.el#L2" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://gitlab.com/wesnel/elsewhere/-/blob/") + (rx "/elsewhere.el#L2" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -648,11 +676,11 @@ a SHA hash." :remote "https://git.sr.ht/~wgn/elsewhere" :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://git.sr.ht/~wgn/elsewhere/tree/branch/item/elsewhere.el" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://git.sr.ht/~wgn/elsewhere/tree/branch/item/elsewhere.el" + url))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -663,11 +691,11 @@ a SHA hash." :remote "git@git.sr.ht:~wgn/elsewhere" :branch "branch" :test-file-name "elsewhere.el") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (equal "https://git.sr.ht/~wgn/elsewhere/tree/branch/item/elsewhere.el" - url))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (equal "https://git.sr.ht/~wgn/elsewhere/tree/branch/item/elsewhere.el" + url))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -678,13 +706,13 @@ a SHA hash." :remote "https://git.sr.ht/~wgn/elsewhere" :test-file-name "elsewhere.el" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") - (rx "/item/elsewhere.el" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") + (rx "/item/elsewhere.el" line-end)))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -695,13 +723,13 @@ a SHA hash." :remote "git@git.sr.ht:~wgn/elsewhere" :test-file-name "elsewhere.el" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") - (rx "/item/elsewhere.el" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") + (rx "/item/elsewhere.el" line-end)))))))) (should (length= browse-url-handlers 1)) (elsewhere-open nil nil nil t)))) @@ -713,13 +741,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") - (rx "/item/elsewhere.el#L2-5" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") + (rx "/item/elsewhere.el#L2-5" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -738,13 +766,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") - (rx "/item/elsewhere.el#L2-5" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") + (rx "/item/elsewhere.el#L2-5" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -763,13 +791,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") - (rx "/item/elsewhere.el#L2" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") + (rx "/item/elsewhere.el#L2" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) @@ -787,13 +815,13 @@ a SHA hash." :test-file-name "elsewhere.el" :test-file-contents "1\n2\n3\n4\n5\n6\n7" :commit "message") - (let* ((browse-url-handlers - '(("\\`http" - . (lambda (url &rest args) - (should (elsewhere--test-contains-hash? - url - (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") - (rx "/item/elsewhere.el#L2" line-end)))))))) + (let ((browse-url-handlers + '(("\\`http" + . (lambda (url &rest args) + (should (elsewhere--test-contains-hash? + url + (rx line-start "https://git.sr.ht/~wgn/elsewhere/tree/") + (rx "/item/elsewhere.el#L2" line-end)))))))) (should (length= browse-url-handlers 1)) (forward-line) (should (equal 2 (line-number-at-pos))) diff --git a/elsewhere.el b/elsewhere.el index 53c30bd..8167adc 100644 --- a/elsewhere.el +++ b/elsewhere.el @@ -6,7 +6,7 @@ ;; Maintainer: Wesley Nelson ;; Created: 24 Jul 2023 -;; Version: 1.2.1 +;; Version: 1.3.0 ;; Package-Requires: ((emacs "29.1")) ;; Keywords: convenience @@ -39,6 +39,9 @@ ;;; Change Log: +;; 2023-12-01 - v1.3.0 +;; * Add ability to select a remote. + ;; 2023-12-01 - v1.2.1 ;; * Improve logic for selecting a Git revision. ;; * Use `rx' to build regexps. @@ -170,7 +173,7 @@ the URL. Otherwise, START and END will default to the currently-selected region (if any). If HEADLESS? is non-nil, then do not prompt for user input." (interactive) - (let* ((url (elsewhere-build-url buffer start end t headless?))) + (let ((url (elsewhere-build-url buffer start end t headless?))) (browse-url url))) ;;;###autoload @@ -184,7 +187,7 @@ currently-selected region (if any). If SILENT? is non-nil, then suppress the writing of the URL to the echo area. If HEADLESS? is non-nil, then do not prompt for user input." (interactive) - (let* ((buffer (or buffer (current-buffer)))) + (let ((buffer (or buffer (current-buffer)))) (with-current-buffer buffer (save-mark-and-excursion (let* ((use-region (unless (and start end) (use-region-p))) @@ -209,25 +212,24 @@ is non-nil, then do not prompt for user input." (defun elsewhere--build-url-git (file top bottom &optional headless?) "Build the URL for the FILE on a `Git' remote. -If the line numbers TOP and BOTTOM are provided, then the region -delineated by those line numbers will be incorporated into the -URL. If HEADLESS? is non-nil, then the Git revision will be the -current revision of the current buffer. Otherwise, the Git -revision will be chosen using `completing-read'." - (let* ((remote (condition-case nil - (vc-git-repository-url file) - (error (user-error "The Git remote is not configured in this directory")))) +It is assumed that FILE is open in the current buffer. If the line +numbers TOP and BOTTOM are provided, then the region delineated by +those line numbers will be incorporated into the URL. If HEADLESS? is +non-nil, then the `Git' revision will be the current revision of the +current buffer. Otherwise, the `Git' revision will be chosen using +`completing-read'." + (let* ((remote (elsewhere--choose-git-remote file headless?)) (pairing (assoc remote elsewhere-recognized-remotes-git 'elsewhere--is-matching-any-remote?)) (rev (elsewhere--choose-git-revision file headless?)) (path (file-relative-name file (vc-root-dir)))) (if (not pairing) (user-error "This Git remote is not supported") - (let* ((builder (cdr pairing))) + (let ((builder (cdr pairing))) (funcall builder remote rev path top bottom))))) (defun elsewhere--get-git-repo-dot-git-path (regexps remote) "Use REGEXPS to trim the host information off of REMOTE." (if (null regexps) remote - (let* ((regexp (car regexps))) + (let ((regexp (car regexps))) (replace-regexp-in-string regexp "" (elsewhere--get-git-repo-dot-git-path (cdr regexps) remote))))) (defun elsewhere--get-git-repo-path (regexps remote) @@ -271,11 +273,44 @@ delineated by those line numbers will be incorporated into the URL." (format "%s#L%d" base top)) base))) +(defun elsewhere--choose-git-remote (file &optional headless?) + "Choose the `Git' remote to use for FILE. +If HEADLESS? is non-nil, then the `Git' remote will be the +default for this file. Otherwise, the `Git' remote will be +chosen using `completing-read'." + (let ((choices (elsewhere--list-remotes-git file))) + (when (not choices) + (user-error "No Git remote configured for file: %s" file)) + (if headless? + (cdr (car choices)) + (cdr (assoc (elsewhere--choose-remote-interactively + (mapcar (lambda (pair) (car pair)) choices) + (car (car choices))) + choices))))) + +;; FIXME: `vc' should have this function, if they don't already. +(defun elsewhere--list-remotes-git (file) + "Construct an alist of `Git' remote names and URLs for FILE. +It is assumed that FILE is open in the current buffer." + (let ((default-directory (vc-git-root file))) + (with-temp-buffer + (vc-git-command (current-buffer) 0 nil "remote") + (mapcar (lambda (remote-name) + `(,remote-name . ,(vc-git-repository-url file remote-name))) + (split-string (buffer-string)))))) + +(defun elsewhere--choose-remote-interactively (choices &optional default) + "Use `completing-read' to choose a remote among CHOICES. +If provided, DEFAULT is the default choice to use if nothing else +is selected or entered by the user." + (elsewhere--choose-interactively "Choose remote" choices default)) + (defun elsewhere--choose-git-revision (file &optional headless?) - "Choose the Git revision to use for FILE. -If HEADLESS? is non-nil, then the Git revision will be the -current revision of the current buffer. Otherwise, the Git -revision will be chosen using `completing-read'." + "Choose the `Git' revision to use for FILE. +It is assumed that FILE is open in the current buffer. If HEADLESS? +is non-nil, then the `Git' revision will be the current revision of +the current buffer. Otherwise, the `Git' revision will be chosen +using `completing-read'." (let* ((found-branches (vc-git-branches)) (no-branches? (or (length= found-branches 0) (and (length= found-branches 1) @@ -296,7 +331,7 @@ revision will be chosen using `completing-read'." (elsewhere--choose-revision-interactively choices default)))) (defun elsewhere--get-current-ref () - "Use the Git symbolic-ref command to get the current ref on HEAD." + "Use the `Git' symbolic-ref command to get the current ref on HEAD." (let* ((ref-output (with-output-to-string (with-current-buffer standard-output @@ -309,10 +344,22 @@ revision will be chosen using `completing-read'." current-ref)) (defun elsewhere--choose-revision-interactively (choices &optional default) - "Use `completing-read' to choose among CHOICES. + "Use `completing-read' to choose a revision among CHOICES. If provided, DEFAULT is the default choice to use if nothing else is selected or entered by the user." - (completing-read (format "Choose revision (default %s):" default) + (elsewhere--choose-interactively "Choose revision" choices default)) + +(defun elsewhere--choose-interactively (prompt choices &optional default) + "Use `completing-read' to choose among CHOICES. +PROMPT is the prompting text which will be displayed to the user. +This function will handle adding a trailing semicolon to PROMPT, so exclude +that from PROMPT. If provided, DEFAULT is the default choice to +use if nothing else is selected or entered by the user. This + function will handle adding information about the DEFAULT to the + PROMPT, so exclude that from PROMPT as well." + (completing-read (if default + (format "%s (default %s): " prompt default) + (format "%s:" prompt)) choices nil nil