From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms12 with LMTPS id WNm7If6cS2DhbwAAsNZ9tg (envelope-from ) for ; Fri, 12 Mar 2021 16:55:26 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id GAU2FvqcS2BVSQAAB5/wlQ (envelope-from ) for ; Fri, 12 Mar 2021 16:55:22 +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 F3CB4CE39 for ; Fri, 12 Mar 2021 17:55:17 +0100 (CET) From: Xinglu Chen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yoctocell.xyz; s=mail; t=1615568116; bh=ltfWohKWkIAXZqO7kcWh3hPltKWktqNHZ/3uaPZHWLE=; h=From:To:Subject:In-Reply-To:References:Date; b=QgJq6X0UP+lBItfaJKstv+4Gin0RoBQdD5qFiiX7Fmdsf326lFVqS9vBsreESSPBa /+nFWjyr4YrLLIqrTWezSgBpZg0PKuQtUaJF5N4s38+8xpgDmv2LEflOq0TwozCtyw g5SQG3NetEg0gSamkLSr1Cls8vo4t/HWB8YgEzBE= To: piem@inbox.kyleam.com Subject: [PATCH v2] piem: Add :maildir keyword to piem-inboxes In-Reply-To: <9ff4c94928b0cd0d223799fa8a978d94e545522e.1615460587.git.public@yoctocell.xyz> References: <9ff4c94928b0cd0d223799fa8a978d94e545522e.1615460587.git.public@yoctocell.xyz> Message-Id: <702dccedfc5e67a41bb0dd58fe66af6e3f204bb5.1615568004.git.public@yoctocell.xyz> Date: Fri, 12 Mar 2021 17:55:15 +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=1615568121; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ulWENIWy+1Ws3B3V7fEmhUMSPaig3ythwk4YsmztlAw=; b=oqzE2tqanFvI2lrPh4AE0PTZS8iPJSBLPkkPhU/o1jGQ8Yz7cWcdtzhavxnkVW7cC6hAik +304WqzhUUAB4feSMf+1WnvwW+zZM3OPGdnpcDljdSF78BeYev/4QcfeUgq7TpItsJqk7L RSifUthIYvpNjXB33aOcYfaYH3PJS+HTYOPSEYH3WhFQg20aERev8IKxh48gDT/VrKZI6p cWW6d3khAxjGE9QShbVfyEDCKyoIKFb5FxtQtdoEVJbyNxObC6OlAdnxoNyqBR4yBEmG2K F5DafNGl3feeBHltoiTRr1c07vtffYKwc6k1A4GJTGKa/v5WUNvBoPSXAYjDig== ARC-Seal: i=1; s=key1; d=kyleam.com; t=1615568121; a=rsa-sha256; cv=none; b=FcNS23FTKBgfmaGS9ryU8Wp77qdPILWhEhjHMJoBebavIX3qdaVvCOQYyGlZ1Y6nr1JpVs A1wWfqwmnzztIY17AG60A3Vf0CavoX8TzY9Q0FOViYUWeP6xHeV+zh/E0Yq7qyixogpIxE dnhJJ2YugYH4v1PmE794VjuAm5CjCOCeZfCFOVDfzBYjtHkfsgixg4fNmEu57cz+e9jx+R RvicYuyzIpA4/ky37j1TIhHfJVMoh7Itk/b4mCoYLTJLZW8i0xNy/fD9zfVxLGsZ+tvMaJ pJ1uR9mY8PE1JWmjqw7gogeMi4VY1PzOH7vDD0CPdjtnWMnQPxkBgzelP22YSA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=yoctocell.xyz header.s=mail header.b=QgJq6X0U; 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.37 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=yoctocell.xyz header.s=mail header.b=QgJq6X0U; 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: F3CB4CE39 X-Spam-Score: 2.37 X-Migadu-Scanner: scn0.migadu.com X-TUID: dCwOTJ8H/aDJ 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`. --- Changes since v1: - Update wording of docs. - Improve error message when no maildir is found. Also, I prefixed the commit summary with "piem: ". Documentation/piem.texi | 12 +++--- piem.el | 90 ++++++++++++++++++++++++----------------- 2 files changed, 60 insertions(+), 42 deletions(-) diff --git a/Documentation/piem.texi b/Documentation/piem.texi index ebd756d..0f5235c 100644 --- a/Documentation/piem.texi +++ b/Documentation/piem.texi @@ -408,11 +408,13 @@ can be inconvenient to start participating in a thread that you aren't reading in your regular MUA (e.g., if you use notmuch.el to read your 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 -entire thread for the message ID associated with the current buffer. A -prefix argument restricts the download to only the message. +case, you can use the command @code{piem-inject-thread-into-maildir} +to move the thread's messages into a local Maildir directory specified +by the current inbox's @code{:maildir} value in @code{piem-inboxes}, +falling back to @code{piem-maildir-directory}. 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. @vindex piem-after-mail-injection-functions After the messages are injected, each function in diff --git a/piem.el b/piem.el index 56f0b54..78536f1 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 "No directory returned by `piem-inbox-maildir-directory'")) + ((not (piem-maildir-dir-is-maildir-p maildir-directory)) + (user-error + "Does not look like a Maildir directory: %s" 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.2