nnimap.el: Use IMAP MOVE extension if available
authorNikolaus Rath <Nikolaus@rath.org>
Sat, 11 Jul 2015 04:22:24 +0000 (12:22 +0800)
committerEric Abrahamsen <eric@ericabrahamsen.net>
Sun, 2 Aug 2015 05:41:05 +0000 (13:41 +0800)
* nnimap.el (nnimap-request-move-article, nnimap-process-expiry-targets,
  nnimap-split-incoming-mail): Use MOVE extension if available.

lisp/ChangeLog
lisp/nnimap.el

index e23bed2..4ce2c22 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-02  Nikolaus Rath  <Nikolaus@rath.org>
+
+       * nnimap.el (nnimap-request-move-article)
+       (nnimap-process-expiry-targets, nnimap-split-incoming-mail): Use MOVE
+       extension if available.
+
 2015-08-02  Nikolaus Rath  <Nikolaus@rath.org>
 
        * nnimap.el (nnimap-open-connection-1): explicitly ask server for
index 594d1f5..20ba0a3 100644 (file)
@@ -930,17 +930,19 @@ textual parts.")
       ;; way.
       (let ((message-id (message-field-value "message-id")))
        (if internal-move-group
-           (let ((result
-                  (with-current-buffer (nnimap-buffer)
-                    (nnimap-command "UID COPY %d %S"
-                                    article
-                                    (utf7-encode internal-move-group t)))))
-             (when (car result)
-               (nnimap-delete-article article)
-               (cons internal-move-group
-                     (or (nnimap-find-uid-response "COPYUID" (cadr result))
-                         (nnimap-find-article-by-message-id
-                          internal-move-group server message-id
+            (with-current-buffer (nnimap-buffer)
+              (let* ((can-move (nnimap-capability "MOVE"))
+                    (command (if can-move
+                                 "UID MOVE %d %S"
+                               "UID COPY %d %S"))
+                    (result (nnimap-command command article
+                                            (utf7-encode internal-move-group t))))
+                (when (and (car result) (not can-move))
+                  (nnimap-delete-article article))
+                (cons internal-move-group
+                      (or (nnimap-find-uid-response "COPYUID" (caddr result))
+                          (nnimap-find-article-by-message-id
+                           internal-move-group server message-id
                            nnimap-request-articles-find-limit)))))
          ;; Move the article to a different method.
          (let ((result (eval accept-form)))
@@ -980,11 +982,12 @@ textual parts.")
        (gnus-sorted-complement articles deletable-articles))))))
 
 (defun nnimap-process-expiry-targets (articles group server)
-  (let ((deleted-articles nil))
+  (let ((deleted-articles nil)
+        (articles-to-delete nil))
     (cond
      ;; shortcut further processing if we're going to delete the articles
      ((eq nnmail-expiry-target 'delete)
-      (setq deleted-articles articles)
+      (setq articles-to-delete articles)
       t)
      ;; or just move them to another folder on the same IMAP server
      ((and (not (functionp nnmail-expiry-target))
@@ -994,11 +997,14 @@ textual parts.")
       (and (nnimap-change-group group server)
           (with-current-buffer (nnimap-buffer)
             (nnheader-message 7 "Expiring articles from %s: %s" group articles)
-            (nnimap-command
-             "UID COPY %s %S"
-             (nnimap-article-ranges (gnus-compress-sequence articles))
-             (utf7-encode (gnus-group-real-name nnmail-expiry-target) t))
-            (setq deleted-articles articles)))
+             (let ((can-move (nnimap-capability "MOVE")))
+               (nnimap-command
+                (if can-move
+                    "UID MOVE %s %S"
+                  "UID COPY %s %S")
+                (nnimap-article-ranges (gnus-compress-sequence articles))
+                (utf7-encode (gnus-group-real-name nnmail-expiry-target) t))
+               (set (if can-move 'deleted-articles 'articles-to-delete) articles))))
       t)
      (t
       (dolist (article articles)
@@ -1019,11 +1025,13 @@ textual parts.")
                    (setq target nil))
                (nnheader-message 7 "Expiring article %s:%d" group article))
              (when target
-               (push article deleted-articles))))))
-      (setq deleted-articles (nreverse deleted-articles))))
+               (push article articles-to-delete))))))
+      (setq articles-to-delete (nreverse articles-to-delete))))
     ;; Change back to the current group again.
     (nnimap-change-group group server)
-    (nnimap-delete-article (gnus-compress-sequence deleted-articles))
+    (when articles-to-delete
+      (nnimap-delete-article (gnus-compress-sequence articles-to-delete))
+      (setq deleted-articles articles-to-delete))
     deleted-articles))
 
 (defun nnimap-find-expired-articles (group)
@@ -2060,6 +2068,7 @@ Return the server's response to the SELECT or EXAMINE command."
                                  nnmail-split-fancy))
          (nnmail-inhibit-default-split-group t)
          (groups (nnimap-get-groups))
+          (can-move (nnimap-capability "MOVE"))
          new-articles)
       (erase-buffer)
       (nnimap-command "SELECT %S" nnimap-inbox)
@@ -2094,14 +2103,16 @@ Return the server's response to the SELECT or EXAMINE command."
                  ;; Don't copy if the message is already in its
                  ;; target group.
                  (unless (string= group nnimap-inbox)
-                  (push (list (nnimap-send-command
-                               "UID COPY %s %S"
-                               (nnimap-article-ranges ranges)
-                               (utf7-encode group t))
-                              ranges)
-                        sequences)))))
+                   (push (list (nnimap-send-command
+                                (if can-move
+                                    "UID MOVE %s %S"
+                                  "UID COPY %s %S")
+                                (nnimap-article-ranges ranges)
+                                (utf7-encode group t))
+                               ranges)
+                         sequences)))))
            ;; Wait for the last COPY response...
-           (when sequences
+           (when (and (not can-move) sequences)
              (nnimap-wait-for-response (caar sequences))
              ;; And then mark the successful copy actions as deleted,
              ;; and possibly expunge them.