Don't download pictures the user hasn't requested.
[gnus] / lisp / gnus.el
index 211a22b..cd002a3 100644 (file)
@@ -1,7 +1,8 @@
 ;;; gnus.el --- a newsreader for GNU Emacs
 
 ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, 1998,
-;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;;     Lars Magne Ingebrigtsen <larsi@gnus.org>
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,9 +21,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 
 (eval '(run-hooks 'gnus-load-hook))
 
+;; For Emacs < 22.2.
+(eval-and-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+
 (eval-when-compile (require 'cl))
 (require 'wid-edit)
 (require 'mm-util)
@@ -43,6 +46,8 @@
 (defvar gnus-spam-autodetect-methods)
 (defvar gnus-spam-newsgroup-contents)
 (defvar gnus-spam-process-destinations)
+(defvar gnus-spam-resend-to)
+(defvar gnus-ham-resend-to)
 (defvar gnus-spam-process-newsgroups)
 
 
@@ -289,7 +294,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.7"
+(defconst gnus-version-number "0.11"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "No Gnus v%s" gnus-version-number)
@@ -313,11 +318,13 @@ be set in `.emacs' instead."
 (unless (featurep 'gnus-xmas)
   (defalias 'gnus-make-overlay 'make-overlay)
   (defalias 'gnus-delete-overlay 'delete-overlay)
+  (defalias 'gnus-overlay-get 'overlay-get)
   (defalias 'gnus-overlay-put 'overlay-put)
   (defalias 'gnus-move-overlay 'move-overlay)
   (defalias 'gnus-overlay-buffer 'overlay-buffer)
   (defalias 'gnus-overlay-start 'overlay-start)
   (defalias 'gnus-overlay-end 'overlay-end)
+  (defalias 'gnus-overlays-in 'overlays-in)
   (defalias 'gnus-extent-detached-p 'ignore)
   (defalias 'gnus-extent-start-open 'ignore)
   (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
@@ -373,6 +380,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-1-face 'face-alias 'gnus-group-news-1)
+(put 'gnus-group-news-1-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-1-empty
   '((((class color)
@@ -387,6 +395,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-1-empty-face 'face-alias 'gnus-group-news-1-empty)
+(put 'gnus-group-news-1-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-2
   '((((class color)
@@ -401,6 +410,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-2-face 'face-alias 'gnus-group-news-2)
+(put 'gnus-group-news-2-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-2-empty
   '((((class color)
@@ -415,6 +425,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-2-empty-face 'face-alias 'gnus-group-news-2-empty)
+(put 'gnus-group-news-2-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-3
   '((((class color)
@@ -429,6 +440,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-3-face 'face-alias 'gnus-group-news-3)
+(put 'gnus-group-news-3-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-3-empty
   '((((class color)
@@ -443,6 +455,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-3-empty-face 'face-alias 'gnus-group-news-3-empty)
+(put 'gnus-group-news-3-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-4
   '((((class color)
@@ -457,6 +470,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-4-face 'face-alias 'gnus-group-news-4)
+(put 'gnus-group-news-4-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-4-empty
   '((((class color)
@@ -471,6 +485,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-4-empty-face 'face-alias 'gnus-group-news-4-empty)
+(put 'gnus-group-news-4-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-5
   '((((class color)
@@ -485,6 +500,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-5-face 'face-alias 'gnus-group-news-5)
+(put 'gnus-group-news-5-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-5-empty
   '((((class color)
@@ -499,6 +515,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-5-empty-face 'face-alias 'gnus-group-news-5-empty)
+(put 'gnus-group-news-5-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-6
   '((((class color)
@@ -513,6 +530,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-6-face 'face-alias 'gnus-group-news-6)
+(put 'gnus-group-news-6-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-6-empty
   '((((class color)
@@ -527,6 +545,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-6-empty-face 'face-alias 'gnus-group-news-6-empty)
+(put 'gnus-group-news-6-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-low
   '((((class color)
@@ -541,6 +560,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-low-face 'face-alias 'gnus-group-news-low)
+(put 'gnus-group-news-low-face 'obsolete-face "22.1")
 
 (defface gnus-group-news-low-empty
   '((((class color)
@@ -555,6 +575,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-news-low-empty-face 'face-alias 'gnus-group-news-low-empty)
+(put 'gnus-group-news-low-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-1
   '((((class color)
@@ -569,6 +590,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-1-face 'face-alias 'gnus-group-mail-1)
+(put 'gnus-group-mail-1-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-1-empty
   '((((class color)
@@ -583,6 +605,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-1-empty-face 'face-alias 'gnus-group-mail-1-empty)
+(put 'gnus-group-mail-1-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-2
   '((((class color)
@@ -597,6 +620,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-2-face 'face-alias 'gnus-group-mail-2)
+(put 'gnus-group-mail-2-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-2-empty
   '((((class color)
@@ -611,6 +635,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-2-empty-face 'face-alias 'gnus-group-mail-2-empty)
+(put 'gnus-group-mail-2-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-3
   '((((class color)
@@ -625,6 +650,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-3-face 'face-alias 'gnus-group-mail-3)
+(put 'gnus-group-mail-3-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-3-empty
   '((((class color)
@@ -639,6 +665,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-3-empty-face 'face-alias 'gnus-group-mail-3-empty)
+(put 'gnus-group-mail-3-empty-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-low
   '((((class color)
@@ -653,6 +680,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-low-face 'face-alias 'gnus-group-mail-low)
+(put 'gnus-group-mail-low-face 'obsolete-face "22.1")
 
 (defface gnus-group-mail-low-empty
   '((((class color)
@@ -667,6 +695,7 @@ be set in `.emacs' instead."
   :group 'gnus-group)
 ;; backward-compatibility alias
 (put 'gnus-group-mail-low-empty-face 'face-alias 'gnus-group-mail-low-empty)
+(put 'gnus-group-mail-low-empty-face 'obsolete-face "22.1")
 
 ;; Summary mode faces.
 
@@ -675,6 +704,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-selected-face 'face-alias 'gnus-summary-selected)
+(put 'gnus-summary-selected-face 'obsolete-face "22.1")
 
 (defface gnus-summary-cancelled
   '((((class color))
@@ -683,6 +713,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-cancelled-face 'face-alias 'gnus-summary-cancelled)
+(put 'gnus-summary-cancelled-face 'obsolete-face "22.1")
 
 (defface gnus-summary-high-ticked
   '((((class color)
@@ -697,6 +728,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-high-ticked-face 'face-alias 'gnus-summary-high-ticked)
+(put 'gnus-summary-high-ticked-face 'obsolete-face "22.1")
 
 (defface gnus-summary-low-ticked
   '((((class color)
@@ -711,6 +743,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-low-ticked-face 'face-alias 'gnus-summary-low-ticked)
+(put 'gnus-summary-low-ticked-face 'obsolete-face "22.1")
 
 (defface gnus-summary-normal-ticked
   '((((class color)
@@ -725,6 +758,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-normal-ticked-face 'face-alias 'gnus-summary-normal-ticked)
+(put 'gnus-summary-normal-ticked-face 'obsolete-face "22.1")
 
 (defface gnus-summary-high-ancient
   '((((class color)
@@ -739,6 +773,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-high-ancient-face 'face-alias 'gnus-summary-high-ancient)
+(put 'gnus-summary-high-ancient-face 'obsolete-face "22.1")
 
 (defface gnus-summary-low-ancient
   '((((class color)
@@ -753,6 +788,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-low-ancient-face 'face-alias 'gnus-summary-low-ancient)
+(put 'gnus-summary-low-ancient-face 'obsolete-face "22.1")
 
 (defface gnus-summary-normal-ancient
   '((((class color)
@@ -767,6 +803,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-normal-ancient-face 'face-alias 'gnus-summary-normal-ancient)
+(put 'gnus-summary-normal-ancient-face 'obsolete-face "22.1")
 
 (defface gnus-summary-high-undownloaded
    '((((class color)
@@ -779,6 +816,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-high-undownloaded-face 'face-alias 'gnus-summary-high-undownloaded)
+(put 'gnus-summary-high-undownloaded-face 'obsolete-face "22.1")
 
 (defface gnus-summary-low-undownloaded
    '((((class color)
@@ -791,6 +829,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-low-undownloaded-face 'face-alias 'gnus-summary-low-undownloaded)
+(put 'gnus-summary-low-undownloaded-face 'obsolete-face "22.1")
 
 (defface gnus-summary-normal-undownloaded
    '((((class color)
@@ -803,6 +842,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-normal-undownloaded-face 'face-alias 'gnus-summary-normal-undownloaded)
+(put 'gnus-summary-normal-undownloaded-face 'obsolete-face "22.1")
 
 (defface gnus-summary-high-unread
   '((t
@@ -811,6 +851,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-high-unread-face 'face-alias 'gnus-summary-high-unread)
+(put 'gnus-summary-high-unread-face 'obsolete-face "22.1")
 
 (defface gnus-summary-low-unread
   '((t
@@ -819,6 +860,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-low-unread-face 'face-alias 'gnus-summary-low-unread)
+(put 'gnus-summary-low-unread-face 'obsolete-face "22.1")
 
 (defface gnus-summary-normal-unread
   '((t
@@ -827,6 +869,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-normal-unread-face 'face-alias 'gnus-summary-normal-unread)
+(put 'gnus-summary-normal-unread-face 'obsolete-face "22.1")
 
 (defface gnus-summary-high-read
   '((((class color)
@@ -843,6 +886,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-high-read-face 'face-alias 'gnus-summary-high-read)
+(put 'gnus-summary-high-read-face 'obsolete-face "22.1")
 
 (defface gnus-summary-low-read
   '((((class color)
@@ -859,6 +903,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-low-read-face 'face-alias 'gnus-summary-low-read)
+(put 'gnus-summary-low-read-face 'obsolete-face "22.1")
 
 (defface gnus-summary-normal-read
   '((((class color)
@@ -873,6 +918,7 @@ be set in `.emacs' instead."
   :group 'gnus-summary)
 ;; backward-compatibility alias
 (put 'gnus-summary-normal-read-face 'face-alias 'gnus-summary-normal-read)
+(put 'gnus-summary-normal-read-face 'obsolete-face "22.1")
 
 
 ;;;
@@ -913,8 +959,7 @@ be set in `.emacs' instead."
 
 (defvar gnus-group-buffer "*Group*")
 
-(eval-and-compile
-  (autoload 'gnus-play-jingle "gnus-audio"))
+(autoload 'gnus-play-jingle "gnus-audio")
 
 (defface gnus-splash
   '((((class color)
@@ -929,6 +974,7 @@ be set in `.emacs' instead."
   :group 'gnus-start)
 ;; backward-compatibility alias
 (put 'gnus-splash-face 'face-alias 'gnus-splash)
+(put 'gnus-splash-face 'obsolete-face "22.1")
 
 (defun gnus-splash ()
   (save-excursion
@@ -989,6 +1035,8 @@ be set in `.emacs' instead."
   (cdr (assq gnus-logo-color-style gnus-logo-color-alist))
   "Colors used for the Gnus logo.")
 
+(declare-function image-size "image.c" (spec &optional pixels frame))
+
 (defun gnus-group-startup-message (&optional x y)
   "Insert startup message in current buffer."
   ;; Insert the message.
@@ -997,6 +1045,11 @@ be set in `.emacs' instead."
    ((and
      (fboundp 'find-image)
      (display-graphic-p)
+     ;; Make sure the library defining `image-load-path' is loaded
+     ;; (`find-image' is autoloaded) (and discard the result).  Else, we may
+     ;; get "defvar ignored because image-load-path is let-bound" when calling
+     ;; `find-image' below.
+     (or (find-image '(nil (:type xpm :file "gnus.xpm"))) t)
      (let* ((data-directory (nnheader-find-etc-directory "images/gnus"))
            (image-load-path (cond (data-directory
                                    (list data-directory))
@@ -1004,7 +1057,9 @@ be set in `.emacs' instead."
                                    (symbol-value 'image-load-path))
                                   (t load-path)))
            (image (find-image
-                   `((:type xpm :file "gnus.xpm"
+                   `((:type svg :file "gnus.svg")
+                     (:type png :file "gnus.png")
+                     (:type xpm :file "gnus.xpm"
                             :color-symbols
                             (("thing" . ,(car gnus-logo-colors))
                              ("shadow" . ,(cadr gnus-logo-colors))
@@ -1309,7 +1364,7 @@ updated if the value of this variable is nil, even if you change the
 value of `gnus-message-archive-method' afterward.  If you want the
 saved \"archive\" method to be updated whenever you change the value of
 `gnus-message-archive-method', set this variable to a non-nil value."
-  :version "23.0" ;; No Gnus
+  :version "23.1" ;; No Gnus
   :group 'gnus-server
   :group 'gnus-message
   :type 'boolean)
@@ -1480,6 +1535,7 @@ When FORM is evaluated `name' is bound to the name of the group."
   :version "22.1"
   :group 'gnus-group-various
   :type '(repeat (cons (string :tag "Hierarchy") (sexp :tag "Form"))))
+(put 'gnus-group-charter-alist 'risky-local-variable t)
 
 (defcustom gnus-group-fetch-control-use-browse-url nil
   "*Non-nil means that control messages are displayed using `browse-url'.
@@ -1515,18 +1571,7 @@ If it is nil, no confirmation is required."
   :type '(choice (const :tag "No limit" nil)
                 integer))
 
-(defcustom gnus-maximum-newsgroup nil
-  "The maximum number of articles a newsgroup.
-If this is a number, old articles in a newsgroup exceeding this number
-are silently ignored.  If it is nil, no article is ignored.  Note that
-setting this variable to a number might prevent you from reading very
-old articles."
-  :group 'gnus-group-select
-  :version "22.2"
-  :type '(choice (const :tag "No limit" nil)
-                integer))
-
-(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix)))
+(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v)))
   "*Non-nil means that the default name of a file to save articles in is the group name.
 If it's nil, the directory form of the group name is used instead.
 
@@ -1700,7 +1745,6 @@ slower."
     ("nnfolder" mail respool address)
     ("nngateway" post-mail address prompt-address physical-address)
     ("nnweb" none)
-    ("nngoogle" post)
     ("nnslashdot" post)
     ("nnultimate" none)
     ("nnrss" none)
@@ -2799,9 +2843,6 @@ gnus-registry.el will populate this if it's loaded.")
 
 (defvar gnus-reffed-article-number nil)
 
-;;; Let the byte-compiler know that we know about this variable.
-(defvar rmail-default-rmail-file)
-
 (defvar gnus-dead-summary nil)
 
 (defvar gnus-invalid-group-regexp "[: `'\"/]\\|^$"
@@ -2817,7 +2858,7 @@ gnus-registry.el will populate this if it's loaded.")
 
   ;; This little mapcar goes through the list below and marks the
   ;; symbols in question as autoloaded functions.
-  (mapcar
+  (mapc
    (lambda (package)
      (let ((interactive (nth 1 (memq ':interactive package))))
        (mapcar
@@ -2840,10 +2881,14 @@ gnus-registry.el will populate this if it's loaded.")
      ("babel" babel-as-string)
      ("nnmail" nnmail-split-fancy nnmail-article-group)
      ("nnvirtual" nnvirtual-catchup-group nnvirtual-convert-headers)
-     ("rmailout" rmail-output rmail-output-to-rmail-file)
-     ("rmail" rmail-insert-rmail-file-header rmail-count-new-messages
-      rmail-show-message rmail-summary-exists
-      rmail-select-summary rmail-update-summary)
+     ;; This is only used in message.el, which has an autoload.
+     ("rmailout" rmail-output)
+     ;; Next two used in gnus-util, which has autoloads, and contrib/sendmail.
+     ("rmail" rmail-count-new-messages rmail-show-message
+      ;; Next two only used in gnus-util.
+      rmail-summary-exists rmail-select-summary)
+     ;; Only used in gnus-util, which has an autoload.
+     ("rmailsum" rmail-update-summary)
      ("gnus-audio" :interactive t gnus-audio-play)
      ("gnus-xmas" gnus-xmas-splash)
      ("gnus-soup" :interactive t
@@ -2968,7 +3013,7 @@ gnus-registry.el will populate this if it's loaded.")
       gnus-article-hide-pem gnus-article-hide-signature
       gnus-article-strip-leading-blank-lines gnus-article-date-local
       gnus-article-date-original gnus-article-date-lapsed
-;;      gnus-article-show-all-headers
+      ;;gnus-article-show-all-headers
       gnus-article-edit-mode gnus-article-edit-article
       gnus-article-edit-done gnus-article-decode-encoded-words
       gnus-start-date-timer gnus-stop-date-timer
@@ -3529,15 +3574,16 @@ that that variable is buffer-local to the summary buffers."
                                   (nth 1 method))))
       method)))
 
-(defsubst gnus-method-to-server (method)
+(defsubst gnus-method-to-server (method &optional nocache)
   (catch 'server-name
     (setq method (or method gnus-select-method))
 
     ;; Perhaps it is already in the cache.
-    (mapc (lambda (name-method)
-           (if (equal (cdr name-method) method)
-               (throw 'server-name (car name-method))))
-         gnus-server-method-cache)
+    (unless nocache
+      (mapc (lambda (name-method)
+             (if (equal (cdr name-method) method)
+                 (throw 'server-name (car name-method))))
+           gnus-server-method-cache))
 
     (mapc
      (lambda (server-alist)
@@ -3591,15 +3637,14 @@ that that variable is buffer-local to the summary buffers."
              ;; of every method.  As a side-effect, loads the
              ;; gnus-server-method-cache so this only happens once,
              ;; if at all.
-             (let (match)
-               (mapcar
-                (lambda (info)
-                  (let ((info-method (gnus-info-method info)))
-                    (unless (stringp info-method)
-                      (let ((info-server (gnus-method-to-server info-method)))
-                        (when (equal server info-server)
-                          (setq match info-method))))))
-                (cdr gnus-newsrc-alist))
+             (let ((alist (cdr gnus-newsrc-alist))
+                   method match)
+               (while alist
+                 (setq method (gnus-info-method (pop alist)))
+                 (when (and (not (stringp method))
+                            (equal server (gnus-method-to-server method)))
+                   (setq match method
+                         alist nil)))
                match))))
        (when result
          (push (cons server result) gnus-server-method-cache))
@@ -3744,6 +3789,8 @@ server is native)."
   "Return the prefix of the current group name."
   (< 0 (length (gnus-group-real-prefix group))))
 
+(declare-function gnus-group-decoded-name "gnus-group" (string))
+
 (defun gnus-summary-buffer-name (group)
   "Return the summary buffer name of GROUP."
   (concat "*Summary " (gnus-group-decoded-name group) "*"))
@@ -4263,14 +4310,16 @@ Allow completion over sensible values."
 
 ;;; Agent functions
 
-(defun gnus-agent-method-p (method)
+(defun gnus-agent-method-p (method-or-server)
   "Say whether METHOD is covered by the agent."
-  (or (eq (car gnus-agent-method-p-cache) method)
-      (setq gnus-agent-method-p-cache
-           (cons method
-                 (member (if (stringp method)
-                             method
-                           (gnus-method-to-server method)) gnus-agent-covered-methods))))
+  (or (eq (car gnus-agent-method-p-cache) method-or-server)
+      (let* ((method (if (stringp method-or-server)
+                        (gnus-server-to-method method-or-server)
+                      method-or-server))
+            (server (gnus-method-to-server method t)))
+       (setq gnus-agent-method-p-cache
+             (cons method-or-server
+                   (member server gnus-agent-covered-methods)))))
   (cdr gnus-agent-method-p-cache))
 
 (defun gnus-online (method)
@@ -4370,5 +4419,5 @@ prompt the user for the name of an NNTP server to use."
 
 (provide 'gnus)
 
-;;; arch-tag: acebeeab-f331-4f8f-a7ea-89c58c84f636
+;; arch-tag: acebeeab-f331-4f8f-a7ea-89c58c84f636
 ;;; gnus.el ends here