Define `delete-dups' for XEmacs
[gnus] / lisp / spam.el
index 448a008..82f98c4 100644 (file)
@@ -1,7 +1,6 @@
 ;;; spam.el --- Identifying spam
 
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-;;   Free Software Foundation, Inc.
+;; Copyright (C) 2002-2014 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Maintainer: Ted Zlatanov <tzz@lifelogs.com>
 
 (eval-when-compile (require 'cl))
 
-(require 'message)             ;for the message-fetch-field functions
+(require 'message)              ;for the message-fetch-field functions
 (require 'gnus-sum)
-(require 'gnus-uu)                     ; because of key prefix issues
+(require 'gnus-uu)                      ; because of key prefix issues
 ;;; for the definitions of group content classification and spam processors
 (require 'gnus)
 
-(eval-when-compile (require 'spam-report))
 (eval-when-compile (require 'hashcash))
 
 ;; for nnimap-split-download-body-default
 (autoload 'query-dig "dig")
 
 ;; autoload spam-report
-(eval-and-compile
-  (autoload 'spam-report-gmane "spam-report")
-  (autoload 'spam-report-gmane-spam "spam-report")
-  (autoload 'spam-report-gmane-ham "spam-report")
-  (autoload 'spam-report-resend "spam-report"))
+(autoload 'spam-report-gmane "spam-report")
+(autoload 'spam-report-gmane-spam "spam-report")
+(autoload 'spam-report-gmane-ham "spam-report")
+(autoload 'spam-report-resend "spam-report")
 
 ;; autoload gnus-registry
 (autoload 'gnus-registry-group-count "gnus-registry")
-(autoload 'gnus-registry-add-group "gnus-registry")
-(autoload 'gnus-registry-store-extra-entry "gnus-registry")
-(autoload 'gnus-registry-fetch-extra "gnus-registry")
+(autoload 'gnus-registry-get-id-key "gnus-registry")
+(autoload 'gnus-registry-set-id-key "gnus-registry")
+(autoload 'gnus-registry-handle-action "gnus-registry")
 
 ;; autoload dns-query
 (autoload 'dns-query "dns")
@@ -93,12 +90,16 @@ Populated by `spam-install-backend-super'.")
   "Exit behavior at the time of summary exit.
 Note that setting the `spam-use-move' or `spam-use-copy' backends on
 a group through group/topic parameters overrides this mechanism."
