Commit 4e9baea6 authored by Nikolaus Rath's avatar Nikolaus Rath Committed by Lars Ingebrigtsen
Browse files

nnimap.el: support additional expunge options

* lisp/gnus/nnimap.el (nnimap-close-group)
(nnimap-request-expire-articles, nnimap-delete-article)
(nnimap-request-scan): add new 'never, 'immediate, and 'on-exit
settings for nnimap-expunge (bug#20670).
parent b6fa5807
...@@ -14273,9 +14273,19 @@ specific login method to be used, you can set this variable to either ...@@ -14273,9 +14273,19 @@ specific login method to be used, you can set this variable to either
@code{plain} or @code{cram-md5}. @code{plain} or @code{cram-md5}.
   
@item nnimap-expunge @item nnimap-expunge
If non-@code{nil}, expunge articles after deleting them. This is always done When to expunge deleted messages. If @code{never}, deleted articles
if the server supports UID EXPUNGE, but it's not done by default on are marked with the IMAP @code{\\Delete} flag but not automatically
servers that doesn't support that command. 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).
   
@item nnimap-streaming @item nnimap-streaming
Virtually all @acronym{IMAP} server support fast streaming of data. Virtually all @acronym{IMAP} server support fast streaming of data.
...@@ -80,6 +80,16 @@ for '--daemon'. ...@@ -80,6 +80,16 @@ for '--daemon'.
* Changes in Emacs 26.1 * 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 new function 'mapbacktrace' applies a function to all frames of
the current stack trace. the current stack trace.
......
...@@ -92,10 +92,21 @@ Uses the same syntax as `nnmail-split-methods'.") ...@@ -92,10 +92,21 @@ Uses the same syntax as `nnmail-split-methods'.")
Possible choices are nil (use default methods), `anonymous', Possible choices are nil (use default methods), `anonymous',
`login', `plain' and `cram-md5'.") `login', `plain' and `cram-md5'.")
(defvoo nnimap-expunge t (defvoo nnimap-expunge 'on-exit
"If non-nil, expunge articles after deleting them. "When to expunge deleted messages.
This is always done if the server supports UID EXPUNGE, but it's If 'never, deleted articles are marked with the IMAP \\Delete
not done by default on servers that doesn't support that command.") 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-streaming t (defvoo nnimap-streaming t
"If non-nil, try to use streaming commands with IMAP servers. "If non-nil, try to use streaming commands with IMAP servers.
...@@ -910,8 +921,12 @@ textual parts.") ...@@ -910,8 +921,12 @@ textual parts.")
articles))) articles)))
(nreverse articles))) (nreverse articles)))
(deffoo nnimap-close-group (_group &optional _server) (deffoo nnimap-close-group (_group &optional server)
t) (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-request-move-article (article group server accept-form (deffoo nnimap-request-move-article (article group server accept-form
&optional _last &optional _last
...@@ -960,8 +975,7 @@ textual parts.") ...@@ -960,8 +975,7 @@ textual parts.")
articles) articles)
((and force ((and force
(eq nnmail-expiry-target 'delete)) (eq nnmail-expiry-target 'delete))
(unless (nnimap-delete-article (gnus-compress-sequence articles)) (nnimap-delete-article (gnus-compress-sequence articles))
(nnheader-message 7 "Article marked for deletion, but not expunged."))
nil) nil)
(t (t
(let ((deletable-articles (let ((deletable-articles
...@@ -1084,21 +1098,38 @@ If LIMIT, first try to limit the search to the N last articles." ...@@ -1084,21 +1098,38 @@ If LIMIT, first try to limit the search to the N last articles."
(when (and limit number-of-article) (when (and limit number-of-article)
(nnimap-find-article-by-message-id group server message-id)))))))) (nnimap-find-article-by-message-id group server message-id))))))))
(defun nnimap-delete-article (articles) (defun nnimap-delete-article (articles &optional sync)
"Delete ARTICLES.
If sync is non-nil, wait for server response."
(with-current-buffer (nnimap-buffer) (with-current-buffer (nnimap-buffer)
(nnimap-command "UID STORE %s +FLAGS.SILENT (\\Deleted)" (nnimap-command "UID STORE %s +FLAGS.SILENT (\\Deleted)"
(nnimap-article-ranges articles)) (nnimap-article-ranges articles))
(let ((sequence
(cond (cond
((nnimap-capability "UIDPLUS") ((eq nnimap-expunge 'immediately)
(if (nnimap-capability "UIDPLUS")
(nnimap-command "UID EXPUNGE %s" (nnimap-command "UID EXPUNGE %s"
(nnimap-article-ranges articles)) (nnimap-article-ranges articles))
t) (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)))
(nnimap-expunge (nnimap-expunge
(nnimap-command "EXPUNGE") (nnimap-command "EXPUNGE"))
t)
(t (gnus-message 7 (concat "nnimap: nnimap-expunge is not set and the " (t
"server doesn't support UIDPLUS, so we won't " (nnheader-message
"delete this article now")))))) 7 "Article marked for deletion, but not expunged.")))))
(if (and sync sequence)
(nnimap-wait-for-response sequence)))))
(deffoo nnimap-request-scan (&optional group server) (deffoo nnimap-request-scan (&optional group server)
(when group (when group
...@@ -2118,27 +2149,9 @@ Return the server's response to the SELECT or EXAMINE command." ...@@ -2118,27 +2149,9 @@ Return the server's response to the SELECT or EXAMINE command."
(nnimap-wait-for-response (caar sequences)) (nnimap-wait-for-response (caar sequences))
;; And then mark the successful copy actions as deleted, ;; And then mark the successful copy actions as deleted,
;; and possibly expunge them. ;; and possibly expunge them.
(nnimap-mark-and-expunge-incoming (nnimap-delete-article
(nnimap-parse-copied-articles sequences))) (nnimap-parse-copied-articles sequences) t))
(nnimap-mark-and-expunge-incoming junk-articles))))))) (nnimap-delete-article junk-articles t)))))))
(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) (defun nnimap-parse-copied-articles (sequences)
(let (sequence copied range) (let (sequence copied range)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment