From f580ea195bfdef71de1642311f27c2aff1e4b41c Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 25 Jan 2017 01:18:43 +0100 Subject: [PATCH] Revert "nnimap.el: support additional expunge options" MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This reverts commit 4e9baea6aba1633074889339dcc7cdc9d73880d3. The patch broke fetching new mail: Debugger entered--Lisp error: (error "Format specifier doesn’t match argument type") format("%d .*\n" (t ("OK" ("HIGHESTMODSEQ" "914696") "Expunge" "completed.") ("VANISHED" "1825937") ("0" "RECENT"))) (looking-at (format "%d .*\n" sequence)) (not (looking-at (format "%d .*\n" sequence))) (progn (while (and (not (bobp)) (progn (forward-line -1) (looking-at "\\*\\|[0-9]+ OK NOOP")))) (not (looking-at (format "%d .*\n" sequence)))) --- doc/misc/gnus.texi | 16 ++------- etc/NEWS | 10 ------ lisp/gnus/nnimap.el | 87 +++++++++++++++++++-------------------------- 3 files changed, 40 insertions(+), 73 deletions(-) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index e8524fb03f0..05159d4b2f7 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -14273,19 +14273,9 @@ specific login method to be used, you can set this variable to either @code{plain} or @code{cram-md5}. @item nnimap-expunge -When to expunge deleted messages. If @code{never}, deleted articles -are marked with the IMAP @code{\\Delete} flag but not automatically -expunged. If @code{immediately}, deleted articles are immediately expunged -(this requires the server to support the UID EXPUNGE command). If -@code{on-exit}, deleted articles are flagged, and all flagged articles are -expunged when the group is closed. - -For backwards compatibility, this variable may also be set to t -or nil. If the server supports UID EXPUNGE, both t and nil are -equivalent to @code{immediately}. If the server does not support UID -EXPUNGE nil is equivalent to @code{never}, while t will immediately -expunge ALL articles that are currently flagged as deleted -(i.e., potentially not only the article that was just deleted). +If non-@code{nil}, expunge articles after deleting them. This is always done +if the server supports UID EXPUNGE, but it's not done by default on +servers that doesn't support that command. @item nnimap-streaming Virtually all @acronym{IMAP} server support fast streaming of data. diff --git a/etc/NEWS b/etc/NEWS index e5ee40cbe4b..ca66df62610 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -80,16 +80,6 @@ for '--daemon'. * Changes in Emacs 26.1 -+++ -** The Gnus user variable 'nnimap-expunge' supports three new values: -'never' for never expunging messages, 'immediately' for immediately -expunging deleted messages, and 'on-exit' to expunge deleted articles -when exiting the group's summary buffer. Setting 'nnimap-expunge' to -'nil' or 't' is still supported but not recommended, since it may -result in Gnus expunging all messages that have been flagged as -deleted by any IMAP client (rather than just those that have been -deleted by Gnus). - +++ ** The new function 'mapbacktrace' applies a function to all frames of the current stack trace. diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el index 931ec312083..700e86a0c57 100644 --- a/lisp/gnus/nnimap.el +++ b/lisp/gnus/nnimap.el @@ -92,21 +92,10 @@ Uses the same syntax as `nnmail-split-methods'.") Possible choices are nil (use default methods), `anonymous', `login', `plain' and `cram-md5'.") -(defvoo nnimap-expunge 'on-exit - "When to expunge deleted messages. -If 'never, deleted articles are marked with the IMAP \\Delete -flag but not automatically expunged. If 'immediately, deleted -articles are immediately expunged (this requires the server to -support the UID EXPUNGE command). If 'on-exit, deleted articles -are flagged, and all flagged articles are expunged when the -group is closed. - -For backwards compatibility, this variable may also be set to t -or nil. If the server supports UID EXPUNGE, both t and nil are -equivalent to 'immediately. If the server does not support UID -EXPUNGE nil is equivalent to 'never, while t will immediately -expunge ALL articles that are currently flagged as deleted -(i.e., potentially not only the article that was just deleted).") +(defvoo nnimap-expunge t + "If non-nil, expunge articles after deleting them. +This is always done if the server supports UID EXPUNGE, but it's +not done by default on servers that doesn't support that command.") (defvoo nnimap-streaming t "If non-nil, try to use streaming commands with IMAP servers. @@ -921,12 +910,8 @@ textual parts.") articles))) (nreverse articles))) -(deffoo nnimap-close-group (_group &optional server) - (when (eq nnimap-expunge 'on-exit) - (nnoo-change-server 'nnimap server nil) - (with-current-buffer (nnimap-buffer) - (nnimap-wait-for-response - (nnimap-send-command "EXPUNGE"))))) +(deffoo nnimap-close-group (_group &optional _server) + t) (deffoo nnimap-request-move-article (article group server accept-form &optional _last @@ -975,7 +960,8 @@ textual parts.") articles) ((and force (eq nnmail-expiry-target 'delete)) - (nnimap-delete-article (gnus-compress-sequence articles)) + (unless (nnimap-delete-article (gnus-compress-sequence articles)) + (nnheader-message 7 "Article marked for deletion, but not expunged.")) nil) (t (let ((deletable-articles @@ -1098,38 +1084,21 @@ If LIMIT, first try to limit the search to the N last articles." (when (and limit number-of-article) (nnimap-find-article-by-message-id group server message-id)))))))) -(defun nnimap-delete-article (articles &optional sync) - "Delete ARTICLES. - -If sync is non-nil, wait for server response." +(defun nnimap-delete-article (articles) (with-current-buffer (nnimap-buffer) (nnimap-command "UID STORE %s +FLAGS.SILENT (\\Deleted)" (nnimap-article-ranges articles)) - (let ((sequence (cond - ((eq nnimap-expunge 'immediately) - (if (nnimap-capability "UIDPLUS") + ((nnimap-capability "UIDPLUS") (nnimap-command "UID EXPUNGE %s" (nnimap-article-ranges articles)) - (nnheader-message - 3 (concat "nnimap-expunge set to 'immediately, but " - "server doesn't support UIDPLUS")))) - - ((memq nnimap-expunge '(on-exit never)) nil) - - ((nnimap-capability "UIDPLUS") - (nnimap-command "UID EXPUNGE %s" - (nnimap-article-ranges articles))) - + t) (nnimap-expunge - (nnimap-command "EXPUNGE")) - - (t - (nnheader-message - 7 "Article marked for deletion, but not expunged."))))) - - (if (and sync sequence) - (nnimap-wait-for-response sequence))))) + (nnimap-command "EXPUNGE") + t) + (t (gnus-message 7 (concat "nnimap: nnimap-expunge is not set and the " + "server doesn't support UIDPLUS, so we won't " + "delete this article now")))))) (deffoo nnimap-request-scan (&optional group server) (when group @@ -2149,9 +2118,27 @@ Return the server's response to the SELECT or EXAMINE command." (nnimap-wait-for-response (caar sequences)) ;; And then mark the successful copy actions as deleted, ;; and possibly expunge them. - (nnimap-delete-article - (nnimap-parse-copied-articles sequences) t)) - (nnimap-delete-article junk-articles t))))))) + (nnimap-mark-and-expunge-incoming + (nnimap-parse-copied-articles sequences))) + (nnimap-mark-and-expunge-incoming junk-articles))))))) + +(defun nnimap-mark-and-expunge-incoming (range) + (when range + (setq range (nnimap-article-ranges range)) + (erase-buffer) + (let ((sequence + (nnimap-send-command + "UID STORE %s +FLAGS.SILENT (\\Deleted)" range))) + (cond + ;; If the server supports it, we now delete the message we have + ;; just copied over. + ((nnimap-capability "UIDPLUS") + (setq sequence (nnimap-send-command "UID EXPUNGE %s" range))) + ;; If it doesn't support UID EXPUNGE, then we only expunge if the + ;; user has configured it. + (nnimap-expunge + (setq sequence (nnimap-send-command "EXPUNGE")))) + (nnimap-wait-for-response sequence)))) (defun nnimap-parse-copied-articles (sequences) (let (sequence copied range) -- 2.39.5