-  :type '(choice (const 'default :tag
-                       "Move spam out of all groups.  Move ham out of spam groups.")
-                (const 'move-all :tag
-                       "Move spam out of all groups.  Move ham out of all groups.")
-                (const 'move-none :tag
-                       "Never move spam or ham out of any groups."))
+  :type '(choice
+          (const
+           :tag "Move spam out of all groups and ham out of spam groups"
+           default)
+          (const
+           :tag "Move spam out of all groups and ham out of all groups"
+           move-all)
+          (const
+           :tag "Never move spam or ham out of any groups"
+           move-none))
   :group 'spam)
 
 (defcustom spam-directory (nnheader-concat gnus-directory "spam/")
@@ -153,7 +154,7 @@ last rule in your split configuration."
   :group 'spam)
 
 (defcustom spam-autodetect-recheck-messages nil
-  "Should spam.el recheck all meessages when autodetecting?
+  "Should spam.el recheck all messages when autodetecting?
 Normally this is nil, so only unseen messages will be checked."
   :type 'boolean
   :group 'spam)
@@ -296,27 +297,27 @@ them."
   :group 'spam)
 
 (defcustom spam-install-hooks (or
-                              spam-use-dig
-                              spam-use-gmane-xref
-                              spam-use-blacklist
-                              spam-use-whitelist
-                              spam-use-whitelist-exclusive
-                              spam-use-blackholes
-                              spam-use-hashcash
-                              spam-use-regex-headers
-                              spam-use-regex-body
-                              spam-use-bogofilter
-                              spam-use-bogofilter-headers
-                              spam-use-spamassassin
-                              spam-use-spamassassin-headers
-                              spam-use-bsfilter
-                              spam-use-bsfilter-headers
-                              spam-use-BBDB
-                              spam-use-BBDB-exclusive
-                              spam-use-ifile
-                              spam-use-stat
-                              spam-use-spamoracle
-                              spam-use-crm114)
+                               spam-use-dig
+                               spam-use-gmane-xref
+                               spam-use-blacklist
+                               spam-use-whitelist
+                               spam-use-whitelist-exclusive
+                               spam-use-blackholes
+                               spam-use-hashcash
+                               spam-use-regex-headers
+                               spam-use-regex-body
+                               spam-use-bogofilter
+                               spam-use-bogofilter-headers
+                               spam-use-spamassassin
+                               spam-use-spamassassin-headers
+                               spam-use-bsfilter
+                               spam-use-bsfilter-headers
+                               spam-use-BBDB
+                               spam-use-BBDB-exclusive
+                               spam-use-ifile
+                               spam-use-stat
+                               spam-use-spamoracle
+                               spam-use-crm114)
   "Whether the spam hooks should be installed.
 Default to t if one of the spam-use-* variables is set."
   :group 'spam
@@ -330,8 +331,8 @@ Default to t if one of the spam-use-* variables is set."
 ;;; TODO: deprecate this variable, it's confusing since it's a list of strings,
 ;;; not regular expressions
 (defcustom spam-junk-mailgroups (cons
-                                spam-split-group
-                                '("mail.junk" "poste.pourriel"))
+                                 spam-split-group
+                                 '("mail.junk" "poste.pourriel"))
   "Mailgroups with spam contents.
 All unmarked article in such group receive the spam mark on group entry."
   :type '(repeat (string :tag "Group"))
@@ -345,7 +346,7 @@ Only meaningful if you enable `spam-use-gmane-xref'."
   :group 'spam)
 
 (defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org"
-                                   "dev.null.dk" "relays.visi.com")
+                                    "dev.null.dk" "relays.visi.com")
   "List of blackhole servers.
 Only meaningful if you enable `spam-use-blackholes'."
   :type '(repeat (string :tag "Server"))
@@ -405,9 +406,9 @@ Only meaningful if you enable `spam-use-regex-body'."
 (defcustom spam-summary-score-preferred-header nil
   "Preferred header to use for `spam-summary-score'."
   :type '(choice :tag "Header name"
-         (symbol :tag "SpamAssassin etc" X-Spam-Status)
-         (symbol :tag "Bogofilter"       X-Bogosity)
-         (const  :tag "No preference, take best guess." nil))
+          (symbol :tag "SpamAssassin etc" X-Spam-Status)
+          (symbol :tag "Bogofilter"       X-Bogosity)
+          (const  :tag "No preference, take best guess." nil))
   :group 'spam)
 
 (defgroup spam-ifile nil
@@ -419,7 +420,7 @@ Only meaningful if you enable `spam-use-regex-body'."
 (defcustom spam-ifile-program (executable-find "ifile")
   "Name of the ifile program."
   :type '(choice (file :tag "Location of ifile")
-                (const :tag "ifile is not installed"))
+                 (const :tag "ifile is not installed"))
   :group 'spam-ifile)
 
 (make-obsolete-variable 'spam-ifile-database-path 'spam-ifile-database
@@ -427,7 +428,7 @@ Only meaningful if you enable `spam-use-regex-body'."
 (defcustom spam-ifile-database nil
   "File name of the ifile database."
   :type '(choice (file :tag "Location of the ifile database")
-                (const :tag "Use the default"))
+                 (const :tag "Use the default"))
   :group 'spam-ifile)
 
 (defcustom spam-ifile-spam-category "spam"
@@ -439,7 +440,7 @@ Only meaningful if you enable `spam-use-regex-body'."
   "Name of the ham ifile category.
 If nil, the current group name will be used."
   :type '(choice (string :tag "Use a fixed category")
-                (const :tag "Use the current group name"))
+                 (const :tag "Use the current group name"))
   :group 'spam-ifile)
 
 (defcustom spam-ifile-all-categories nil
@@ -458,7 +459,7 @@ your main source of newsgroup names."
 (defcustom spam-bogofilter-program (executable-find "bogofilter")
   "Name of the Bogofilter program."
   :type '(choice (file :tag "Location of bogofilter")
-                (const :tag "Bogofilter is not installed"))
+                 (const :tag "Bogofilter is not installed"))
   :group 'spam-bogofilter)
 
 (defvar spam-bogofilter-valid 'unknown "Is the bogofilter version valid?")
@@ -497,8 +498,8 @@ your main source of newsgroup names."
   "Location of the Bogofilter database.
 When nil, use the default location."
   :type '(choice (directory
-                 :tag "Location of the Bogofilter database directory")
-                (const :tag "Use the default"))
+                  :tag "Location of the Bogofilter database directory")
+                 (const :tag "Use the default"))
   :group 'spam-bogofilter)
 
 (defgroup spam-bsfilter nil
@@ -510,7 +511,7 @@ When nil, use the default location."
 (defcustom spam-bsfilter-program (executable-find "bsfilter")
   "Name of the Bsfilter program."
   :type '(choice (file :tag "Location of bsfilter")
-                (const :tag "Bsfilter is not installed"))
+                 (const :tag "Bsfilter is not installed"))
   :group 'spam-bsfilter)
 
 (defcustom spam-bsfilter-header "X-Spam-Flag"
@@ -546,8 +547,8 @@ When nil, use the default location."
 (defcustom spam-bsfilter-database-directory nil
   "Directory path of the Bsfilter databases."
   :type '(choice (directory
-                 :tag "Location of the Bsfilter database directory")
-                (const :tag "Use the default"))
+                  :tag "Location of the Bsfilter database directory")
+                 (const :tag "Use the default"))
   :group 'spam-bsfilter)
 
 (defgroup spam-spamoracle nil
@@ -558,13 +559,13 @@ When nil, use the default location."
   "Location of spamoracle database file.
 When nil, use the default spamoracle database."
   :type '(choice (directory :tag "Location of spamoracle database file.")
-                (const :tag "Use the default"))
+                 (const :tag "Use the default"))
   :group 'spam-spamoracle)
 
 (defcustom spam-spamoracle-binary (executable-find "spamoracle")
   "Location of the spamoracle binary."
   :type '(choice (directory :tag "Location of the spamoracle binary")
-                (const :tag "Use the default"))
+                 (const :tag "Use the default"))
   :group 'spam-spamoracle)
 
 (defgroup spam-spamassassin nil
@@ -578,7 +579,7 @@ When nil, use the default spamoracle database."
 Hint: set this to \"spamc\" if you have spamd running.  See the spamc and
 spamd man pages for more information on these programs."
   :type '(choice (file :tag "Location of spamc")
-                (const :tag "spamassassin is not installed"))
+                 (const :tag "spamassassin is not installed"))
   :group 'spam-spamassassin)
 
 (defcustom spam-spamassassin-arguments ()
@@ -608,7 +609,7 @@ identification"
 (defcustom spam-sa-learn-program (executable-find "sa-learn")
   "Name of the sa-learn program."
   :type '(choice (file :tag "Location of spamassassin")
-                (const :tag "spamassassin is not installed"))
+                 (const :tag "spamassassin is not installed"))
   :group 'spam-spamassassin)
 
 (defcustom spam-sa-learn-rebuild t
@@ -642,7 +643,7 @@ order for SpamAssassin to recognize the new registered spam."
 (defcustom spam-crm114-program (executable-find "mailfilter.crm")
   "File path of the CRM114 Mailfilter executable program."
   :type '(choice (file :tag "Location of CRM114 Mailfilter")
-        (const :tag "CRM114 Mailfilter is not installed"))
+         (const :tag "CRM114 Mailfilter is not installed"))
   :group 'spam-crm114)
 
 (defcustom spam-crm114-header "X-CRM114-Status"
@@ -678,8 +679,8 @@ order for SpamAssassin to recognize the new registered spam."
 (defcustom spam-crm114-database-directory nil
   "Directory path of the CRM114 Mailfilter databases."
   :type '(choice (directory
-         :tag "Location of the CRM114 Mailfilter database directory")
-        (const :tag "Use the default"))
+          :tag "Location of the CRM114 Mailfilter database directory")
+         (const :tag "Use the default"))
   :group 'spam-crm114)
 
 ;;; Key bindings for spam control.
@@ -696,8 +697,8 @@ order for SpamAssassin to recognize the new registered spam."
   "Whether spam.el will try to cache lookups using `spam-caches'.")
 
 (defvar spam-caches (make-hash-table
-                    :size 10
-                    :test 'equal)
+                     :size 10
+                     :test 'equal)
   "Cache of spam detection entries.")
 
 (defvar spam-old-articles nil
@@ -736,11 +737,11 @@ When either list is nil, the other is returned."
   (if (and list1 list2)
       ;; we have two non-nil lists
       (progn
-       (dolist (item (append list1 list2))
-         (when (and (memq item list1) (memq item list2))
-           (setq list1 (delq item list1))
-           (setq list2 (delq item list2))))
-       (append list1 list2))
+        (dolist (item (append list1 list2))
+          (when (and (memq item list1) (memq item list2))
+            (setq list1 (delq item list1))
+            (setq list2 (delq item list2))))
+        (append list1 list2))
     ;; if either of the lists was nil, return the other one
     (if list1 list1 list2)))
 
@@ -748,9 +749,9 @@ When either list is nil, the other is returned."
   "Checks if MARK is considered a ham mark in GROUP."
   (when (stringp group)
     (let* ((marks (spam-group-ham-marks group spam))
-          (marks (if (symbolp mark)
-                     marks
-                   (mapcar 'symbol-value marks))))
+           (marks (if (symbolp mark)
+                      marks
+                    (mapcar 'symbol-value marks))))
       (memq mark marks))))
 
 (defun spam-group-spam-mark-p (group mark)
@@ -761,10 +762,10 @@ When either list is nil, the other is returned."
   "In GROUP, get all the ham marks."
   (when (stringp group)
     (let* ((marks (if spam
-                     (gnus-parameter-spam-marks group)
-                   (gnus-parameter-ham-marks group)))
-          (marks (car marks))
-          (marks (if (listp (car marks)) (car marks) marks)))
+                      (gnus-parameter-spam-marks group)
+                    (gnus-parameter-ham-marks group)))
+           (marks (car marks))
+           (marks (if (listp (car marks)) (car marks) marks)))
       marks)))
 
 (defun spam-group-spam-marks (group)
@@ -775,15 +776,15 @@ When either list is nil, the other is returned."
   "Is GROUP a spam group?"
   (if (and (stringp group) (< 0 (length group)))
       (or (member group spam-junk-mailgroups)
-         (memq 'gnus-group-spam-classification-spam
-               (gnus-parameter-spam-contents group)))
+          (memq 'gnus-group-spam-classification-spam
+                (gnus-parameter-spam-contents group)))
     nil))
 
 (defun spam-group-ham-contents-p (group)
   "Is GROUP a ham group?"
   (if (stringp group)
       (memq 'gnus-group-spam-classification-ham
-           (gnus-parameter-spam-contents group))
+            (gnus-parameter-spam-contents group))
     nil))
 
 (defun spam-classifications ()
@@ -812,20 +813,20 @@ When either list is nil, the other is returned."
 
 (defun spam-list-articles (articles classification)
   (let ((mark-check (if (eq classification 'spam)
-                       'spam-group-spam-mark-p
-                     'spam-group-ham-mark-p))
-       alist mark-cache-yes mark-cache-no)
+                        'spam-group-spam-mark-p
+                      'spam-group-ham-mark-p))
+        alist mark-cache-yes mark-cache-no)
     (dolist (article articles)
       (let ((mark (gnus-summary-article-mark article)))
-       (unless (or (memq mark mark-cache-yes)
-                   (memq mark mark-cache-no))
-         (if (funcall mark-check
-                      gnus-newsgroup-name
-                      mark)
-             (push mark mark-cache-yes)
-           (push mark mark-cache-no)))
-       (when (memq mark mark-cache-yes)
-         (push article alist))))
+        (unless (or (memq mark mark-cache-yes)
+                    (memq mark mark-cache-no))
+          (if (funcall mark-check
+                       gnus-newsgroup-name
+                       mark)
+              (push mark mark-cache-yes)
+            (push mark mark-cache-no)))
+        (when (memq mark mark-cache-yes)
+          (push article alist))))
     alist))
 
 ;;}}}
@@ -841,13 +842,13 @@ backend is STATISTICAL."
   (setq spam-backends (add-to-list 'spam-backends backend))
   (while properties
     (let ((property (pop properties))
-         (value (pop properties)))
+          (value (pop properties)))
       (if (spam-backend-property-valid-p property)
-         (put backend property value)
-       (gnus-error
-        5
-        "spam-install-backend-super got an invalid property %s"
-        property)))))
+          (put backend property value)
+        (gnus-error
+         5
+         "spam-install-backend-super got an invalid property %s"
+         property)))))
 
 (defun spam-backend-list (&optional type)
   "Return a list of all the backend symbols, constrained by TYPE.
@@ -856,16 +857,16 @@ When TYPE is 'mover, only mover backends are returned."
   (let (list)
     (dolist (backend spam-backends)
       (when (or
-            (null type)                ;either no type was requested
-            ;; or the type is 'mover and the backend is a mover
-            (and
-             (eq type 'mover)
-             (spam-backend-mover-p backend))
-            ;; or the type is 'non-mover and the backend is not a mover
-            (and
-             (eq type 'non-mover)
-             (not (spam-backend-mover-p backend))))
-       (push backend list)))
+             (null type)                ;either no type was requested
+             ;; or the type is 'mover and the backend is a mover
+             (and
+              (eq type 'mover)
+              (spam-backend-mover-p backend))
+             ;; or the type is 'non-mover and the backend is not a mover
+             (and
+              (eq type 'non-mover)
+              (not (spam-backend-mover-p backend))))
+        (push backend list)))
       list))
 
 (defun spam-backend-check (backend)
@@ -889,16 +890,16 @@ that the message is definitely a spam."
   "Return information about BACKEND."
   (if (spam-backend-valid-p backend)
       (let (info)
-       (setq info (format "Backend %s has the following properties:\n"
-                          backend))
-       (dolist (property (spam-backend-properties))
-         (setq info (format "%s%s=%s\n"
-                            info
-                            property
-                            (get backend property))))
-       info)
+        (setq info (format "Backend %s has the following properties:\n"
+                           backend))
+        (dolist (property (spam-backend-properties))
+          (setq info (format "%s%s=%s\n"
+                             info
+                             property
+                             (get backend property))))
+        info)
     (gnus-error 5 "spam-backend-info was asked about an invalid backend %s"
-               backend)))
+                backend)))
 
 (defun spam-backend-function (backend classification type)
   "Get the BACKEND function for CLASSIFICATION and TYPE.
@@ -908,11 +909,11 @@ CLASSIFICATION is 'ham or 'spam."
        (spam-classification-valid-p classification)
        (spam-backend-function-type-valid-p type))
       (let ((retrieval
-            (intern
-             (format "spam-backend-%s-%s-function"
-                     classification
-                     type))))
-       (funcall retrieval backend))
+             (intern
+              (format "spam-backend-%s-%s-function"
+                      classification
+                      type))))
+        (funcall retrieval backend))
     (gnus-error
      5
      "%s was passed invalid backend %s, classification %s, or type %s"
@@ -922,15 +923,15 @@ CLASSIFICATION is 'ham or 'spam."
      type)))
 
 (defun spam-backend-article-list-property (classification
-                                          &optional unregister)
+                                           &optional unregister)
   "Property name of article list with CLASSIFICATION and UNREGISTER."
   (let* ((r (if unregister "unregister" "register"))
-        (prop (format "%s-%s" classification r)))
+         (prop (format "%s-%s" classification r)))
     prop))
 
 (defun spam-backend-get-article-todo-list (backend
-                                          classification
-                                          &optional unregister)
+                                           classification
+                                           &optional unregister)
   "Get the articles to be processed for BACKEND and CLASSIFICATION.
 With UNREGISTER, get articles to be unregistered.
 This is a temporary storage function - nothing here persists."
