changeset 110689:42815c76b976

Merge changes made in Gnus trunk. gnus-registry.el: Fix and extend header docs. Move the nnregistry feature check. nnimap.el (nnimap-update-info): Ignore groups that have no UIDNEXT values. nnimap.el: Implement nnimap-request-newgroups. gnus-group.el (gnus-group-completing-read): Return the symbol name, not the value from the collection. nnimap.el: Don't error out on empty non-UIDNEXT groups. nnmail.el (nnmail-article-group): Allow using the fancy split method directly. gnus.el (gnus-continuum-version): Make inactive, since it doesn't really message anything to the user. gnus-msg.el (gnus-summary-resend-message): When resending, don't externalize attachments. gnus.el (gnus-large-newsgroup): Mention gnus-large-ephemeral-newsgroup. gnus-sum.el (gnus-summary-scroll-up): Add more documentation. message.el (message-shorten-references): Comment on the number "21". mm-encode.el (mm-content-transfer-encoding-defaults): Try to make the documentation clearer. ChangeLog: jidanni -> Dan Jacobson. nnmbox.el (nnmbox-read-mbox): Mark buffer for deletion on Gnus exit. gnus-sum.el, gnus-win.el: Change the `h' command to only show the article buffer. gnus-art.el (gnus-summary-save-in-file, gnus-summary-save-in-rmail): Use with-current-buffer instead of gnus-eval-in-buffer-window to avoid popping up frames. gnus-sum.el (gnus-summary-clear-local-variables): Removed. gnus-async.el (gnus-async-delete-prefetched-entry): Remove from hash table, too. gnus-async.el: Try to keep the async hash table size reasonable. nndoc.el (nndoc-type-alist): Do babyl before mime-parts. gnus-start.el (gnus-check-bogus-newsgroups): Say how many groups we're being queried about.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Fri, 01 Oct 2010 23:08:25 +0000
parents f2f31dc6273a
children b1bae334eec9
files doc/misc/gnus.texi lisp/gnus/ChangeLog lisp/gnus/gnus-art.el lisp/gnus/gnus-async.el lisp/gnus/gnus-group.el lisp/gnus/gnus-msg.el lisp/gnus/gnus-registry.el lisp/gnus/gnus-start.el lisp/gnus/gnus-sum.el lisp/gnus/gnus-win.el lisp/gnus/gnus.el lisp/gnus/mailcap.el lisp/gnus/message.el lisp/gnus/mm-encode.el lisp/gnus/nndoc.el lisp/gnus/nnimap.el lisp/gnus/nnmail.el lisp/gnus/nnmbox.el
diffstat 18 files changed, 192 insertions(+), 86 deletions(-) [+]
line wrap: on
line diff
--- a/doc/misc/gnus.texi	Fri Oct 01 22:18:24 2010 +0200
+++ b/doc/misc/gnus.texi	Fri Oct 01 23:08:25 2010 +0000
@@ -9477,6 +9477,14 @@
 corresponding regular expression in @code{gnus-article-banner-alist} is
 used.
 
+For instance:
+
+@lisp
+(setq gnus-article-banner-alist
+      ((googleGroups .
+       "^\n*--~--~---------\\(.+\n\\)+")))
+@end lisp
+
 Regardless of a group, you can hide things like advertisements only when
 the sender of an article has a certain mail address specified in
 @code{gnus-article-address-banner-alist}.
@@ -15102,6 +15110,9 @@
 message.  The function should return a list of group names that it
 thinks should carry this mail message.
 
+This variable can also be a fancy split method.  See @xref{Fancy Mail
+Splitting} for the syntax.
+
 Note that the mail back ends are free to maul the poor, innocent,
 incoming headers all they want to.  They all add @code{Lines} headers;
 some add @code{X-Gnus-Group} headers; most rename the Unix mbox
