discussion and development of piem
 help / color / mirror / code / Atom feed
From: Xinglu Chen <public@yoctocell.xyz>
To: piem@inbox.kyleam.com
Subject: [RFC PATCH] Add :maildir keyword to piem-inboxes
Date: Thu, 11 Mar 2021 12:06:47 +0100	[thread overview]
Message-ID: <9ff4c94928b0cd0d223799fa8a978d94e545522e.1615460587.git.public@yoctocell.xyz> (raw)

Previously the user was able to configure a maildir to inject threads
into, but the user might want the maildir to be different depending
on which mailing list the threads was coming from.

With the `:maildir` keyword, users can configure the maildir on a
per-list basis.  If there is not `:maildir` configured for a mailing
list, it will fallback to the value of `piem-maildir-directory`.
I made `piem--write-mbox-to-maildir` take the maildir as an argument,
otherwise `piem-inbox-maildir-directory` would return nil because it is
not in a Gnus och Notmuch buffer when being called in

 Documentation/piem.texi |  3 +-
 piem.el                 | 90 ++++++++++++++++++++++++-----------------
 2 files changed, 55 insertions(+), 38 deletions(-)

diff --git a/Documentation/piem.texi b/Documentation/piem.texi
index ebd756d..9f8779f 100644
--- a/Documentation/piem.texi
+++ b/Documentation/piem.texi
@@ -410,7 +410,8 @@
 regular mail but are following a project via NNTP in Gnus).  In this
 case, you can use the command @code{piem-inject-thread-into-maildir} to
 move the thread's messages into a local Maildir directory
-(@code{piem-maildir-directory}).  By default the command downloads the
+(@code{piem-maildir-directory}, or the @code{:maildir} for the
+current inbox).  By default the command downloads the
 entire thread for the message ID associated with the current buffer.  A
 prefix argument restricts the download to only the message.
diff --git a/piem.el b/piem.el
index 56f0b54..fd0a41b 100644
--- a/piem.el
+++ b/piem.el
@@ -80,6 +80,8 @@ (defcustom piem-inboxes nil
       Local path of the code repository associated with the inbox.
       A URL hosting HTTPS archives.  This value must end with a slash.
+  :maildir
+      A Maildir directory to inject messages into.
 Here's an example for the public-inbox project itself:
@@ -87,7 +89,8 @@ (defcustom piem-inboxes nil
      :coderepo \"~/src/public-inbox/\"
      :address \"meta@public-inbox.org\"
      :listid \"meta.public-inbox.org\"
-     :url \"https://public-inbox.org/meta/\")"
+     :url \"https://public-inbox.org/meta/\"
+     :maildir \"~/.local/share/mail/.lists.mail.public-inbox\")"
   :type '(alist :key-type string
                 (plist :value-type string)))
