[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] trunk r113257: Merge changes made in Gnus trunk
From: |
Katsumi Yamaoka |
Subject: |
[Emacs-diffs] trunk r113257: Merge changes made in Gnus trunk |
Date: |
Tue, 02 Jul 2013 10:39:47 +0000 |
User-agent: |
Bazaar (2.6b2) |
------------------------------------------------------------
revno: 113257
revision-id: address@hidden
parent: address@hidden
committer: Katsumi Yamaoka <address@hidden>
branch nick: trunk
timestamp: Tue 2013-07-02 10:38:58 +0000
message:
Merge changes made in Gnus trunk
2012-03-22 Lars Magne Ingebrigtsen <address@hidden>
* gnus.texi (Client-Side IMAP Splitting):
Note that `nnimap-inbox' now can be a list.
2013-06-05 David Engster <address@hidden>
* gnus-sum.el (gnus-update-marks): Do not remove empty 'unexist'
ranges, since `nnimap-retrieve-group-data-early' also uses it as a flag
to see whether the group was synced before.
2012-09-05 Martin Stjernholm <address@hidden>
* nnimap.el (nnimap-request-move-article): Decode the group name when
doing internal moves to avoid charset issues.
2012-09-05 Julien Danjou <address@hidden>
* nnimap.el (nnimap-request-list):
Revert change that made listing synchronous.
(nnimap-get-responses): Restore.
2012-08-31 Dave Abrahams <address@hidden>
* nnimap.el (nnimap-change-group): Document result value.
* nnimap.el (nnimap-find-article-by-message-id):
Account for the fact that nnimap-change-group can return t.
2012-08-06 Julien Danjou <address@hidden>
* nnimap.el (nnimap-request-head):
Resture to-buffer parameter, used by `nnimap-request-move-article'.
* nnimap.el (nnimap-request-head): Remove to-buffer argument.
* gnus-int.el (gnus-request-head): Remove to-buffer argument, only
supported by nnimap actually. Reverts previous change.
* gnus-int.el (gnus-request-head): Add an optional to-buffer parameter
to mimic `gnus-request-article' and enjoy backends the nn*-request-head
to-buffer argument that is already supported.
2012-07-24 Julien Danjou <address@hidden>
* nnimap.el (nnimap-get-responses): Remove, unused.
2012-06-25 Julien Danjou <address@hidden>
* nnimap.el (nnimap-request-articles-find-limit): Rename from
`nnimap-request-move-articles-find-limit' since we do not use it
only for move operations.
(nnimap-request-accept-article):
Use `nnimap-request-articles-find-limit' to limit search by message-id.
2012-06-19 Julien Danjou <address@hidden>
* nnir.el (nnir-run-imap): Fix, use `nnimap-change-group'.
* nnimap.el (nnimap-log-buffer):
Check that `window-point-insertion-type' is boundp, since it's not
available in XEmacs.
2012-06-19 Michael Welsh Duggan <address@hidden>
* nnimap.el (nnimap-log-buffer):
Add this, setting `window-point-insertion-type' in the buffer to t.
(nnimap-log-command): Use nnimap-log-buffer.
2012-06-19 Julien Danjou <address@hidden>
* nnimap.el (nnimap-find-article-by-message-id):
Add an optional limit argument to be able to limit the search.
(nnimap-request-move-article):
Use `nnimap-request-move-articles-find-limit'.
(nnimap-request-move-articles-find-limit):
Add this to limit the search by Message-Id after a message move.
(nnimap): Add defgroup.
2012-06-15 Julien Danjou <address@hidden>
* nnimap.el (nnimap-find-article-by-message-id):
Use `nnimap-possibly-change-group' rather than its own EXAMINE call.
(nnimap-possibly-change-group): Add read-only argument.
(nnimap-request-list): Use nnimap-possibly-change-group rather than
issuing EXAMINE manually.
(nnimap-find-article-by-message-id):
Use `nnimap-possibly-change-group' with read-only argument.
(nnimap-change-group): Rename from `nnimap-possibly-change-group'.
We cannot possibly change because we need to be sure that it's either
read-write or read-only.
2012-06-10 Lars Magne Ingebrigtsen <address@hidden>
* gnus-sum.el (gnus-summary-insert-old-articles):
Don't include unexistent messages.
2012-04-10 Lars Magne Ingebrigtsen <address@hidden>
* gnus-start.el (gnus-clean-old-newsrc):
Remove totally bogus `unexists' entries.
(gnus-clean-old-newsrc): Fix last checkin.
* nnimap.el (nnimap-update-info):
None of the articles below the active low-water mark exist.
2012-03-27 Katsumi Yamaoka <address@hidden>
* nnimap.el (gnus-refer-thread-use-nnir): Silence the byte compiler.
2012-03-22 Sergio Martinez <address@hidden> (tiny change)
* nnimap.el (nnimap-request-scan):
Allow `nnimap-inbox' to be a list of inboxes.
2012-03-10 Lars Magne Ingebrigtsen <address@hidden>
* gnus-group.el (gnus-group-expire-articles-1):
Don't try to expire messages that don't exist.
* gnus-sum.el (gnus-summary-expire-articles): Ditto.
2012-02-20 Lars Ingebrigtsen <address@hidden>
* gnus-start.el (gnus-clean-old-newsrc): Allow a FORCE parameter.
2012-02-15 Lars Ingebrigtsen <address@hidden>
* gnus-start.el (gnus-clean-old-newsrc):
Delete `unexist' from pre-Ma Gnus 0.3.
2012-02-15 Lars Ingebrigtsen <address@hidden>
* gnus-sum.el (gnus-summary-local-variables):
Make `gnus-newsgroup-unexist' into a local variable.
2012-02-11 Lars Ingebrigtsen <address@hidden>
* gnus-sum.el (gnus-adjust-marked-articles):
Add to `gnus-newsgroup-unexist'.
* gnus.el (gnus-article-mark-lists):
Add `unexist' to the list of marks.
(gnus-article-special-mark-lists):
Put the `unexist' in the special marks list instead.
* gnus-sum.el (gnus-articles-to-read): Don't include unexisting
articles in the list of articles to be selected.
* nnimap.el (nnimap-retrieve-group-data-early):
Query for unexisting articles.
(nnimap-update-info): Keep track of unexisting articles.
(nnimap-update-qresync-info): Ditto.
2012-02-01 Lars Ingebrigtsen <address@hidden>
* gnus-start.el (gnus-clean-old-newsrc): New function.
(gnus-read-newsrc-file): Use it.
modified:
doc/misc/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-6331
doc/misc/gnus.texi gnus.texi-20091113204419-o5vbwnq5f7feedwu-6305
lisp/gnus/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1433
lisp/gnus/gnus-group.el
gnusgroup.el-20091113204419-o5vbwnq5f7feedwu-1120
lisp/gnus/gnus-start.el
gnusstart.el-20091113204419-o5vbwnq5f7feedwu-1136
lisp/gnus/gnus-sum.el gnussum.el-20091113204419-o5vbwnq5f7feedwu-1137
lisp/gnus/gnus.el gnus.el-20091113204419-o5vbwnq5f7feedwu-1144
lisp/gnus/nnimap.el nnimap.el-20091113204419-o5vbwnq5f7feedwu-1978
lisp/gnus/nnir.el nnir.el-20091113204419-o5vbwnq5f7feedwu-8675
=== modified file 'doc/misc/ChangeLog'
--- a/doc/misc/ChangeLog 2013-06-24 06:58:52 +0000
+++ b/doc/misc/ChangeLog 2013-07-02 10:38:58 +0000
@@ -1,3 +1,8 @@
+2013-07-02 Lars Magne Ingebrigtsen <address@hidden>
+
+ * gnus.texi (Client-Side IMAP Splitting):
+ Note that `nnimap-inbox' now can be a list.
+
2013-06-24 Glenn Morris <address@hidden>
* eshell.texi: Fix cross-references to other manuals.
=== modified file 'doc/misc/gnus.texi'
--- a/doc/misc/gnus.texi 2013-06-04 08:43:07 +0000
+++ b/doc/misc/gnus.texi 2013-07-02 10:38:58 +0000
@@ -14240,7 +14240,8 @@
@table @code
@item nnimap-inbox
-This is the @acronym{IMAP} mail box that will be scanned for new mail.
+This is the @acronym{IMAP} mail box that will be scanned for new
+mail. This can also be a list of mail box names.
@item nnimap-split-methods
Uses the same syntax as @code{nnmail-split-methods} (@pxref{Splitting
=== modified file 'lisp/gnus/ChangeLog'
--- a/lisp/gnus/ChangeLog 2013-07-02 02:34:12 +0000
+++ b/lisp/gnus/ChangeLog 2013-07-02 10:38:58 +0000
@@ -1,3 +1,157 @@
+2013-07-02 David Engster <address@hidden>
+
+ * gnus-sum.el (gnus-update-marks): Do not remove empty 'unexist'
+ ranges, since `nnimap-retrieve-group-data-early' also uses it as a flag
+ to see whether the group was synced before.
+
+2013-07-02 Martin Stjernholm <address@hidden>
+
+ * nnimap.el (nnimap-request-move-article): Decode the group name when
+ doing internal moves to avoid charset issues.
+
+2013-07-02 Julien Danjou <address@hidden>
+
+ * nnimap.el (nnimap-request-list):
+ Revert change that made listing synchronous.
+ (nnimap-get-responses): Restore.
+
+2013-07-02 Dave Abrahams <address@hidden>
+
+ * nnimap.el (nnimap-change-group): Document result value.
+
+ * nnimap.el (nnimap-find-article-by-message-id):
+ Account for the fact that nnimap-change-group can return t.
+
+2013-07-02 Julien Danjou <address@hidden>
+
+ * nnimap.el (nnimap-request-head):
+ Resture to-buffer parameter, used by `nnimap-request-move-article'.
+
+ * nnimap.el (nnimap-request-head): Remove to-buffer argument.
+
+ * gnus-int.el (gnus-request-head): Remove to-buffer argument, only
+ supported by nnimap actually. Reverts previous change.
+
+ * gnus-int.el (gnus-request-head): Add an optional to-buffer parameter
+ to mimic `gnus-request-article' and enjoy backends the nn*-request-head
+ to-buffer argument that is already supported.
+
+2013-07-02 Julien Danjou <address@hidden>
+
+ * nnimap.el (nnimap-get-responses): Remove, unused.
+
+2013-07-02 Julien Danjou <address@hidden>
+
+ * nnimap.el (nnimap-request-articles-find-limit): Rename from
+ `nnimap-request-move-articles-find-limit' since we do not use it
+ only for move operations.
+ (nnimap-request-accept-article):
+ Use `nnimap-request-articles-find-limit' to limit search by message-id.
+
+2013-07-02 Julien Danjou <address@hidden>
+
+ * nnir.el (nnir-run-imap): Fix, use `nnimap-change-group'.
+
+ * nnimap.el (nnimap-log-buffer):
+ Check that `window-point-insertion-type' is boundp, since it's not
+ available in XEmacs.
+
+2013-07-02 Michael Welsh Duggan <address@hidden>
+
+ * nnimap.el (nnimap-log-buffer):
+ Add this, setting `window-point-insertion-type' in the buffer to t.
+ (nnimap-log-command): Use nnimap-log-buffer.
+
+2013-07-02 Julien Danjou <address@hidden>
+
+ * nnimap.el (nnimap-find-article-by-message-id):
+ Add an optional limit argument to be able to limit the search.
+ (nnimap-request-move-article):
+ Use `nnimap-request-move-articles-find-limit'.
+ (nnimap-request-move-articles-find-limit):
+ Add this to limit the search by Message-Id after a message move.
+ (nnimap): Add defgroup.
+
+2013-07-02 Julien Danjou <address@hidden>
+
+ * nnimap.el (nnimap-find-article-by-message-id):
+ Use `nnimap-possibly-change-group' rather than its own EXAMINE call.
+ (nnimap-possibly-change-group): Add read-only argument.
+ (nnimap-request-list): Use nnimap-possibly-change-group rather than
+ issuing EXAMINE manually.
+ (nnimap-find-article-by-message-id):
+ Use `nnimap-possibly-change-group' with read-only argument.
+ (nnimap-change-group): Rename from `nnimap-possibly-change-group'.
+ We cannot possibly change because we need to be sure that it's either
+ read-write or read-only.
+
+2013-07-02 Lars Magne Ingebrigtsen <address@hidden>
+
+ * gnus-sum.el (gnus-summary-insert-old-articles):
+ Don't include unexistent messages.
+
+2013-07-02 Lars Magne Ingebrigtsen <address@hidden>
+
+ * gnus-start.el (gnus-clean-old-newsrc):
+ Remove totally bogus `unexists' entries.
+ (gnus-clean-old-newsrc): Fix last checkin.
+
+ * nnimap.el (nnimap-update-info):
+ None of the articles below the active low-water mark exist.
+
+2013-07-02 Katsumi Yamaoka <address@hidden>
+
+ * nnimap.el (gnus-refer-thread-use-nnir): Silence the byte compiler.
+
+2013-07-02 Sergio Martinez <address@hidden> (tiny change)
+
+ * nnimap.el (nnimap-request-scan):
+ Allow `nnimap-inbox' to be a list of inboxes.
+
+2013-07-02 Lars Magne Ingebrigtsen <address@hidden>
+
+ * gnus-group.el (gnus-group-expire-articles-1):
+ Don't try to expire messages that don't exist.
+
+ * gnus-sum.el (gnus-summary-expire-articles): Ditto.
+
+2013-07-02 Lars Ingebrigtsen <address@hidden>
+
+ * gnus-start.el (gnus-clean-old-newsrc): Allow a FORCE parameter.
+
+2013-07-02 Lars Ingebrigtsen <address@hidden>
+
+ * gnus-start.el (gnus-clean-old-newsrc):
+ Delete `unexist' from pre-Ma Gnus 0.3.
+
+2013-07-02 Lars Ingebrigtsen <address@hidden>
+
+ * gnus-sum.el (gnus-summary-local-variables):
+ Make `gnus-newsgroup-unexist' into a local variable.
+
+2013-07-02 Lars Ingebrigtsen <address@hidden>
+
+ * gnus-sum.el (gnus-adjust-marked-articles):
+ Add to `gnus-newsgroup-unexist'.
+
+ * gnus.el (gnus-article-mark-lists):
+ Add `unexist' to the list of marks.
+ (gnus-article-special-mark-lists):
+ Put the `unexist' in the special marks list instead.
+
+ * gnus-sum.el (gnus-articles-to-read): Don't include unexisting
+ articles in the list of articles to be selected.
+
+ * nnimap.el (nnimap-retrieve-group-data-early):
+ Query for unexisting articles.
+ (nnimap-update-info): Keep track of unexisting articles.
+ (nnimap-update-qresync-info): Ditto.
+
+2013-07-02 Lars Ingebrigtsen <address@hidden>
+
+ * gnus-start.el (gnus-clean-old-newsrc): New function.
+ (gnus-read-newsrc-file): Use it.
+
2013-07-02 Daiki Ueno <address@hidden>
* mml2015.el (mml2015-epg-key-image): Use 'gnus-create-image' instead
=== modified file 'lisp/gnus/gnus-group.el'
--- a/lisp/gnus/gnus-group.el 2013-06-19 07:23:06 +0000
+++ b/lisp/gnus/gnus-group.el 2013-07-02 10:38:58 +0000
@@ -3654,6 +3654,10 @@
(expirable (if (gnus-group-total-expirable-p group)
(cons nil (gnus-list-of-read-articles group))
(assq 'expire (gnus-info-marks info))))
+ (articles-to-expire
+ (gnus-list-range-difference
+ (gnus-uncompress-sequence (cdr expirable))
+ (cdr (assq 'unexist (gnus-info-marks info)))))
(expiry-wait (gnus-group-find-parameter group 'expiry-wait))
(nnmail-expiry-target
(or (gnus-group-find-parameter group 'expiry-target)
@@ -3668,11 +3672,9 @@
;; parameter.
(let ((nnmail-expiry-wait-function nil)
(nnmail-expiry-wait expiry-wait))
- (gnus-request-expire-articles
- (gnus-uncompress-sequence (cdr expirable)) group))
+ (gnus-request-expire-articles articles-to-expire group))
;; Just expire using the normal expiry values.
- (gnus-request-expire-articles
- (gnus-uncompress-sequence (cdr expirable)) group))))
+ (gnus-request-expire-articles articles-to-expire group))))
(gnus-close-group group))
(gnus-message 6 "Expiring articles in %s...done"
(gnus-group-decoded-name group))
=== modified file 'lisp/gnus/gnus-start.el'
--- a/lisp/gnus/gnus-start.el 2013-02-13 04:31:09 +0000
+++ b/lisp/gnus/gnus-start.el 2013-07-02 10:38:58 +0000
@@ -2301,7 +2301,27 @@
(gnus-message 5 "Reading %s...done" newsrc-file)))
;; Convert old to new.
- (gnus-convert-old-newsrc))))
+ (gnus-convert-old-newsrc)
+ (gnus-clean-old-newsrc))))
+
+(defun gnus-clean-old-newsrc (&optional force)
+ (when gnus-newsrc-file-version
+ ;; Remove totally bogus `unexists' entries. The name is
+ ;; `unexist'.
+ (dolist (info (cdr gnus-newsrc-alist))
+ (let ((exist (assoc 'unexists (gnus-info-marks info))))
+ (when exist
+ (gnus-info-set-marks
+ info (delete exist (gnus-info-marks info))))))
+ (when (or force
+ (< (gnus-continuum-version gnus-newsrc-file-version)
+ (gnus-continuum-version "Ma Gnus v0.03")))
+ ;; Remove old `exist' marks from old nnimap groups.
+ (dolist (info (cdr gnus-newsrc-alist))
+ (let ((exist (assoc 'unexist (gnus-info-marks info))))
+ (when exist
+ (gnus-info-set-marks
+ info (delete exist (gnus-info-marks info)))))))))
(defun gnus-convert-old-newsrc ()
"Convert old newsrc formats into the current format, if needed."
=== modified file 'lisp/gnus/gnus-sum.el'
--- a/lisp/gnus/gnus-sum.el 2013-05-29 02:40:43 +0000
+++ b/lisp/gnus/gnus-sum.el 2013-07-02 10:38:58 +0000
@@ -1524,6 +1524,9 @@
(defvar gnus-newsgroup-seen nil
"Range of seen articles in the current newsgroup.")
+(defvar gnus-newsgroup-unexist nil
+ "Range of unexistent articles in the current newsgroup.")
+
(defvar gnus-newsgroup-articles nil
"List of articles in the current newsgroup.")
@@ -1571,6 +1574,7 @@
gnus-newsgroup-killed
gnus-newsgroup-unseen
gnus-newsgroup-seen
+ gnus-newsgroup-unexist
gnus-newsgroup-cached
gnus-newsgroup-downloadable
gnus-newsgroup-undownloaded
@@ -5789,6 +5793,7 @@
"Find out what articles the user wants to read."
(let* ((only-read-p t)
(articles
+ (gnus-list-range-difference
;; Select all articles if `read-all' is non-nil, or if there
;; are no unread articles.
(if (or read-all
@@ -5815,7 +5820,8 @@
(setq only-read-p nil)
(gnus-sorted-nunion
(gnus-sorted-union gnus-newsgroup-dormant gnus-newsgroup-marked)
- gnus-newsgroup-unreads)))
+ gnus-newsgroup-unreads))
+ (cdr (assq 'unexist (gnus-info-marks (gnus-get-info group))))))
(scored-list (gnus-killed-articles gnus-newsgroup-killed articles))
(scored (length scored-list))
(number (length articles))
@@ -5985,7 +5991,9 @@
(and (numberp (car articles))
(> min (car articles)))))
(pop articles))
- (set var articles))))))))
+ (set var articles))
+ ((eq mark 'unexist)
+ (set var (cdr marks)))))))))
(defun gnus-update-missing-marks (missing)
"Go through the list of MISSING articles and remove them from the mark
lists."
@@ -6061,7 +6069,8 @@
(gnus-active gnus-newsgroup-name) del))
(push (list del 'del (list (cdr type))) delta-marks))))
- (when list
+ (when (or list
+ (eq (cdr type) 'unexist))
(push (cons (cdr type) list) newmarked)))
(when delta-marks
@@ -10305,16 +10314,19 @@
'request-expire-articles gnus-newsgroup-name))
;; This backend supports expiry.
(let* ((total (gnus-group-total-expirable-p gnus-newsgroup-name))
- (expirable (if total
- (progn
- ;; We need to update the info for
- ;; this group for `gnus-list-of-read-articles'
- ;; to give us the right answer.
- (gnus-run-hooks 'gnus-exit-group-hook)
- (gnus-summary-update-info)
- (gnus-list-of-read-articles gnus-newsgroup-name))
- (setq gnus-newsgroup-expirable
- (sort gnus-newsgroup-expirable '<))))
+ (expirable
+ (gnus-list-range-difference
+ (if total
+ (progn
+ ;; We need to update the info for
+ ;; this group for `gnus-list-of-read-articles'
+ ;; to give us the right answer.
+ (gnus-run-hooks 'gnus-exit-group-hook)
+ (gnus-summary-update-info)
+ (gnus-list-of-read-articles gnus-newsgroup-name))
+ (setq gnus-newsgroup-expirable
+ (sort gnus-newsgroup-expirable '<)))
+ gnus-newsgroup-unexist))
(expiry-wait (if now 'immediate
(gnus-group-find-parameter
gnus-newsgroup-name 'expiry-wait)))
@@ -12847,7 +12859,9 @@
;; Some nntp servers lie about their active range. When
;; this happens, the active range can be in the millions.
;; Use a compressed range to avoid creating a huge list.
- (gnus-range-difference (list gnus-newsgroup-active) old))
+ (gnus-range-difference
+ (gnus-range-difference (list gnus-newsgroup-active) old)
+ gnus-newsgroup-unexist))
(setq len (gnus-range-length older))
(cond
((null older) nil)
=== modified file 'lisp/gnus/gnus.el'
--- a/lisp/gnus/gnus.el 2013-05-29 02:40:43 +0000
+++ b/lisp/gnus/gnus.el 2013-07-02 10:38:58 +0000
@@ -2636,10 +2636,11 @@
(scored . score) (saved . save)
(cached . cache) (downloadable . download)
(unsendable . unsend) (forwarded . forward)
- (seen . seen)))
+ (seen . seen) (unexist . unexist)))
(defconst gnus-article-special-mark-lists
'((seen range)
+ (unexist range)
(killed range)
(bookmark tuple)
(uid tuple)
@@ -2654,7 +2655,7 @@
;; `score' is not a proper mark
;; `bookmark': don't propagated it, or fix the bug in update-mark.
(defconst gnus-article-unpropagated-mark-lists
- '(seen cache download unsend score bookmark)
+ '(seen cache download unsend score bookmark unexist)
"Marks that shouldn't be propagated to back ends.
Typical marks are those that make no sense in a standalone back end,
such as a mark that says whether an article is stored in the cache
=== modified file 'lisp/gnus/nnimap.el'
--- a/lisp/gnus/nnimap.el 2013-05-29 02:40:43 +0000
+++ b/lisp/gnus/nnimap.el 2013-07-02 10:38:58 +0000
@@ -82,7 +82,8 @@
(defvoo nnimap-inbox nil
"The mail box where incoming mail arrives and should be split out of.
-For example, \"INBOX\".")
+This can be a string or a list of strings
+For example, \"INBOX\" or (\"INBOX\" \"SENT\").")
(defvoo nnimap-split-methods nil
"How mail is split.
@@ -123,6 +124,16 @@
likely value would be \"text/\" to automatically fetch all
textual parts.")
+(defgroup nnimap nil
+ "IMAP for Gnus."
+ :group 'gnus)
+
+(defcustom nnimap-request-articles-find-limit nil
+ "Limit the number of articles to look for after moving an article."
+ :type 'integer
+ :version "24.3"
+ :group 'nnimap)
+
(defvar nnimap-process nil)
(defvar nnimap-status-string "")
@@ -173,7 +184,7 @@
(setq group (nnimap-decode-gnus-group group)))
(with-current-buffer nntp-server-buffer
(erase-buffer)
- (when (nnimap-possibly-change-group group server)
+ (when (nnimap-change-group group server)
(with-current-buffer (nnimap-buffer)
(erase-buffer)
(nnimap-wait-for-response
@@ -567,10 +578,10 @@
(when group
(setq group (nnimap-decode-gnus-group group)))
(with-current-buffer nntp-server-buffer
- (let ((result (nnimap-possibly-change-group group server))
+ (let ((result (nnimap-change-group group server))
parts structure)
(when (stringp article)
- (setq article (nnimap-find-article-by-message-id group article)))
+ (setq article (nnimap-find-article-by-message-id group server article)))
(when (and result
article)
(erase-buffer)
@@ -599,10 +610,10 @@
(deffoo nnimap-request-head (article &optional group server to-buffer)
(when group
(setq group (nnimap-decode-gnus-group group)))
- (when (nnimap-possibly-change-group group server)
+ (when (nnimap-change-group group server)
(with-current-buffer (nnimap-buffer)
(when (stringp article)
- (setq article (nnimap-find-article-by-message-id group article)))
+ (setq article (nnimap-find-article-by-message-id group server article)))
(if (null article)
nil
(nnimap-get-whole-article
@@ -751,7 +762,7 @@
(deffoo nnimap-request-group (group &optional server dont-check info)
(setq group (nnimap-decode-gnus-group group))
- (let ((result (nnimap-possibly-change-group
+ (let ((result (nnimap-change-group
;; Don't SELECT the group if we're going to select it
;; later, anyway.
(if (and (not dont-check)
@@ -801,19 +812,19 @@
(deffoo nnimap-request-create-group (group &optional server args)
(setq group (nnimap-decode-gnus-group group))
- (when (nnimap-possibly-change-group nil server)
+ (when (nnimap-change-group nil server)
(with-current-buffer (nnimap-buffer)
(car (nnimap-command "CREATE %S" (utf7-encode group t))))))
(deffoo nnimap-request-delete-group (group &optional force server)
(setq group (nnimap-decode-gnus-group group))
- (when (nnimap-possibly-change-group nil server)
+ (when (nnimap-change-group nil server)
(with-current-buffer (nnimap-buffer)
(car (nnimap-command "DELETE %S" (utf7-encode group t))))))
(deffoo nnimap-request-rename-group (group new-name &optional server)
(setq group (nnimap-decode-gnus-group group))
- (when (nnimap-possibly-change-group nil server)
+ (when (nnimap-change-group nil server)
(with-current-buffer (nnimap-buffer)
(nnimap-unselect-group)
(car (nnimap-command "RENAME %S %S"
@@ -828,7 +839,7 @@
(deffoo nnimap-request-expunge-group (group &optional server)
(setq group (nnimap-decode-gnus-group group))
- (when (nnimap-possibly-change-group group server)
+ (when (nnimap-change-group group server)
(with-current-buffer (nnimap-buffer)
(car (nnimap-command "EXPUNGE")))))
@@ -856,6 +867,8 @@
(deffoo nnimap-request-move-article (article group server accept-form
&optional last internal-move-group)
(setq group (nnimap-decode-gnus-group group))
+ (when internal-move-group
+ (setq internal-move-group (nnimap-decode-gnus-group internal-move-group)))
(with-temp-buffer
(mm-disable-multibyte)
(when (funcall (if internal-move-group
@@ -876,11 +889,12 @@
(cons internal-move-group
(or (nnimap-find-uid-response "COPYUID" (cadr result))
(nnimap-find-article-by-message-id
- internal-move-group 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)))
(when result
- (nnimap-possibly-change-group group server)
+ (nnimap-change-group group server)
(nnimap-delete-article article)
result)))))))
@@ -889,7 +903,7 @@
(cond
((null articles)
nil)
- ((not (nnimap-possibly-change-group group server))
+ ((not (nnimap-change-group group server))
articles)
((and force
(eq nnmail-expiry-target 'delete))
@@ -926,7 +940,7 @@
(gnus-server-equal (gnus-group-method nnmail-expiry-target)
(gnus-server-to-method
(format "nnimap:%s" server))))
- (and (nnimap-possibly-change-group group server)
+ (and (nnimap-change-group group server)
(with-current-buffer (nnimap-buffer)
(nnheader-message 7 "Expiring articles from %s: %s" group articles)
(nnimap-command
@@ -956,7 +970,7 @@
(when target
(push article deleted-articles))))))))
;; Change back to the current group again.
- (nnimap-possibly-change-group group server)
+ (nnimap-change-group group server)
(setq deleted-articles (nreverse deleted-articles))
(nnimap-delete-article (gnus-compress-sequence deleted-articles))
deleted-articles))
@@ -978,23 +992,37 @@
(cdr (assoc "SEARCH" (cdr result))))))))))
-(defun nnimap-find-article-by-message-id (group message-id)
+(defun nnimap-find-article-by-message-id (group server message-id
+ &optional limit)
+ "Search for message with MESSAGE-ID in GROUP from SERVER.
+If LIMIT, first try to limit the search to the N last articles."
(with-current-buffer (nnimap-buffer)
(erase-buffer)
- (unless (or (not group) (equal group (nnimap-group nnimap-object)))
- (setf (nnimap-group nnimap-object) nil)
- (setf (nnimap-examined nnimap-object) group)
- (nnimap-send-command "EXAMINE %S" (utf7-encode group t)))
- (let ((sequence
- (nnimap-send-command "UID SEARCH HEADER Message-Id %S" message-id))
- article result)
- (setq result (nnimap-wait-for-response sequence))
- (when (and result
- (car (setq result (nnimap-parse-response))))
- ;; Select the last instance of the message in the group.
- (and (setq article
- (car (last (cdr (assoc "SEARCH" (cdr result))))))
- (string-to-number article))))))
+ (let* ((change-group-result (nnimap-change-group group server nil t))
+ (number-of-article
+ (and (listp change-group-result)
+ (catch 'found
+ (dolist (result (cdr change-group-result))
+ (when (equal "EXISTS" (cadr result))
+ (throw 'found (car result)))))))
+ (sequence
+ (nnimap-send-command
+ "UID SEARCH%s HEADER Message-Id %S"
+ (if (and limit number-of-article)
+ ;; The -1 is because IMAP message
+ ;; numbers are one-based rather than
+ ;; zero-based.
+ (format " %s:*" (- (string-to-number number-of-article)
+ limit -1))
+ "")
+ message-id)))
+ (when (nnimap-wait-for-response sequence)
+ (let ((article (car (last (cdr (assoc "SEARCH"
+ (nnimap-parse-response)))))))
+ (if article
+ (string-to-number article)
+ (when (and limit number-of-article)
+ (nnimap-find-article-by-message-id group server
message-id))))))))
(defun nnimap-delete-article (articles)
(with-current-buffer (nnimap-buffer)
@@ -1015,11 +1043,14 @@
(deffoo nnimap-request-scan (&optional group server)
(when group
(setq group (nnimap-decode-gnus-group group)))
- (when (and (nnimap-possibly-change-group nil server)
+ (when (and (nnimap-change-group nil server)
nnimap-inbox
nnimap-split-methods)
(nnheader-message 7 "nnimap %s splitting mail..." server)
- (nnimap-split-incoming-mail)
+ (if (listp nnimap-inbox)
+ (dolist (nnimap-inbox nnimap-inbox)
+ (nnimap-split-incoming-mail))
+ (nnimap-split-incoming-mail))
(nnheader-message 7 "nnimap %s splitting mail...done" server)))
(defun nnimap-marks-to-flags (marks)
@@ -1031,7 +1062,7 @@
(deffoo nnimap-request-update-group-status (group status &optional server)
(setq group (nnimap-decode-gnus-group group))
- (when (nnimap-possibly-change-group nil server)
+ (when (nnimap-change-group nil server)
(let ((command (assoc
status
'((subscribe "SUBSCRIBE")
@@ -1042,7 +1073,7 @@
(deffoo nnimap-request-set-mark (group actions &optional server)
(setq group (nnimap-decode-gnus-group group))
- (when (nnimap-possibly-change-group group server)
+ (when (nnimap-change-group group server)
(let (sequence)
(with-current-buffer (nnimap-buffer)
(erase-buffer)
@@ -1067,7 +1098,7 @@
(deffoo nnimap-request-accept-article (group &optional server last)
(setq group (nnimap-decode-gnus-group group))
- (when (nnimap-possibly-change-group nil server)
+ (when (nnimap-change-group nil server)
(nnmail-check-syntax)
(let ((message-id (message-field-value "message-id"))
sequence message)
@@ -1099,7 +1130,8 @@
(cons group
(or (nnimap-find-uid-response "APPENDUID" (car result))
(nnimap-find-article-by-message-id
- group message-id))))))))))
+ group server message-id
+ nnimap-request-articles-find-limit))))))))))
(defun nnimap-process-quirk (greeting-match type data)
(when (and (nnimap-greeting nnimap-object)
@@ -1145,7 +1177,7 @@
(deffoo nnimap-request-replace-article (article group buffer)
(setq group (nnimap-decode-gnus-group group))
(let (group-art)
- (when (and (nnimap-possibly-change-group group nil)
+ (when (and (nnimap-change-group group)
;; Put the article into the group.
(with-current-buffer buffer
(setq group-art
@@ -1180,8 +1212,17 @@
groups))))
(nreverse groups)))
+(defun nnimap-get-responses (sequences)
+ (let (responses)
+ (dolist (sequence sequences)
+ (goto-char (point-min))
+ (when (re-search-forward (format "^%d " sequence) nil t)
+ (push (list sequence (nnimap-parse-response))
+ responses)))
+ responses))
+
(deffoo nnimap-request-list (&optional server)
- (when (nnimap-possibly-change-group nil server)
+ (when (nnimap-change-group nil server)
(with-current-buffer nntp-server-buffer
(erase-buffer)
(let ((groups
@@ -1228,7 +1269,7 @@
t)))))
(deffoo nnimap-request-newgroups (date &optional server)
- (when (nnimap-possibly-change-group nil server)
+ (when (nnimap-change-group nil server)
(with-current-buffer nntp-server-buffer
(erase-buffer)
(dolist (group (with-current-buffer (nnimap-buffer)
@@ -1239,14 +1280,15 @@
t)))
(deffoo nnimap-retrieve-group-data-early (server infos)
- (when (and (nnimap-possibly-change-group nil server)
+ (when (and (nnimap-change-group nil server)
infos)
(with-current-buffer (nnimap-buffer)
(erase-buffer)
(setf (nnimap-group nnimap-object) nil)
(setf (nnimap-initial-resync nnimap-object) 0)
(let ((qresyncp (nnimap-capability "QRESYNC"))
- params groups sequences active uidvalidity modseq group)
+ params groups sequences active uidvalidity modseq group
+ unexist)
;; Go through the infos and gather the data needed to know
;; what and how to request the data.
(dolist (info infos)
@@ -1254,13 +1296,15 @@
group (nnimap-decode-gnus-group
(gnus-group-real-name (gnus-info-group info)))
active (cdr (assq 'active params))
+ unexist (assq 'unexist (gnus-info-marks info))
uidvalidity (cdr (assq 'uidvalidity params))
modseq (cdr (assq 'modseq params)))
(setf (nnimap-examined nnimap-object) group)
(if (and qresyncp
uidvalidity
active
- modseq)
+ modseq
+ unexist)
(push
(list (nnimap-send-command "EXAMINE %S (%s (%s %s))"
(utf7-encode group t)
@@ -1279,11 +1323,10 @@
;; is read-only or not.
"SELECT"))
start)
- (if (and active uidvalidity)
+ (if (and active uidvalidity unexist)
;; Fetch the last 100 flags.
(setq start (max 1 (- (cdr active) 100)))
- (setf (nnimap-initial-resync nnimap-object)
- (1+ (nnimap-initial-resync nnimap-object)))
+ (incf (nnimap-initial-resync nnimap-object))
(setq start 1))
(push (list (nnimap-send-command "%s %S" command
(utf7-encode group t))
@@ -1303,7 +1346,7 @@
(deffoo nnimap-finish-retrieve-group-infos (server infos sequences)
(when (and sequences
- (nnimap-possibly-change-group nil server t)
+ (nnimap-change-group nil server t)
;; Check that the process is still alive.
(get-buffer-process (nnimap-buffer))
(memq (process-status (get-buffer-process (nnimap-buffer)))
@@ -1462,6 +1505,25 @@
(setq new-marks (gnus-range-nconcat old-marks new-marks)))
(when new-marks
(push (cons (car type) new-marks) marks)))))
+ ;; Keep track of non-existing articles.
+ (let* ((old-unexists (assq 'unexist marks))
+ (active (gnus-active group))
+ (unexists
+ (if completep
+ (gnus-range-difference
+ active
+ (gnus-compress-sequence existing))
+ (gnus-add-to-range
+ (cdr old-unexists)
+ (gnus-list-range-difference
+ existing (gnus-active group))))))
+ (when (> (car active) 1)
+ (setq unexists (gnus-range-add
+ (cons 1 (1- (car active)))
+ unexists)))
+ (if old-unexists
+ (setcdr old-unexists unexists)
+ (push (cons 'unexist unexists) marks)))
(gnus-info-set-marks info marks t))))
;; Tell Gnus whether there are any \Recent messages in any of
;; the groups.
@@ -1505,6 +1567,14 @@
(gnus-sorted-complement existing new-marks))))
(when ticks
(push (cons (car type) ticks) marks)))
+ (gnus-info-set-marks info marks t))
+ ;; Add vanished to the list of unexisting articles.
+ (when vanished
+ (let* ((old-unexists (assq 'unexist marks))
+ (unexists (gnus-range-add (cdr old-unexists) vanished)))
+ (if old-unexists
+ (setcdr old-unexists unexists)
+ (push (cons 'unexist unexists) marks)))
(gnus-info-set-marks info marks t))))
(defun nnimap-imap-ranges-to-gnus-ranges (irange)
@@ -1642,7 +1712,7 @@
(setq nnimap-status-string "Read-only server")
nil)
-(defvar gnus-refer-thread-use-nnir) ; gnus-sum
+(defvar gnus-refer-thread-use-nnir) ;; gnus-sum.el
(declare-function gnus-fetch-headers "gnus-sum"
(articles &optional limit force-new dependencies))
@@ -1653,7 +1723,7 @@
(setq group (nnimap-decode-gnus-group group)))
(if gnus-refer-thread-use-nnir
(nnir-search-thread header)
- (when (nnimap-possibly-change-group group server)
+ (when (nnimap-change-group group server)
(let* ((cmd (nnimap-make-thread-query header))
(result (with-current-buffer (nnimap-buffer)
(nnimap-command "UID SEARCH %s" cmd))))
@@ -1664,7 +1734,14 @@
(cdr (assoc "SEARCH" (cdr result))))))
nil t))))))
-(defun nnimap-possibly-change-group (group server &optional no-reconnect)
+(defun nnimap-change-group (group &optional server no-reconnect read-only)
+ "Change group to GROUP if non-nil.
+If SERVER is set, check that server is connected, otherwise retry
+to reconnect, unless NO-RECONNECT is set to t. Return nil if
+unsuccessful in connecting.
+If GROUP is nil, return t.
+If READ-ONLY is set, send EXAMINE rather than SELECT to the server.
+Return the server's response to the SELECT or EXAMINE command."
(let ((open-result t))
(when (and server
(not (nnimap-server-opened server)))
@@ -1676,13 +1753,15 @@
t)
(t
(with-current-buffer (nnimap-buffer)
- (if (equal group (nnimap-group nnimap-object))
- t
- (let ((result (nnimap-command "SELECT %S" (utf7-encode group t))))
- (when (car result)
- (setf (nnimap-group nnimap-object) group
- (nnimap-select-result nnimap-object) result)
- result))))))))
+ (let ((result (nnimap-command "%s %S"
+ (if read-only
+ "EXAMINE"
+ "SELECT")
+ (utf7-encode group t))))
+ (when (car result)
+ (setf (nnimap-group nnimap-object) group
+ (nnimap-select-result nnimap-object) result)
+ result)))))))
(defun nnimap-find-connection (buffer)
"Find the connection delivering to BUFFER."
@@ -1718,15 +1797,24 @@
(defvar nnimap-record-commands nil
"If non-nil, log commands to the \"*imap log*\" buffer.")
+(defun nnimap-log-buffer ()
+ (let ((name "*imap log*"))
+ (or (get-buffer name)
+ (with-current-buffer (get-buffer-create name)
+ (when (boundp 'window-point-insertion-type)
+ (make-local-variable 'window-point-insertion-type)
+ (setq window-point-insertion-type t))
+ (current-buffer)))))
+
(defun nnimap-log-command (command)
(when nnimap-record-commands
- (with-current-buffer (get-buffer-create "*imap log*")
+ (with-current-buffer (nnimap-log-buffer)
(goto-char (point-max))
(insert (format-time-string "%H:%M:%S")
- " [" nnimap-address "] "
- (if nnimap-inhibit-logging
- "(inhibited)\n"
- command))))
+ " [" nnimap-address "] "
+ (if nnimap-inhibit-logging
+ "(inhibited)\n"
+ command))))
command)
(defun nnimap-command (&rest args)
@@ -1865,15 +1953,6 @@
(forward-line 1)))
(buffer-substring (point) end))))
-(defun nnimap-get-responses (sequences)
- (let (responses)
- (dolist (sequence sequences)
- (goto-char (point-min))
- (when (re-search-forward (format "^%d " sequence) nil t)
- (push (list sequence (nnimap-parse-response))
- responses)))
- responses))
-
(defvar nnimap-incoming-split-list nil)
(defun nnimap-fetch-inbox (articles)
=== modified file 'lisp/gnus/nnir.el'
--- a/lisp/gnus/nnir.el 2013-05-09 01:40:20 +0000
+++ b/lisp/gnus/nnir.el 2013-07-02 10:38:58 +0000
@@ -288,7 +288,7 @@
(eval-when-compile
(autoload 'nnimap-buffer "nnimap")
(autoload 'nnimap-command "nnimap")
- (autoload 'nnimap-possibly-change-group "nnimap")
+ (autoload 'nnimap-change-group "nnimap")
(autoload 'nnimap-make-thread-query "nnimap")
(autoload 'gnus-registry-action "gnus-registry")
(autoload 'gnus-registry-get-id-key "gnus-registry")
@@ -973,7 +973,7 @@
#'(lambda (group)
(let (artlist)
(condition-case ()
- (when (nnimap-possibly-change-group
+ (when (nnimap-change-group
(gnus-group-short-name group) server)
(with-current-buffer (nnimap-buffer)
(message "Searching %s..." group)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r113257: Merge changes made in Gnus trunk,
Katsumi Yamaoka <=