--- a/lisp/gnus/ChangeLog	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/ChangeLog	Fri Oct 01 23:08:25 2010 +0000
@@ -1,3 +1,81 @@
+2010-10-01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* gnus-start.el (gnus-check-bogus-newsgroups): Say how many groups
+	we're being queried about.  Suggested by Dan Jacobson.
+
+	* nndoc.el (nndoc-type-alist): Do babyl before mime-parts.  Suggested
+	by Jason Eisner.
+
+	* gnus-async.el (gnus-async-delete-prefetched-entry): Remove from hash
+	table, too.  Suggested by Stefan Wiens.
+	(gnus-async-prefetched-article-entry): Use intern-soft to avoid growing
+	the table unnecessary.  Suggested by Stefan Wiens.
+
+	* gnus-sum.el (gnus-summary-clear-local-variables): This is probably no
+	longer needed, and probably doesn't work either, as pointed out by
+	Stefan Wiens.
+	(gnus-summary-exit): Remove call to the clearing function.
+	(gnus-summary-exit-no-update): Ditto.
+
+	* gnus-art.el (gnus-summary-save-in-file): Use with-current-buffer
+	instead of gnus-eval-in-buffer-window to avoid popping up frames.
+	Reported by Stefan Monnier.
+	(gnus-summary-save-in-rmail): Ditto.
+
+	* gnus-sum.el (gnus-summary-select-article-buffer): Show only the
+	article buffer, instead of both the article buffer and the summary
+	buffer.  Sort of suggested by Dan Jacobson.
+
+	* gnus-win.el (gnus-buffer-configuration): Add an only-article spec.
+
+	* nnmbox.el (nnmbox-read-mbox): Mark buffer for deletion on Gnus exit.
+	Suggested by Dan Jacobson.
+
+	* mm-encode.el (mm-content-transfer-encoding-defaults): Try to make the
+	documentation clearer.
+
+	* message.el (message-shorten-references): Comment on the number "21".
+	Suggested by Stefan Monnier.
+
+	* gnus-sum.el (gnus-summary-scroll-up): Add more documentation.
+	Suggested by Dan Jacobson.
+
+	* gnus.el (gnus-large-newsgroup): Mention
+	gnus-large-ephemeral-newsgroup.  Suggested by Dan Jacobson.
+
+	* gnus-msg.el (gnus-summary-resend-message): When resending, don't
+	externalize attachments.  Bug reported by Steve Wen.
+
+	* gnus.el (gnus-continuum-version): Make inactive, since it doesn't
+	really message anything to the user.
+
+	* nnmail.el (nnmail-article-group): Allow using the fancy split method
+	directly.
+
+	* nnimap.el (nnimap-request-group): Low higher than high to signal no
+	messages in empty groups.
+
+2010-10-01  Ted Zlatanov  <tzz@lifelogs.com>
+
+	* nnimap.el (nnimap-request-group): Don't bug out when there's an empty
+	non-UIDNEXT group.
+
+2010-10-01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* gnus-group.el (gnus-group-completing-read): Return the symbol name,
+	not the value from the collection.
+
+	* nnimap.el (nnimap-update-info): Ignore groups that have no UIDNEXT
+	values.  This sometimes happens on some groups that have no info.
+	(nnimap-request-newgroups): New function.
+
+2010-10-01  Teodor Zlatanov  <tzz@lifelogs.com>
+
+	* gnus-registry.el (gnus-registry-install-nnregistry): Move the feature
+	check into `gnus-registry-initialize'.
+	(gnus-registry-initialize): Ditto.
+	Fix and extend header docs.
+
 2010-10-01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
 	* gnus-html.el (gnus-html-prefetch-images): Adjust regexp to avoid
--- a/lisp/gnus/gnus-art.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-art.el	Fri Oct 01 23:08:25 2010 +0000
@@ -3958,7 +3958,7 @@
 		  "Save %s in rmail file" filename
 		  gnus-rmail-save-name gnus-newsgroup-name
 		  gnus-current-headers 'gnus-newsgroup-last-rmail))
-  (gnus-eval-in-buffer-window gnus-save-article-buffer
+  (with-current-buffer gnus-save-article-buffer
     (save-excursion
       (save-restriction
 	(widen)
@@ -3976,7 +3976,7 @@
 		  "Save %s in Unix mail file" filename
 		  gnus-mail-save-name gnus-newsgroup-name
 		  gnus-current-headers 'gnus-newsgroup-last-mail))
-  (gnus-eval-in-buffer-window gnus-save-article-buffer
+  (with-current-buffer gnus-save-article-buffer
     (save-excursion
       (save-restriction
 	(widen)
@@ -3997,7 +3997,7 @@
 		  "Save %s in file" filename
 		  gnus-file-save-name gnus-newsgroup-name
 		  gnus-current-headers 'gnus-newsgroup-last-file))
-  (gnus-eval-in-buffer-window gnus-save-article-buffer
+  (with-current-buffer gnus-save-article-buffer
     (save-excursion
       (save-restriction
 	(widen)
@@ -4029,7 +4029,7 @@
 		  "Save %s body in file" filename
 		  gnus-file-save-name gnus-newsgroup-name
 		  gnus-current-headers 'gnus-newsgroup-last-file))
-  (gnus-eval-in-buffer-window gnus-save-article-buffer
+  (with-current-buffer gnus-save-article-buffer
     (save-excursion
       (save-restriction
 	(widen)
@@ -4108,7 +4108,7 @@
       (if default
 	  (setq command default)
 	(error "A command is required")))
-    (gnus-eval-in-buffer-window save-buffer
+    (with-current-buffer save-buffer
       (save-restriction
 	(widen)
 	(shell-command-on-region (point-min) (point-max) command nil)))
--- a/lisp/gnus/gnus-async.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-async.el	Fri Oct 01 23:08:25 2010 +0000
@@ -316,7 +316,8 @@
     (set-marker (caddr entry) nil))
   (gnus-async-with-semaphore
     (setq gnus-async-article-alist
-	  (delq entry gnus-async-article-alist))))
+	  (delq entry gnus-async-article-alist))
+    (unintern (car entry) gnus-async-hashtb)))
 
 (defun gnus-async-prefetch-remove-group (group)
   "Remove all articles belonging to GROUP from the prefetch buffer."
@@ -332,8 +333,8 @@
   "Return the entry for ARTICLE in GROUP if it has been prefetched."
   (let ((entry (save-excursion
 		 (gnus-async-set-buffer)
-		 (assq (intern (format "%s-%d" group article)
-			       gnus-async-hashtb)
+		 (assq (intern-soft (format "%s-%d" group article)
+				    gnus-async-hashtb)
 		       gnus-async-article-alist))))
     ;; Perhaps something has emptied the buffer?
     (if (and entry
--- a/lisp/gnus/gnus-group.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-group.el	Fri Oct 01 23:08:25 2010 +0000
@@ -2170,21 +2170,21 @@
 The arguments are the same as `completing-read' except that COLLECTION
 and HIST default to `gnus-active-hashtb' and `gnus-group-history'
 respectively if they are omitted."
