summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Meyer <kyle@kyleam.com>2021-02-07 02:57:34 -0500
committerKyle Meyer <kyle@kyleam.com>2021-02-07 12:38:50 -0500
commite06a50377649da9af7a804ba225b400c87e11d40 (patch)
tree9c402d4410bcfd78bba12179ddd90dba5121e74b
parent0a3de9e528c010e3f8ff113eaca28f10ad0528ca (diff)
downloadpiem-e06a50377649da9af7a804ba225b400c87e11d40.tar.gz
piem: Add helper to construct message ID link
There are two spots that use (piem-inbox-get :url ...) and piem-escape-mid to construct the public-inbox link, and there is about to be another. Extract this shared logic. Cc: Xinglu Chen <public@yoctocell.xyz> Message-Id: <20210207075738.8752-2-kyle@kyleam.com>
-rw-r--r--piem-notmuch.el10
-rw-r--r--piem.el21
-rw-r--r--tests/piem-tests.el13
3 files changed, 32 insertions, 12 deletions
diff --git a/piem-notmuch.el b/piem-notmuch.el
index a222f3f..2a5c525 100644
--- a/piem-notmuch.el
+++ b/piem-notmuch.el
@@ -109,13 +109,9 @@ message itself if it looks like a patch."
(defun piem-notmuch-show-get-public-inbox-link (mid)
"Given the message-id MID, return the public-inbox url.
This will lookup the url in the `piem-inboxes' variable."
- (let* ((inbox (or (piem-notmuch-get-inbox)
- (user-error "No inbox associated with current buffer")))
- (link (or (piem-inbox-get :url inbox)
- (user-error "No url was found for %s" inbox))))
- (concat
- (piem--ensure-trailing-slash link)
- (piem-escape-mid mid))))
+ (piem-mid-url mid
+ (or (piem-notmuch-get-inbox)
+ (user-error "No inbox associated with current buffer"))))
;;;###autoload
(define-minor-mode piem-notmuch-mode
diff --git a/piem.el b/piem.el
index b66894f..24d252e 100644
--- a/piem.el
+++ b/piem.el
@@ -444,7 +444,7 @@ buffer."
nil))))
-;;;; Download helpers
+;;;; Link handling
(defconst piem--unreserved-chars
(append url-unreserved-chars
@@ -456,6 +456,20 @@ buffer."
"Escape MID for use in path part of a public-inbox URL."
(url-hexify-string mid piem--unreserved-chars))
+(defun piem-mid-url (mid &optional inbox)
+ "Return a public-inbox URL for MID.
+The URL is determined by INBOX's entry in `piem-inboxes'. If
+INBOX is nil, use the inbox returned by `piem-inbox'."
+ (concat
+ (piem--ensure-trailing-slash
+ (or (piem-inbox-get :url inbox)
+ (user-error "Couldn't find URL for %s"
+ (or inbox "current buffer"))))
+ (piem-escape-mid mid)))
+
+
+;;;; Download helpers
+
(defvar piem--has-gunzip)
(defun piem-check-gunzip ()
"Return non-nil if gunzip is available."
@@ -550,10 +564,7 @@ This function depends on :url being configured for entries in
"`piem-maildir-directory' does not look like a Maildir directory"))
((not (or message-only (piem-check-gunzip)))
(user-error "gunzip executable not found")))
- (when-let ((url (concat (or (piem-inbox-get :url)
- (user-error
- "Could not find inbox URL for current buffer"))
- (piem-escape-mid mid)
+ (when-let ((url (concat (piem-mid-url mid)
(if message-only "/raw" "/t.mbox.gz")))
(buffer (url-retrieve-synchronously url 'silent)))
(unwind-protect
diff --git a/tests/piem-tests.el b/tests/piem-tests.el
index 795686a..969c9d0 100644
--- a/tests/piem-tests.el
+++ b/tests/piem-tests.el
@@ -49,6 +49,19 @@
(should (equal (piem-escape-mid "msg@id") "msg@id"))
(should (equal (piem-escape-mid "m/g@id") "m%2Fg@id")))
+(ert-deftest piem-mid-url ()
+ (let ((piem-inboxes '(("inbox-a" :url "https://example.com/a/")
+ ("inbox-b" :url "https://example.com/b/"))))
+ (should (equal (piem-mid-url "msg@id" "inbox-a")
+ "https://example.com/a/msg@id"))
+ (should (equal (piem-mid-url "m/sg@id" "inbox-b")
+ "https://example.com/b/m%2Fsg@id"))
+ (should-error (piem-mid-url "msg@id")
+ :type 'user-error))
+ (let ((piem-inboxes '(("inbox-a"))))
+ (should-error (piem-mid-url "msg@id" "inbox-a")
+ :type 'user-error)))
+
(ert-deftest piem-name-branch-who-what-v ()
(should (equal (piem-name-branch-who-what-v
(list :from "Foo Bar <f@example.com>"