@@ -938,7 +939,8 @@ This is a temporary storage function - nothing here persists."
    backend
    (intern (spam-backend-article-list-property classification unregister))))
 
-(defun spam-backend-put-article-todo-list (backend classification list &optional unregister)
+(defun spam-backend-put-article-todo-list (backend classification list
+                                                   &optional unregister)
   "Set the LIST of articles to be processed for BACKEND and CLASSIFICATION.
 With UNREGISTER, set articles to be unregistered.
 This is a temporary storage function - nothing here persists."
@@ -1036,125 +1038,125 @@ backends)."
 
 ;;{{{ backend installations
 (spam-install-checkonly-backend 'spam-use-blackholes
-                               'spam-check-blackholes)
+                                'spam-check-blackholes)
 
 (spam-install-checkonly-backend 'spam-use-hashcash
-                               'spam-check-hashcash)
+                                'spam-check-hashcash)
 
 (spam-install-checkonly-backend 'spam-use-spamassassin-headers
-                               'spam-check-spamassassin-headers)
+                                'spam-check-spamassassin-headers)
 
 (spam-install-checkonly-backend 'spam-use-bogofilter-headers
-                               'spam-check-bogofilter-headers)
+                                'spam-check-bogofilter-headers)
 
 (spam-install-checkonly-backend 'spam-use-bsfilter-headers
-                               'spam-check-bsfilter-headers)
+                                'spam-check-bsfilter-headers)
 
 (spam-install-checkonly-backend 'spam-use-gmane-xref
-                               'spam-check-gmane-xref)
+                                'spam-check-gmane-xref)
 
 (spam-install-checkonly-backend 'spam-use-regex-headers
-                               'spam-check-regex-headers)
+                                'spam-check-regex-headers)
 
 (spam-install-statistical-checkonly-backend 'spam-use-regex-body
-                                           'spam-check-regex-body)
+                                            'spam-check-regex-body)
 
-;; TODO: NOTE: spam-use-ham-copy is now obsolete, use (ham spam-use-copy) instead
+;; TODO: NOTE: spam-use-ham-copy is now obsolete, use (ham spam-use-copy)
 (spam-install-mover-backend 'spam-use-move
-                           'spam-move-ham-routine
-                           'spam-move-spam-routine
-                           nil
-                           nil)
+                            'spam-move-ham-routine
+                            'spam-move-spam-routine
+                            nil
+                            nil)
 
 (spam-install-nocheck-backend 'spam-use-copy
-                             'spam-copy-ham-routine
-                             'spam-copy-spam-routine
-                             nil
-                             nil)
+                              'spam-copy-ham-routine
+                              'spam-copy-spam-routine
+                              nil
+                              nil)
 
 (spam-install-nocheck-backend 'spam-use-gmane
-                             'spam-report-gmane-unregister-routine
-                             'spam-report-gmane-register-routine
-                             'spam-report-gmane-register-routine
-                             'spam-report-gmane-unregister-routine)
+                              'spam-report-gmane-unregister-routine
+                              'spam-report-gmane-register-routine
+                              'spam-report-gmane-register-routine
+                              'spam-report-gmane-unregister-routine)
 
 (spam-install-nocheck-backend 'spam-use-resend
-                             'spam-report-resend-register-ham-routine
-                             'spam-report-resend-register-routine
-                             nil
-                             nil)
+                              'spam-report-resend-register-ham-routine
+                              'spam-report-resend-register-routine
+                              nil
+                              nil)
 
 (spam-install-backend 'spam-use-BBDB
-                     'spam-check-BBDB
-                     'spam-BBDB-register-routine
-                     nil
-                     'spam-BBDB-unregister-routine
-                     nil)
+                      'spam-check-BBDB
+                      'spam-BBDB-register-routine
+                      nil
+                      'spam-BBDB-unregister-routine
+                      nil)
 
 (spam-install-backend-alias 'spam-use-BBDB 'spam-use-BBDB-exclusive)
 
 (spam-install-backend 'spam-use-blacklist
-                     'spam-check-blacklist
-                     nil
-                     'spam-blacklist-register-routine
-                     nil
-                     'spam-blacklist-unregister-routine)
+                      'spam-check-blacklist
+                      nil
+                      'spam-blacklist-register-routine
+                      nil
+                      'spam-blacklist-unregister-routine)
 
 (spam-install-backend 'spam-use-whitelist
-                     'spam-check-whitelist
-                     'spam-whitelist-register-routine
-                     nil
-                     'spam-whitelist-unregister-routine
-                     nil)
+                      'spam-check-whitelist
+                      'spam-whitelist-register-routine
+                      nil
+                      'spam-whitelist-unregister-routine
+                      nil)
 
 (spam-install-statistical-backend 'spam-use-ifile
-                                 'spam-check-ifile
-                                 'spam-ifile-register-ham-routine
-                                 'spam-ifile-register-spam-routine
-                                 'spam-ifile-unregister-ham-routine
-                                 'spam-ifile-unregister-spam-routine)
+                                  'spam-check-ifile
+                                  'spam-ifile-register-ham-routine
+                                  'spam-ifile-register-spam-routine
+                                  'spam-ifile-unregister-ham-routine
+                                  'spam-ifile-unregister-spam-routine)
 
 (spam-install-statistical-backend 'spam-use-spamoracle
-                                 'spam-check-spamoracle
-                                 'spam-spamoracle-learn-ham
-                                 'spam-spamoracle-learn-spam
-                                 'spam-spamoracle-unlearn-ham
-                                 'spam-spamoracle-unlearn-spam)
+                                  'spam-check-spamoracle
+                                  'spam-spamoracle-learn-ham
+                                  'spam-spamoracle-learn-spam
+                                  'spam-spamoracle-unlearn-ham
+                                  'spam-spamoracle-unlearn-spam)
 
 (spam-install-statistical-backend 'spam-use-stat
-                                 'spam-check-stat
-                                 'spam-stat-register-ham-routine
-                                 'spam-stat-register-spam-routine
-                                 'spam-stat-unregister-ham-routine
-                                 'spam-stat-unregister-spam-routine)
+                                  'spam-check-stat
+                                  'spam-stat-register-ham-routine
+                                  'spam-stat-register-spam-routine
+                                  'spam-stat-unregister-ham-routine
+                                  'spam-stat-unregister-spam-routine)
 
 (spam-install-statistical-backend 'spam-use-spamassassin
-                                 'spam-check-spamassassin
-                                 'spam-spamassassin-register-ham-routine
-                                 'spam-spamassassin-register-spam-routine
-                                 'spam-spamassassin-unregister-ham-routine
-                                 'spam-spamassassin-unregister-spam-routine)
+                                  'spam-check-spamassassin
+                                  'spam-spamassassin-register-ham-routine
+                                  'spam-spamassassin-register-spam-routine
+                                  'spam-spamassassin-unregister-ham-routine
+                                  'spam-spamassassin-unregister-spam-routine)
 
 (spam-install-statistical-backend 'spam-use-bogofilter
-                                 'spam-check-bogofilter
-                                 'spam-bogofilter-register-ham-routine
-                                 'spam-bogofilter-register-spam-routine
-                                 'spam-bogofilter-unregister-ham-routine
-                                 'spam-bogofilter-unregister-spam-routine)
+                                  'spam-check-bogofilter
+                                  'spam-bogofilter-register-ham-routine
+                                  'spam-bogofilter-register-spam-routine
+                                  'spam-bogofilter-unregister-ham-routine
+                                  'spam-bogofilter-unregister-spam-routine)
 
 (spam-install-statistical-backend 'spam-use-bsfilter
-                                 'spam-check-bsfilter
-                                 'spam-bsfilter-register-ham-routine
-                                 'spam-bsfilter-register-spam-routine
-                                 'spam-bsfilter-unregister-ham-routine
-                                 'spam-bsfilter-unregister-spam-routine)
+                                  'spam-check-bsfilter
+                                  'spam-bsfilter-register-ham-routine
+                                  'spam-bsfilter-register-spam-routine
+                                  'spam-bsfilter-unregister-ham-routine
+                                  'spam-bsfilter-unregister-spam-routine)
 
 (spam-install-statistical-backend 'spam-use-crm114
-                                 'spam-check-crm114
-                                 'spam-crm114-register-ham-routine
-                                 'spam-crm114-register-spam-routine
-                                 'spam-crm114-unregister-ham-routine
-                                 'spam-crm114-unregister-spam-routine)
+                                  'spam-check-crm114
+                                  'spam-crm114-register-ham-routine
+                                  'spam-crm114-register-spam-routine
+                                  'spam-crm114-unregister-ham-routine
+                                  'spam-crm114-unregister-spam-routine)
 ;;}}}
 
 ;;{{{ scoring and summary formatting
@@ -1162,31 +1164,31 @@ backends)."
   "Return the extra headers spam.el thinks are necessary."
   (let (list)
     (when (or spam-use-spamassassin
-             spam-use-spamassassin-headers
-             spam-use-regex-headers)
+              spam-use-spamassassin-headers
+              spam-use-regex-headers)
       (push 'X-Spam-Status list))
     (when (or spam-use-bogofilter
-             spam-use-regex-headers)
+              spam-use-regex-headers)
       (push 'X-Bogosity list))
     (when (or spam-use-crm114
-             spam-use-regex-headers)
+              spam-use-regex-headers)
       (push 'X-CRM114-Status list))
     list))
 
 (defun spam-user-format-function-S (headers)
   (when headers
     (format "%3.2f"
-           (spam-summary-score headers spam-summary-score-preferred-header))))
+            (spam-summary-score headers spam-summary-score-preferred-header))))
 
 (defun spam-article-sort-by-spam-status (h1 h2)
   "Sort articles by score."
   (let (result)
     (dolist (header (spam-necessary-extra-headers))
       (let ((s1 (spam-summary-score h1 header))
-           (s2 (spam-summary-score h2 header)))
+            (s2 (spam-summary-score h2 header)))
       (unless (= s1 s2)
-       (setq result (< s1 s2))
-       (return))))
+        (setq result (< s1 s2))
+        (return))))
     result))
 
 (defvar spam-spamassassin-score-regexp
@@ -1223,13 +1225,13 @@ With SPECIFIC-HEADER, returns only that header's score.
 Will not return a nil score."
   (let (score)
     (dolist (header
-            (if specific-header
-                (list specific-header)
-              (spam-necessary-extra-headers)))
+             (if specific-header
+                 (list specific-header)
+               (spam-necessary-extra-headers)))
       (setq score
-           (spam-extra-header-to-number header headers))
+            (spam-extra-header-to-number header headers))
       (when score
-       (return)))
+        (return)))
     (or score 0)))
 
 (defun spam-generic-score (&optional recheck)
@@ -1256,15 +1258,15 @@ Will not return a nil score."
   (let (found)
     (dolist (backend (spam-backend-list))
       (when (and (spam-backend-statistical-p backend)
-                (or (symbol-value backend)
-                    (memq backend force-symbols)))
-       (setq found backend)))
+                 (or (symbol-value backend)
+                     (memq backend force-symbols)))
+        (setq found backend)))
     found))
 
 (defvar spam-list-of-processors
   ;; note the nil processors are not defined in gnus.el
   '((gnus-group-spam-exit-processor-bogofilter   spam spam-use-bogofilter)
-    (gnus-group-spam-exit-processor-bsfilter    spam spam-use-bsfilter)
+    (gnus-group-spam-exit-processor-bsfilter     spam spam-use-bsfilter)
     (gnus-group-spam-exit-processor-blacklist    spam spam-use-blacklist)
     (gnus-group-spam-exit-processor-ifile        spam spam-use-ifile)
     (gnus-group-spam-exit-processor-stat         spam spam-use-stat)
@@ -1287,6 +1289,7 @@ variable.  When the processor variable is nil, just the
 classification and spam-use-* check variable are used.  This is
 superseded by the new spam backend code, so it's only consulted
 for backwards compatibility.")
+(make-obsolete-variable 'spam-list-of-processors nil "22.1")
 
 (defun spam-group-processor-p (group backend &optional classification)
   "Checks if GROUP has a BACKEND with CLASSIFICATION registered.
@@ -1295,38 +1298,38 @@ gnus.el and in spam-list-of-processors.  In the case of mover
 backends, checks the setting of `spam-summary-exit-behavior' in
 addition to the set values for the group."
   (if (and (stringp group)
-          (symbolp backend))
+           (symbolp backend))
       (let ((old-style (assq backend spam-list-of-processors))
-           (parameters (nth 0 (gnus-parameter-spam-process group)))
-           found)
-       (if old-style  ; old-style processor
-           (spam-group-processor-p group (nth 2 old-style) (nth 1 old-style))
-         ;; now search for the parameter
-         (dolist (parameter parameters)
-           (when (and (null found)
-                      (listp parameter)
-                      (eq classification (nth 0 parameter))
-                      (eq backend (nth 1 parameter)))
-             (setq found t)))
-
-         ;; now, if the parameter was not found, do the
-         ;; spam-summary-exit-behavior-logic for mover backends
-         (unless found
-           (when (spam-backend-mover-p backend)
-             (setq
-              found
-              (cond
-               ((eq spam-summary-exit-behavior 'move-all) t)
-               ((eq spam-summary-exit-behavior 'move-none) nil)
-               ((eq spam-summary-exit-behavior 'default)
-                (or (eq classification 'spam) ;move spam out of all groups
-                    ;; move ham out of spam groups
-                    (and (eq classification 'ham)
-                         (spam-group-spam-contents-p group))))
-               (