-  (let* ((choices (mapcar (lambda (symbol)
+  (let* ((collection (or collection (or gnus-active-hashtb [0])))
+	 (choices (mapcar (lambda (symbol)
                             (let ((group (symbol-name symbol)))
                               (if (string-match "[^\000-\177]" group)
                                   (gnus-group-decoded-name group)
                                 group)))
-                          (remove-if-not
-                           'symbolp
-                           (or collection (or gnus-active-hashtb [0])))))
+                          (remove-if-not 'symbolp collection)))
          (group
           (gnus-completing-read (or prompt "Group") choices
                                 require-match initial-input
                                 (or hist 'gnus-group-history)
                                 def)))
-    (or (symbol-value (intern-soft group collection))
-        (mm-encode-coding-string group (gnus-group-name-charset nil group)))))
+    (if (symbol-value (intern-soft group collection))
+	group
+      (mm-encode-coding-string group (gnus-group-name-charset nil group)))))
 
 ;;;###autoload
 (defun gnus-fetch-group (group &optional articles)
--- a/lisp/gnus/gnus-msg.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-msg.el	Fri Oct 01 23:08:25 2010 +0000
@@ -1265,7 +1265,8 @@
   (dolist (article (gnus-summary-work-articles n))
     (gnus-summary-select-article nil nil nil article)
     (with-current-buffer gnus-original-article-buffer
-      (message-resend address))
+      (let ((gnus-gcc-externalize-attachments nil))
+	(message-resend address)))
     (gnus-summary-mark-article-as-forwarded article)))
 
 ;; From: Matthieu Moy <Matthieu.Moy@imag.fr>
--- a/lisp/gnus/gnus-registry.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-registry.el	Fri Oct 01 23:08:25 2010 +0000
@@ -36,10 +36,12 @@
 
 ;; Put this in your startup file (~/.gnus.el for instance)
 
+;; (require 'nnregistry) ;; optional, or see below (automatically calls `gnus-registry-install-nnregistry' when `gnus-registry-initialize' is called)
 ;; (setq gnus-registry-max-entries 2500
 ;;       gnus-registry-use-long-group-names t)
 
 ;; (gnus-registry-initialize)
+;; (gnus-registry-install-nnregistry) ;; optional, or see above (loading nnregistry makes it unnecessary)
 
 ;; Then use this in your fancy-split:
 
@@ -1129,7 +1131,8 @@
   (setq gnus-registry-install t)	; in case it was 'ask or nil
   (gnus-registry-install-hooks)
   (gnus-registry-install-shortcuts)
-  (gnus-registry-install-nnregistry)
+  (when (featurep 'nnregistry)
+    (gnus-registry-install-nnregistry))
   (gnus-registry-read))
 
 ;;;###autoload
@@ -1150,14 +1153,13 @@
 (defun gnus-registry-install-nnregistry ()
   "Install the nnregistry refer method in `gnus-refer-article-method'."
   (interactive)
-  (when (featurep 'nnregistry)
-    (setq gnus-refer-article-method
-          (delete-dups
-           (append
-            (if (listp gnus-refer-article-method)
-                gnus-refer-article-method
-              (list gnus-refer-article-method))
-            (list 'nnregistry))))))
+  (setq gnus-refer-article-method
+        (delete-dups
+         (append
+          (if (listp gnus-refer-article-method)
+              gnus-refer-article-method
+            (list gnus-refer-article-method))
+          (list 'nnregistry)))))
 
 (defun gnus-registry-unload-hook ()
   "Uninstall the registry hooks."
--- a/lisp/gnus/gnus-start.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-start.el	Fri Oct 01 23:08:25 2010 +0000
@@ -1465,7 +1465,7 @@
 	  (push group bogus)))
       (if confirm
 	  (map-y-or-n-p
-	   "Remove bogus group %s? "
+	   (format "Remove bogus group %%s (of %d groups)? " (length bogus))
 	   (lambda (group)
 	     ;; Remove all bogus subscribed groups by first killing them, and
 	     ;; then removing them from the list of killed groups.
--- a/lisp/gnus/gnus-sum.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-sum.el	Fri Oct 01 23:08:25 2010 +0000
@@ -3109,16 +3109,6 @@
 	;; Simple nil-valued local variable.
 	(set (make-local-variable local) nil)))))
 
-(defun gnus-summary-clear-local-variables ()
-  (let ((locals gnus-summary-local-variables))
-    (while locals
-      (if (consp (car locals))
-	  (and (symbolp (caar locals))
-	       (set (caar locals) nil))
-	(and (symbolp (car locals))
-	     (set (car locals) nil)))
-      (setq locals (cdr locals)))))
-
 ;; Summary data functions.
 
 (defmacro gnus-data-number (data)
@@ -6939,12 +6929,12 @@
 ;; Various summary commands
 
 (defun gnus-summary-select-article-buffer ()
-  "Reconfigure windows to show article buffer."
+  "Reconfigure windows to show the article buffer."
   (interactive)
   (if (not (gnus-buffer-live-p gnus-article-buffer))
       (error "There is no article buffer for this summary buffer")
-    (gnus-configure-windows 'article)
-    (select-window (get-buffer-window gnus-article-buffer))))
+    (select-window (get-buffer-window gnus-article-buffer))
+    (gnus-configure-windows 'only-article t)))
 
 (defun gnus-summary-universal-argument (arg)
   "Perform any operation on all articles that are process/prefixed."
@@ -7129,13 +7119,6 @@
 	  (progn
 	    (gnus-deaden-summary)
 	    (setq mode nil))
-	;; We set all buffer-local variables to nil.  It is unclear why
-	;; this is needed, but if we don't, buffer-local variables are
-	;; not garbage-collected, it seems.  This would the lead to en
-	;; ever-growing Emacs.
-	(gnus-summary-clear-local-variables)
-	(let ((gnus-summary-local-variables gnus-newsgroup-variables))
-	  (gnus-summary-clear-local-variables))
 	(when (get-buffer gnus-article-buffer)
 	  (bury-buffer gnus-article-buffer))
 	;; Return to group mode buffer.
@@ -7194,9 +7177,6 @@
       (if (not gnus-kill-summary-on-exit)
 	  (gnus-deaden-summary)
 	(gnus-close-group group)
-	(gnus-summary-clear-local-variables)
-	(let ((gnus-summary-local-variables gnus-newsgroup-variables))
-	  (gnus-summary-clear-local-variables))
 	(gnus-kill-buffer gnus-summary-buffer))
       (unless gnus-single-article-buffer
 	(setq gnus-article-current nil))
@@ -7844,7 +7824,8 @@
 
 (defun gnus-summary-scroll-up (lines)
   "Scroll up (or down) one line current article.
-Argument LINES specifies lines to be scrolled up (or down if negative)."
+Argument LINES specifies lines to be scrolled up (or down if negative).
+If no article is selected, then the current article will be selected first."
   (interactive "p")
   (gnus-configure-windows 'article)
   (gnus-summary-show-thread)
@@ -7860,7 +7841,8 @@
 
 (defun gnus-summary-scroll-down (lines)
   "Scroll down (or up) one line current article.
-Argument LINES specifies lines to be scrolled down (or up if negative)."
+Argument LINES specifies lines to be scrolled down (or up if negative).
+If no article is selected, then the current article will be selected first."
   (interactive "p")
   (gnus-summary-scroll-up (- lines)))
 
--- a/lisp/gnus/gnus-win.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus-win.el	Fri Oct 01 23:08:25 2010 +0000
@@ -107,6 +107,9 @@
      (vertical 1.0
 	       (summary 0.25)
 	       (faq 1.0 point)))
+    (only-article
+     (vertical 1.0
+	       (article 1.0 point)))
     (edit-article
      (vertical 1.0
 	       (article 1.0 point)))
--- a/lisp/gnus/gnus.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/gnus.el	Fri Oct 01 23:08:25 2010 +0000
@@ -1491,7 +1491,9 @@
   "*The number of articles which indicates a large newsgroup.
 If the number of articles in a newsgroup is greater than this value,
 confirmation is required for selecting the newsgroup.
-If it is nil, no confirmation is required."
+If it is nil, no confirmation is required.
+
+Also see `gnus-large-ephemeral-newsgroup'."
   :group 'gnus-group-select
   :type '(choice (const :tag "No limit" nil)
 		 integer))
@@ -3206,7 +3208,6 @@
 
 (defun gnus-continuum-version (&optional version)
   "Return VERSION as a floating point number."
-  (interactive)
   (unless version
     (setq version gnus-version))
   (when (or (string-match "^\\([^ ]+\\)? ?Gnus v?\\([0-9.]+\\)$" version)
--- a/lisp/gnus/mailcap.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/mailcap.el	Fri Oct 01 23:08:25 2010 +0000
@@ -812,7 +812,10 @@
 ;;;
 
 (defvar mailcap-mime-extensions
-  '((""        . "text/plain")
+  '((""       . "text/plain")
+    (".1"     . "text/plain")  ;; Manual pages
+    (".3"     . "text/plain")
+    (".8"     . "text/plain")
     (".abs"   . "audio/x-mpeg")
     (".aif"   . "audio/aiff")
     (".aifc"  . "audio/aiff")
@@ -828,6 +831,7 @@
     (".css"   . "text/css")
     (".dvi"   . "application/x-dvi")
     (".diff"  . "text/x-patch")
+    (".dpatch". "test/x-patch")
     (".el"    . "application/emacs-lisp")
     (".eps"   . "application/postscript")
     (".etx"   . "text/x-setext")
@@ -869,6 +873,7 @@
     (".pict"  . "image/pict")
     (".png"   . "image/png")
     (".pnm"   . "image/x-portable-anymap")
+    (".pod"   . "text/plain")
     (".ppm"   . "image/portable-pixmap")
     (".ps"    . "application/postscript")
     (".qt"    . "video/quicktime")
--- a/lisp/gnus/message.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/message.el	Fri Oct 01 23:08:25 2010 +0000
@@ -6049,6 +6049,7 @@
 When sending via news, also check that the REFERENCES are less
 than 988 characters long, and if they are not, trim them until
 they are."
+  ;; 21 is the number suggested by USEAGE.
   (let ((maxcount 21)
 	(count 0)
 	(cut 2)
--- a/lisp/gnus/mm-encode.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/mm-encode.el	Fri Oct 01 23:08:25 2010 +0000
@@ -42,15 +42,8 @@
 If the encoding is `qp-or-base64', then either quoted-printable
 or base64 will be used, depending on what is more efficient.
 
-`qp-or-base64' has another effect.  It will fold long lines so that
-MIME parts may not be broken by MTA.  So do `quoted-printable' and
-`base64'.
-
-Note: It affects body encoding only when a part is a raw forwarded
-message (which will be made by `gnus-summary-mail-forward' with the
-arg 2 for example) or is neither the text/* type nor the message/*
-type.  Even though in those cases, you can use the `encoding' MML tag
-to specify encoding of non-ASCII MIME parts."
+This list is only consulted when encoding MIME parts in the
+bodies -- not for the regular non-MIME-ish messages."
   :type '(repeat (list (regexp :tag "MIME type")
 		       (choice :tag "encoding"
 			       (const 7bit)
--- a/lisp/gnus/nndoc.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/nndoc.el	Fri Oct 01 23:08:25 2010 +0000
@@ -74,14 +74,14 @@
     (mbox
      (article-begin-function . nndoc-mbox-article-begin)
      (body-end-function . nndoc-mbox-body-end))
-    (mime-parts
-     (generate-head-function . nndoc-generate-mime-parts-head)
-     (article-transform-function . nndoc-transform-mime-parts))
     (babyl
      (article-begin . "\^_\^L *\n")
      (body-end . "\^_")
      (body-begin-function . nndoc-babyl-body-begin)
      (head-begin-function . nndoc-babyl-head-begin))
+    (mime-parts
+     (generate-head-function . nndoc-generate-mime-parts-head)
+     (article-transform-function . nndoc-transform-mime-parts))
     (exim-bounce
      (article-begin . "^------ This is a copy of the message, including all the headers. ------\n\n")
      (body-end-function . nndoc-exim-bounce-body-end-function))
--- a/lisp/gnus/nnimap.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/nnimap.el	Fri Oct 01 23:08:25 2010 +0000
@@ -623,10 +623,11 @@
 		(nnimap-update-infos marks (list info)))
 	      (goto-char (point-max))
 	      (let ((uidnext (nth 5 (car marks))))
-		(setq high (if uidnext
-			       (1- uidnext)
-			     (nth 3 (car marks)))
-		      low (or (nth 4 (car marks)) uidnext)))))
+		(setq high (or (if uidnext
+                                   (1- uidnext)
+                                 (nth 3 (car marks)))
+                               0)
+		      low (or (nth 4 (car marks)) uidnext 1)))))
 	  (erase-buffer)
 	  (insert
 	   (format
@@ -912,6 +913,16 @@
 				  (or highest exists)))))))))
 	t))))
 
+(deffoo nnimap-request-newgroups (date &optional server)
+  (nnimap-possibly-change-group nil server)
+  (with-current-buffer nntp-server-buffer
+    (erase-buffer)
+    (dolist (group (with-current-buffer (nnimap-buffer)
+		     (nnimap-get-groups)))
+      (unless (assoc group nnimap-current-infos)
+	;; Insert dummy numbers here -- they don't matter.
+	(insert (format "%S 0 1 y\n" group))))))
+
 (deffoo nnimap-retrieve-group-data-early (server infos)
   (when (nnimap-possibly-change-group nil server)
     (with-current-buffer (nnimap-buffer)
@@ -990,7 +1001,9 @@
       (nnimap-update-info info (cdr (assoc group flags))))))
 
 (defun nnimap-update-info (info marks)
-  (when marks
+  (when (and marks
+	     ;; Ignore groups with no UIDNEXT values.
+	     (nth 4 marks))
     (destructuring-bind (existing flags high low uidnext start-article
 				  permanent-flags) marks
       (let ((group (gnus-info-group info))
--- a/lisp/gnus/nnmail.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/nnmail.el	Fri Oct 01 23:08:25 2010 +0000
@@ -104,7 +104,9 @@
 
 The last element should always have \"\" as the regexp.
 
-This variable can also have a function as its value."
+This variable can also have a function as its value, and it can
+also have a fancy split method as its value.  See
+`nnmail-split-fancy' for an explanation of that syntax."
   :group 'nnmail-split
   :type '(choice (repeat :tag "Alist" (group (string :tag "Name")
 					     (choice regexp function)))
@@ -1145,21 +1147,33 @@
 	(run-hooks 'nnmail-split-hook)
 	(when (setq nnmail-split-tracing trace)
 	  (setq nnmail-split-trace nil))
-	(if (and (symbolp nnmail-split-methods)
-		 (fboundp nnmail-split-methods))
-	    (let ((split
-		   (condition-case error-info
-		       ;; `nnmail-split-methods' is a function, so we
-		       ;; just call this function here and use the
-		       ;; result.
-		       (or (funcall nnmail-split-methods)
-			   (and (not nnmail-inhibit-default-split-group)
-				'("bogus")))
-		     (error
-		      (nnheader-message
-		       5 "Error in `nnmail-split-methods'; using `bogus' mail group: %S" error-info)
-		      (sit-for 1)
-		      '("bogus")))))
+	(if (or (and (symbolp nnmail-split-methods)
+		     (fboundp nnmail-split-methods))
+		(and (listp nnmail-split-methods)
+		     ;; Not a regular split method, so it has to be a
+		     ;; fancy one.
+		     (not (let ((top-element (car-safe nnmail-split-methods)))
+			    (and (= 2 (length top-element))
+				 (stringp (nth 0 top-element))
+				 (stringp (nth 1 top-element)))))))
+	    (let* ((method-function
+		    (if (and (symbolp nnmail-split-methods)
+			     (fboundp nnmail-split-methods))
+			nnmail-split-methods
+		      'nnmail-split-fancy))
+		   (split
+		    (condition-case error-info
+			;; `nnmail-split-methods' is a function, so we
+			;; just call this function here and use the
+			;; result.
+			(or (funcall method-function)
+			    (and (not nnmail-inhibit-default-split-group)
+				 '("bogus")))
+		      (error
+		       (nnheader-message
+			5 "Error in `nnmail-split-methods'; using `bogus' mail group: %S" error-info)
+		       (sit-for 1)
+		       '("bogus")))))
 	      (setq split (mm-delete-duplicates split))
 	      ;; The article may be "cross-posted" to `junk'.  What
 	      ;; to do?  Just remove the `junk' spec.  Don't really
--- a/lisp/gnus/nnmbox.el	Fri Oct 01 22:18:24 2010 +0200
+++ b/lisp/gnus/nnmbox.el	Fri Oct 01 23:08:25 2010 +0000
@@ -640,6 +640,7 @@
 			     nnmbox-mbox-file t t))))
 	(mm-enable-multibyte)
 	(buffer-disable-undo)
+	(gnus-add-buffer)
 
 	;; Go through the group alist and compare against the mbox file.
 	(while alist