@@ -169,8 +172,11 @@ (defcustom piem-am-read-worktree-function #'piem-am-read-worktree
   :type 'function)
 (defcustom piem-maildir-directory nil
-  "Inject public-inbox threads into this directory.
-If non-nil, this must be an existing Maildir directory."
+  "Default directory to inject public-inbox threads into.
+If non-nil, this must be an existing Maildir directory.  This can be
+overriden on a per-list basis by using the \":maildir\" keyword in
   :type 'string)
 (defcustom piem-mail-injection-skipif-predicate nil
@@ -373,6 +379,15 @@ (defun piem-inbox-coderepo (&optional inbox)
   (when-let ((repo (piem-inbox-get :coderepo inbox)))
     (expand-file-name repo)))
+(defun piem-inbox-maildir-directory (&optional inbox)
+  "Return the maildir for INBOX's entry in `piem-inboxes'.
+If INBOX is nil, use the inbox returned by `piem-inbox'.  If the
+INBOX doesn't have a maildir configured, return the value of
+  (or (piem-inbox-get :maildir inbox)
+      piem-maildir-directory))
 (defun piem-inbox-by-url-match (url)
   "Return inbox based on matching URL against `:url'."
   (setq url (piem--ensure-trailing-slash url))
@@ -547,7 +562,7 @@ (defun piem-download-and-decompress (url)
 ;;;; Maildir injection
-(defun piem--write-mbox-to-maildir ()
+(defun piem--write-mbox-to-maildir (maildir-directory)
   (let ((n-added 0)
         (n-skipped 0))
     (while (and (not (eobp))
@@ -558,7 +573,7 @@ (defun piem--write-mbox-to-maildir ()
              (basename (piem-maildir-make-uniq-maildir-id))
-             (tmpfile (concat piem-maildir-directory "/tmp/" basename)))
+             (tmpfile (concat maildir-directory "/tmp/" basename)))
         (goto-char beg)
         (if (and (functionp piem-mail-injection-skipif-predicate)
@@ -579,7 +594,7 @@ (defun piem--write-mbox-to-maildir ()
                     end t)
               (replace-match "\\1" t)))
           (write-region beg end tmpfile nil nil nil 'excl)
-          (piem-maildir-move-tmp-to-new piem-maildir-directory
+          (piem-maildir-move-tmp-to-new maildir-directory
           (delete-file tmpfile)
           (cl-incf n-added))
@@ -588,7 +603,7 @@ (defun piem--write-mbox-to-maildir ()
 (defun piem-inject-thread-into-maildir (mid &optional message-only)
-  "Inject thread containing MID into `piem-maildir-directory'.
+  "Inject thread containing MID into `piem-inbox-maildir-directory'.
 If prefix argument MESSAGE-ONLY is non-nil, inject just the
 message for MID, not the entire thread.
@@ -599,36 +614,37 @@ (defun piem-inject-thread-into-maildir (mid &optional message-only)
    (list (or (piem-mid)
              (user-error "No message ID found for the current buffer"))
-  (cond
-   ((not piem-maildir-directory)
-    (user-error "`piem-maildir-directory' is not configured"))
-   ((not (piem-maildir-dir-is-maildir-p piem-maildir-directory))
-    (user-error
-     "`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 (piem-mid-url mid)
-                          (if message-only "/raw" "/t.mbox.gz")))
-             (buffer (url-retrieve-synchronously url 'silent)))
-    (unwind-protect
-        (with-current-buffer buffer
-          (if (/= url-http-response-status 200)
-              (error "Download of %s failed" url)
-            (piem--url-remove-header)
-            (unless message-only
-              (piem--url-decompress))
-            (pcase-let ((`(,added-count . ,skipped-count)
-                         (piem--write-mbox-to-maildir)))
-              (message "Added %d message%s%s for %s to %s"
-                       added-count
-                       (if (= added-count 1) "" "s")
-                       (if (> skipped-count 0)
-                           (format " (skipping %d)" skipped-count)
-                         "")
-                       mid
-                       (abbreviate-file-name piem-maildir-directory)))
-            (run-hook-with-args 'piem-after-mail-injection-functions mid)))
-      (kill-buffer buffer))))
+  (let ((maildir-directory (piem-inbox-maildir-directory)))
+    (cond
+     ((not maildir-directory)
+      (user-error "`maildir-directory' is not configured"))
+     ((not (piem-maildir-dir-is-maildir-p maildir-directory))
+      (user-error
+       "`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 (piem-mid-url mid)
+                            (if message-only "/raw" "/t.mbox.gz")))
+               (buffer (url-retrieve-synchronously url 'silent)))
+      (unwind-protect
+          (with-current-buffer buffer
+            (if (/= url-http-response-status 200)
+                (error "Download of %s failed" url)
+              (piem--url-remove-header)
+              (unless message-only
+                (piem--url-decompress))
+              (pcase-let ((`(,added-count . ,skipped-count)
+                           (piem--write-mbox-to-maildir maildir-directory)))
+                (message "Added %d message%s%s for %s to %s"
+                         added-count
+                         (if (= added-count 1) "" "s")
+                         (if (> skipped-count 0)
+                             (format " (skipping %d)" skipped-count)
+                           "")
+                         mid
+                         (abbreviate-file-name maildir-directory)))
+              (run-hook-with-args 'piem-after-mail-injection-functions mid)))
+        (kill-buffer buffer)))))
 ;;;; Patch handling

base-commit: 26c8103eaa9df3ebaf873a7cd477efaa48cec140

             reply	other threads:[~2021-03-11 11:06 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-11 11:06 Xinglu Chen [this message]
2021-03-11 23:43 ` [RFC PATCH] Add :maildir keyword to piem-inboxes Kyle Meyer
2021-03-12 16:43   ` Xinglu Chen
2021-03-12 16:55 ` [PATCH v2] piem: " Xinglu Chen
2021-03-13  1:18   ` Kyle Meyer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

  List information: https://git.kyleam.com/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9ff4c94928b0cd0d223799fa8a978d94e545522e.1615460587.git.public@yoctocell.xyz \
    --to=public@yoctocell.xyz \
    --cc=piem@inbox.kyleam.com \


* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).