From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms12 with LMTPS id oF5mE9L5SWAxHAAAsNZ9tg (envelope-from ) for ; Thu, 11 Mar 2021 11:06:58 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id eBa9Cc75SWDzRQAAB5/wlQ (envelope-from ) for ; Thu, 11 Mar 2021 11:06:54 +0000 Received: from mail.yoctocell.xyz (h87-96-130-155.cust.a3fiber.se [87.96.130.155]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id B69E31824A for ; Thu, 11 Mar 2021 12:06:49 +0100 (CET) From: Xinglu Chen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yoctocell.xyz; s=mail; t=1615460808; bh=PoEpLJ9l8gP1Ug6cXoOS7pFvV2gTB8jlO1WJjvJ2IOo=; h=From:To:Subject:Date; b=ixQrOrRQIr9OPCfMzIWFlyko7SGPCt41igZ+Dahf+muktCl4YfQAp/bsHh/r6tiB4 DMtHb36CwhKVZX0Elap+bIW2XUjV/8QWnwIGqcE3gKcqgX9gyKRcNCBZvUKS6cucHH nlHLzjgIlkq0Gkz2/Hr437Y9XIlSKnyFZfmghDYw= To: piem@inbox.kyleam.com Subject: [RFC PATCH] Add :maildir keyword to piem-inboxes Message-Id: <9ff4c94928b0cd0d223799fa8a978d94e545522e.1615460587.git.public@yoctocell.xyz> Date: Thu, 11 Mar 2021 12:06:47 +0100 MIME-Version: 1.0 Content-Type: text/plain X-Migadu-Flow: FLOW_IN ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=kyleam.com; s=key1; t=1615460813; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: dkim-signature; bh=a9vkW6EFm3Z4Iys/u5LzMjNc2j4D39lLKpwL9xhcO4A=; b=d1Mpu+lkZ0QkyZwrO9CuzFEimeUk31D5N9+pItggkS7mxcDJ5mX+Ooua1CNls1rOygglvt 75lOMhouc3a420mtDP8oOP9rbuAYFJPFJXzWAx1rcxM+2Nr86ztLIX+J8+VyD56jlQ3i5r fxS+ysBauD5Bw7QHoD9gI98KrUSdyUm9W1FseOcZ1gybjjxEm+BDxWTKFWL9D/8a/vPcXe unTGCcNKzS6THJBlwkQPcJ5zWbPK+wxXHAo7xwWbIdvTV5huSyxxOnGPW0nLjvQGXfFadO 0MUogH0NYFdqOuSsxdn3RVXeemMLlEHDmOR7zDN28KSqr1a9PIhjQQ4QB2p/Zg== ARC-Seal: i=1; s=key1; d=kyleam.com; t=1615460813; a=rsa-sha256; cv=none; b=smGyXynATwSfn9AXNRL7fKIiyB3+Hpb1IXfnzngfTTzkxTcUgClIy/IUhGoebYQCXcyeEh dm0+SJI4Tc+C4IaBKhlLSC7D6Lv8PjYzdNq+b5er0uH6b+K3Wtsu00C199tPM9refv1YFN 65l3ujvr1PuwaHyunvi7yttv+8KMeb7iJINoVEc1NmuEdJJDSLs4yB/GZpmUC5ItLOjKwT 5vkwM6KxwcLyWV5V5pRS6rZj0oraa5L3V8Zc3SXug022CdVBJ+oMAsAcTwQMkXgUESw7Fz I6D4Egj/vP0Q3IgopRwmGGhQmwVY3q1TVqvcpVmvli5m9OHgtKSa9yjkaogJzw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=yoctocell.xyz header.s=mail header.b=ixQrOrRQ; spf=pass (aspmx1.migadu.com: domain of public@yoctocell.xyz designates 87.96.130.155 as permitted sender) smtp.mailfrom=public@yoctocell.xyz X-Migadu-Spam-Score: 2.46 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=yoctocell.xyz header.s=mail header.b=ixQrOrRQ; dmarc=pass (policy=none) header.from=yoctocell.xyz; spf=pass (aspmx1.migadu.com: domain of public@yoctocell.xyz designates 87.96.130.155 as permitted sender) smtp.mailfrom=public@yoctocell.xyz X-Migadu-Queue-Id: B69E31824A X-Spam-Score: 2.46 X-Migadu-Scanner: scn0.migadu.com X-TUID: BSlVkCC3THUz 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 `piem--write-mbox-to-maildir`. 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. :url 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 :value-type (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 +`piem-inboxes'." :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 +`piem-maildir-directory'." + (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 () (point-marker))) (point-max-marker))) (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) (save-excursion @@ -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 basename) (delete-file tmpfile) (cl-incf n-added)) @@ -588,7 +603,7 @@ (defun piem--write-mbox-to-maildir () ;;;###autoload (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")) current-prefix-arg)) - (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 -- 2.30.0