*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Wed, 5 Mar 1997 00:00:26 +0000 (00:00 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Wed, 5 Mar 1997 00:00:26 +0000 (00:00 +0000)
21 files changed:
lisp/ChangeLog
lisp/article.el
lisp/gnus-art.el
lisp/gnus-async.el
lisp/gnus-group.el
lisp/gnus-kill.el
lisp/gnus-nocem.el
lisp/gnus-score.el
lisp/gnus-start.el
lisp/gnus-sum.el
lisp/gnus-topic.el
lisp/gnus-uu.el
lisp/gnus.el
lisp/message.el
lisp/nnheader.el
lisp/nnmail.el
lisp/nntp.el
lisp/nnvirtual.el
lisp/nnweb.el
texi/ChangeLog
texi/gnus.texi

index 4cd5359..c5d6064 100644 (file)
@@ -1,3 +1,91 @@
+Tue Nov  5 22:34:01 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * message.el (message-goto-signature): Place point better.
+
+       * gnus-art.el (gnus-summary-save-body-in-file): Restored.
+
+       * nntp.el (nntp-send-authinfo): Better password prompting.
+
+       * nnmail.el (nnmail-read-passwd): Allow format strings.
+
+Tue Nov  5 22:10:20 1996  David Moore  <dmoore@ucsd.edu>
+
+       * gnus-sum.el (gnus-valid-move-group-p): New function.
+       (gnus-read-move-group-name): Faster implementation.
+
+Tue Nov  5 12:35:40 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-topic.el (gnus-topic-remove-topic): Would wipe out topic
+       parameters. 
+
+       * gnus-sum.el (gnus-summary-stop-page-breaking): Remove all
+       buttons. 
+
+       * nnweb.el (nnweb-set-hashtb): Typo.
+
+Tue Nov  5 10:43:24 1996  Randal Schwartz  <merlyn@stonehenge.com>
+
+       * gnus-uu.el (gnus-uu-be-dangerous): New variable.
+       (gnus-uu-save-files): Use it.
+
+Tue Nov  5 10:19:39 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-sum.el (gnus-summary-read-document): Doc fix.
+       (gnus-summary-catchup-and-exit): Don't exit when replying "n".
+
+       * gnus-art.el (gnus-summary-write-to-file): Doc fix.
+
+       * gnus-uu.el (gnus-uu-get-list-of-articles): Get numerical prefix
+       value. 
+
+Tue Nov  5 10:14:02 1996  David Moore  <dmoore@ucsd.edu>
+
+       * gnus-start.el (gnus-groups-to-gnus-format): Simplified and made
+       faster. 
+
+Tue Nov  5 04:56:33 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nnmail.el (nnmail-search-unix-mail-delim): Protect against
+       regexp overflows.
+
+       * nnheader.el (nnheader-header-value): New definition.
+
+       * nntp.el (nntp-open-connection): Erase buffer.
+       (nntp-possibly-change-group): Ditto.
+
+       * nnvirtual.el (nnvirtual-create-mapping): Would ignore groups
+       with just one article.
+
+Tue Nov  5 03:41:30 1996  David Moore  <dmoore@ucsd.edu>
+
+       * gnus-nocem.el (gnus-nocem-enter-article): Would bug out on some
+       lines. 
+
+Tue Nov  5 03:36:03 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-score.el (gnus-score-find-favourite-words): Put point at
+       bob. 
+
+Tue Nov  5 03:33:04 1996  jeff sparkes  <jsparkes@nortel.ca>
+
+       * gnus-kill.el (gnus-batch-score): Run in slave mode.
+
+Mon Nov  4 03:16:18 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nnheader.el (nnheader-directory-regular-files): New function. 
+
+       * nnmail.el (nnmail-get-spool-files): Allow nnmail-spool-file to
+       be a directory.
+
+       * gnus-sum.el (gnus-summary-next-group): Halt prefetch.
+
+       * gnus-async.el (gnus-async-halt-prefetch): New function.
+
+       * message.el (message-check-news-header-syntax): Anchor
+       multiple-searches. 
+
+       * gnus-topic.el (gnus-topic-mode): Reset sorting function.
+
 Tue Oct 29 20:42:07 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
 
        * gnus-topic.el (gnus-topic-remove-topic): Fold properly.
index 0f9079d..f287640 100644 (file)
@@ -899,13 +899,14 @@ function and want to see what the date was before converting."
                visible (nth 2 elem)
                face (nth 3 elem))
          (while (re-search-forward regexp nil t)
-           (article-hide-text
-            (match-beginning invisible) (match-end invisible) props)
-           (article-unhide-text-type
-            (match-beginning visible) (match-end visible) 'emphasis)
-           (put-text-property 
-            (match-beginning visible) (match-end visible)
-            'face face)))))))
+           (when (and (match-beginning visible) (match-beginning invisible))
+             (article-hide-text
+              (match-beginning invisible) (match-end invisible) props)
+             (article-unhide-text-type
+              (match-beginning visible) (match-end visible) 'emphasis)
+             (put-text-property 
+              (match-beginning visible) (match-end visible) 'face face)
+             (goto-char (match-end invisible)))))))))
 
 (provide 'article)
 
index a6ec484..5c091f1 100644 (file)
@@ -499,12 +499,36 @@ Directory to save to is default to `gnus-article-save-directory'."
     (setq gnus-newsgroup-last-file filename)))
 
 (defun gnus-summary-write-to-file (&optional filename)
-  "Append this article body to a file.
+  "Write this article to a file.
 Optional argument FILENAME specifies file name.
 The directory to save in defaults to `gnus-article-save-directory'."
   (interactive)
   (gnus-summary-save-in-file nil t))
 
+
+(defun gnus-summary-save-body-in-file (&optional filename)
+  "Append this article body to a file.
+Optional argument FILENAME specifies file name.
+The directory to save in defaults to `gnus-article-save-directory'."
+  (interactive)
+  (gnus-set-global-variables)
+  (let ((default-name
+         (funcall gnus-file-save-name gnus-newsgroup-name
+                  gnus-current-headers gnus-newsgroup-last-file)))
+    (setq filename (gnus-read-save-file-name
+                   "Save %s body in file:" default-name filename))
+    (gnus-make-directory (file-name-directory filename))
+    (gnus-eval-in-buffer-window gnus-original-article-buffer
+      (save-excursion
+       (save-restriction
+         (widen)
+         (goto-char (point-min))
+         (when (search-forward "\n\n" nil t)
+           (narrow-to-region (point) (point-max)))
+         (gnus-output-to-file filename))))
+    ;; Remember the directory name to save articles.
+    (setq gnus-newsgroup-last-file filename)))
+
 (defun gnus-summary-save-in-pipe (&optional command)
   "Pipe this article to subprocess."
   (interactive)
index 1389ce7..88ae8fd 100644 (file)
@@ -120,6 +120,10 @@ It should return non-nil if the article is to be prefetched."
 (defun gnus-async-set-buffer ()
   (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t))
 
+(defun gnus-async-halt-prefetch ()
+  "Stop prefetching."
+  (setq gnus-async-fetch-list nil))
+
 (defun gnus-async-prefetch-next (group article summary)
   "Possibly prefetch several articles starting with the article after ARTICLE."
   (when (and (gnus-buffer-live-p summary)
index 9867de0..05cb3ac 100644 (file)
@@ -1206,7 +1206,7 @@ If REGEXP, only list groups matching REGEXP."
              (or (gnus-gethash gnus-tmp-group gnus-description-hashtb) "")
            ""))
         (gnus-tmp-moderated
-         (if (member gnus-tmp-group gnus-moderated-list) ?m ? ))
+         (if (gnus-gethash gnus-tmp-group gnus-moderated-hashtb) ?m ? ))
         (gnus-tmp-moderated-string
          (if (eq gnus-tmp-moderated ?m) "(m)" ""))
         (gnus-tmp-method
@@ -2463,7 +2463,8 @@ If REVERSE, sort in reverse order."
       (while (setq info (pop alist))
        (when (gnus-group-native-p (gnus-info-group info))
          (gnus-info-clear-data info)))
-      (gnus-get-unread-articles))))
+      (gnus-get-unread-articles)
+      (gnus-dribble-enter ""))))
 
 (defun gnus-info-clear-data (info)
   "Clear all marks and read ranges from INFO."
index 634e1c1..2e8966a 100644 (file)
@@ -684,6 +684,7 @@ score the alt hierarchy, you'd say \"!alt.all\"."
         (gnus-expert-user t)
         (nnmail-spool-file nil)
         (gnus-use-dribble-file nil)
+        (gnus-batch-mode t)
         group newsrc entry
         ;; Disable verbose message.
         gnus-novice-user gnus-large-newsgroup
@@ -691,16 +692,17 @@ score the alt hierarchy, you'd say \"!alt.all\"."
         gnus-options-not-subscribe)
     ;; Eat all arguments.
     (setq command-line-args-left nil)
-    (gnus)
+    (gnus-slave)
     ;; Apply kills to specified newsgroups in command line arguments.
     (setq newsrc (cdr gnus-newsrc-alist))
     (while (setq group (car (pop newsrc)))
       (setq entry (gnus-gethash group gnus-newsrc-hashtb))
-      (when (and (<= (nth 1 (car newsrc)) gnus-level-subscribed)
+      (when (and (<= (gnus-info-level (car newsrc)) gnus-level-subscribed)
                 (and (car entry)
                      (or (eq (car entry) t)
                          (not (zerop (car entry)))))
-                (eq (gnus-matches-options-n group) 'subscribe))
+                ;;(eq (gnus-matches-options-n group) 'subscribe)
+                )
        (gnus-summary-read-group group nil t nil t)
        (when (eq (current-buffer) (get-buffer gnus-summary-buffer))
          (gnus-summary-exit))))
index 6510a83..570bffd 100644 (file)
@@ -190,23 +190,23 @@ isn't bound, the message will be used unconditionally."
       (narrow-to-region b (1+ (match-beginning 0)))
       (goto-char (point-min))
       (while (search-forward "\t" nil t)
-       (condition-case nil
-           (setq group (let ((obarray gnus-active-hashtb)) (read buf)))
-         (error nil))
-       (if (not (boundp group))
-           ;; Make sure all entries in the hashtb are bound.
-           (set group nil)
-         (when (gnus-gethash (symbol-name group) gnus-newsrc-hashtb)
-           ;; Valid group.
-           (beginning-of-line)
-           (while (= (following-char) ?\t)
-             (forward-line -1))
-           (setq id (buffer-substring (point) (1- (search-forward "\t"))))
-           (push id ncm)
-           (gnus-sethash id t gnus-nocem-hashtb)
-           (forward-line 1)
-           (while (= (following-char) ?\t)
-             (forward-line 1)))))
+       (if (condition-case nil
+               (setq group (let ((obarray gnus-active-hashtb)) (read buf)))
+             (error nil))
+           (if (not (boundp group))
+               ;; Make sure all entries in the hashtb are bound.
+               (set group nil)
+             (when (gnus-gethash (symbol-name group) gnus-newsrc-hashtb)
+               ;; Valid group.
+               (beginning-of-line)
+               (while (= (following-char) ?\t)
+                 (forward-line -1))
+               (setq id (buffer-substring (point) (1- (search-forward "\t"))))
+               (push id ncm)
+               (gnus-sethash id t gnus-nocem-hashtb)
+               (forward-line 1)
+               (while (= (following-char) ?\t)
+                 (forward-line 1))))))
       (when ncm
        (setq gnus-nocem-touched-alist t)
        (push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time)
index 2ceede9..c9d89a0 100644 (file)
@@ -2139,7 +2139,8 @@ SCORE is the score to add."
        (insert (format "%-5d: %s\n" (caar rules) (cdar rules)))
        (pop rules))
       (gnus-add-current-to-buffer-list)
-      (gnus-configure-windows 'score-words))))
+      (gnus-configure-windows 'score-words)
+      (goto-char (point-min)))))
 
 (defun gnus-summary-rescore ()
   "Redo the entire scoring process in the current summary."
index bb21983..c59ec5f 100644 (file)
@@ -479,7 +479,7 @@ the first newsgroup."
        gnus-zombie-list nil
        gnus-killed-hashtb nil
        gnus-active-hashtb nil
-       gnus-moderated-list nil
+       gnus-moderated-hashtb nil
        gnus-description-hashtb nil
        gnus-current-headers nil
        gnus-thread-indent-array nil
@@ -1498,6 +1498,14 @@ newsgroup."
                (gnus-message 5 "%sdone" mesg))))))
        (setq methods (cdr methods))))))
 
+
+(defun gnus-ignored-newsgroups-has-to-p ()
+  "T only when gnus-ignored-newsgroups includes \"^to\\\\.\" as an element."
+  ;; note this regexp is the same as:
+  ;; (concat (regexp-quote "^to\\.") "\\($\\|" (regexp-quote "\\|") "\\)")
+  (string-match "\\^to\\\\\\.\\($\\|\\\\|\\)"
+               gnus-ignored-newsgroups))
+  
 ;; Read an active file and place the results in `gnus-active-hashtb'.
 (defun gnus-active-to-gnus-format (&optional method hashtb ignore-errors)
   (unless method
@@ -1512,20 +1520,23 @@ newsgroup."
                                (gnus-make-hashtable
                                 (count-lines (point-min) (point-max)))
                              (gnus-make-hashtable 4096)))))))
-    ;; Delete unnecessary lines.
+    ;; Delete unnecessary lines, cleaned up dmoore@ucsd.edu 31.10.1996
     (goto-char (point-min))
-    (while (search-forward "\nto." nil t)
-      (delete-region (1+ (match-beginning 0))
-                    (progn (forward-line 1) (point))))
-    (unless (string= gnus-ignored-newsgroups "")
-      (goto-char (point-min))
-      (delete-matching-lines gnus-ignored-newsgroups))
+    (cond ((gnus-ignored-newsgroups-has-to-p)
+          (delete-matching-lines gnus-ignored-newsgroups))
+         ((string= gnus-ignored-newsgroups "")
+          (delete-matching-lines "^to\\."))
+         (t
+          (delete-matching-lines (concat "^to\\.\\|"
+                                         gnus-ignored-newsgroups))))
+
     ;; Make the group names readable as a lisp expression even if they
     ;; contain special characters.
     ;; Fix by Luc Van Eycken <Luc.VanEycken@esat.kuleuven.ac.be>.
     (goto-char (point-max))
     (while (re-search-backward "[][';?()#]" nil t)
       (insert ?\\))
+
     ;; If these are groups from a foreign select method, we insert the
     ;; group prefix in front of the group names.
     (and method (not (gnus-server-equal
@@ -1537,70 +1548,44 @@ newsgroup."
                       (progn (insert prefix)
                              (zerop (forward-line 1)))))))
     ;; Store the active file in a hash table.
+    ;; dmoore@ucsd.edu 31.10.1996 - use same method for moderation or not
     (goto-char (point-min))
-    (if (and (boundp 'gnus-group-line-format)
-            (string-match "%[oO]" gnus-group-line-format))
-       ;; Suggested by Brian Edmonds <edmonds@cs.ubc.ca>.
-       ;; If we want information on moderated groups, we use this
-       ;; loop...
-       (let* ((mod-hashtb (make-vector 7 0))
-              (m (intern "m" mod-hashtb))
-              group max min)
-         (while (not (eobp))
-           (condition-case nil
-               (progn
-                 (narrow-to-region (point) (gnus-point-at-eol))
-                 (setq group (let ((obarray hashtb)) (read cur)))
-                 (if (and (numberp (setq max (read cur)))
-                          (numberp (setq min (read cur)))
-                          (progn
-                            (skip-chars-forward " \t")
-                            (not
-                             (or (= (following-char) ?=)
-                                 (= (following-char) ?x)
-                                 (= (following-char) ?j)))))
-                     (set group (cons min max))
-                   (set group nil))
-                 ;; Enter moderated groups into a list.
-                 (when (eq (let ((obarray mod-hashtb)) (read cur)) m)
-                   (push (symbol-name group) gnus-moderated-list)))
-             (error
-              (and group
-                   (symbolp group)
-                   (set group nil))))
-           (widen)
-           (forward-line 1)))
-      ;; And if we do not care about moderation, we use this loop,
-      ;; which is faster.
-      (let (group max min)
-       (while (not (eobp))
-         (condition-case ()
-             (progn
-               (narrow-to-region (point) (gnus-point-at-eol))
-               ;; group gets set to a symbol interned in the hash table
-               ;; (what a hack!!) - jwz
-               (setq group (let ((obarray hashtb)) (read cur)))
-               (if (and (numberp (setq max (read cur)))
-                        (numberp (setq min (read cur)))
-                        (progn
-                          (skip-chars-forward " \t")
-                          (not
-                           (or (= (following-char) ?=)
-                               (= (following-char) ?x)
-                               (= (following-char) ?j)))))
+    (let (group max min)
+      (while (not (eobp))
+       (condition-case ()
+           (progn
+             (narrow-to-region (point) (gnus-point-at-eol))
+             ;; group gets set to a symbol interned in the hash table
+             ;; (what a hack!!) - jwz
+             (setq group (let ((obarray hashtb)) (read cur)))
+             (if (and (numberp (setq max (read cur)))
+                      (numberp (setq min (read cur)))
+                      (progn
+                        (skip-chars-forward " \t")
+                        (not
+                         (or (= (following-char) ?=)
+                             (= (following-char) ?x)
+                             (= (following-char) ?j)))))
+                 (progn
                    (set group (cons min max))
-                 (set group nil)))
-           (error
-            (progn
-              (and group
-                   (symbolp group)
-                   (set group nil))
-              (unless ignore-errors
-                (gnus-message 3 "Warning - illegal active: %s"
-                              (buffer-substring
-                               (gnus-point-at-bol) (gnus-point-at-eol)))))))
-         (widen)
-         (forward-line 1))))))
+                   ;; if group is moderated, stick in moderation table
+                   (when (= (following-char) ?m)
+                     (unless gnus-moderated-hashtb
+                       (setq gnus-moderated-hashtb (make-vector 127 0)))
+                     (gnus-sethash (symbol-name group) t
+                                   gnus-moderated-hashtb)))
+               (set group nil)))
+         (error
+          (progn
+            (and group
+                 (symbolp group)
+                 (set group nil))
+            (unless ignore-errors
+              (gnus-message 3 "Warning - illegal active: %s"
+                            (buffer-substring
+                             (gnus-point-at-bol) (gnus-point-at-eol)))))))
+       (widen)
+       (forward-line 1)))))
 
 (defun gnus-groups-to-gnus-format (method &optional hashtb)
   ;; Parse a "groups" active file.
index 8b96b35..7a45708 100644 (file)
@@ -4083,9 +4083,6 @@ The resulting hash table is returned, or nil if no Xrefs were found."
                                            gnus-valid-select-methods)))
                 (equal (nth 1 m1) (nth 1 m2)))))))
 
-(defsubst gnus-header-value ()
-  (buffer-substring (match-end 0) (gnus-point-at-eol)))
-
 (defvar gnus-newsgroup-none-id 0)
 
 (defun gnus-get-newsgroup-headers (&optional dependencies force-new)
@@ -4130,22 +4127,22 @@ The resulting hash table is returned, or nil if no Xrefs were found."
            (progn
              (goto-char p)
              (if (search-forward "\nsubject: " nil t)
-                 (gnus-header-value) "(none)"))
+                 (nnheader-header-value) "(none)"))
            ;; From.
            (progn
              (goto-char p)
              (if (search-forward "\nfrom: " nil t)
-                 (gnus-header-value) "(nobody)"))
+                 (nnheader-header-value) "(nobody)"))
            ;; Date.
            (progn
              (goto-char p)
              (if (search-forward "\ndate: " nil t)
-                 (gnus-header-value) ""))
+                 (nnheader-header-value) ""))
            ;; Message-ID.
            (progn
              (goto-char p)
              (if (search-forward "\nmessage-id: " nil t)
-                 (setq id (gnus-header-value))
+                 (setq id (nnheader-header-value))
                ;; If there was no message-id, we just fake one to make
                ;; subsequent routines simpler.
                (setq id (concat "none+"
@@ -4159,7 +4156,7 @@ The resulting hash table is returned, or nil if no Xrefs were found."
                  (progn
                    (setq end (point))
                    (prog1
-                       (gnus-header-value)
+                       (nnheader-header-value)
                      (setq ref
                            (buffer-substring
                             (progn
@@ -4173,7 +4170,7 @@ The resulting hash table is returned, or nil if no Xrefs were found."
                ;; were no references and the in-reply-to header looks
                ;; promising.
                (if (and (search-forward "\nin-reply-to: " nil t)
-                        (setq in-reply-to (gnus-header-value))
+                        (setq in-reply-to (nnheader-header-value))
                         (string-match "<[^>]+>" in-reply-to))
                    (setq ref (substring in-reply-to (match-beginning 0)
                                         (match-end 0)))
@@ -4191,7 +4188,7 @@ The resulting hash table is returned, or nil if no Xrefs were found."
            (progn
              (goto-char p)
              (and (search-forward "\nxref: " nil t)
-                  (gnus-header-value)))))
+                  (nnheader-header-value)))))
          (when (equal id ref)
            (setq ref nil))
          ;; We do the threading while we read the headers.  The
@@ -5050,6 +5047,8 @@ initially.  If NEXT-GROUP, go to this group.  If BACKWARD, go to
 previous group instead."
   (interactive "P")
   (gnus-set-global-variables)
+  ;; Stop pre-fetching.
+  (gnus-async-halt-prefetch)
   (let ((current-group gnus-newsgroup-name)
        (current-buffer (current-buffer))
        entered)
@@ -6085,6 +6084,8 @@ to guess what the document format is."
 
 (defun gnus-summary-read-document (n)
   "Open a new group based on the current article(s).
+This will allow you to read digests and other similar
+documents as newsgroups.
 Obeys the standard process/prefix convention."
   (interactive "P")
   (let* ((articles (gnus-summary-work-articles n))
@@ -6403,9 +6404,14 @@ forward."
   (gnus-set-global-variables)
   (gnus-summary-select-article)
   (gnus-eval-in-buffer-window gnus-article-buffer
-    (widen)))
+    (widen)
+    (when (gnus-visual-p 'page-marker)
+      (let ((buffer-read-only nil))
+       (gnus-remove-text-with-property 'gnus-prev)
+       (gnus-remove-text-with-property 'gnus-next)))))
 
-(defun gnus-summary-move-article (&optional n to-newsgroup select-method action)
+(defun gnus-summary-move-article (&optional n to-newsgroup 
+                                           select-method action)
   "Move the current article to a different newsgroup.
 If N is a positive number, move the N next articles.
 If N is a negative number, move the N previous articles.
@@ -6453,7 +6459,8 @@ and `request-accept' functions."
     (setq to-method (or select-method 
                        (gnus-group-name-to-method to-newsgroup)))
     ;; Check the method we are to move this article to...
-    (unless (gnus-check-backend-function 'request-accept-article (car to-method))
+    (unless (gnus-check-backend-function 
+            'request-accept-article (car to-method))
       (error "%s does not support article copying" (car to-method)))
     (unless (gnus-check-server to-method)
       (error "Can't open server %s" (car to-method)))
@@ -7519,11 +7526,11 @@ If ALL is non-nil, also mark ticked and dormant articles as read."
 If prefix argument ALL is non-nil, all articles are marked as read."
   (interactive "P")
   (gnus-set-global-variables)
-  (gnus-summary-catchup all quietly nil 'fast)
-  ;; Select next newsgroup or exit.
-  (if (eq gnus-auto-select-next 'quietly)
-      (gnus-summary-next-group nil)
-    (gnus-summary-exit)))
+  (when (gnus-summary-catchup all quietly nil 'fast)
+    ;; Select next newsgroup or exit.
+    (if (eq gnus-auto-select-next 'quietly)
+       (gnus-summary-next-group nil)
+      (gnus-summary-exit))))
 
 (defun gnus-summary-catchup-all-and-exit (&optional quietly)
   "Mark all articles in this newsgroup as read, and then exit."
@@ -8042,22 +8049,19 @@ save those articles instead."
                     (setq split-name (append result split-name)))))))))
     split-name))
 
+(defun gnus-valid-move-group-p (group)
+  (and (boundp group)
+       (symbol-name group)
+       (memq 'respool
+            (assoc (symbol-name
+                    (car (gnus-find-method-for-group
+                          (symbol-name group))))
+                   gnus-valid-select-methods))))
+
 (defun gnus-read-move-group-name (prompt default articles prefix)
   "Read a group name."
   (let* ((split-name (gnus-get-split-value gnus-move-split-methods))
         (minibuffer-confirm-incomplete nil) ; XEmacs
-        group-map
-        (dum (mapatoms
-              (lambda (g)
-                (and (boundp g)
-                     (symbol-name g)
-                     (memq 'respool
-                           (assoc (symbol-name
-                                   (car (gnus-find-method-for-group
-                                         (symbol-name g))))
-                                  gnus-valid-select-methods))
-                     (push (list (symbol-name g)) group-map)))
-              gnus-active-hashtb))
         (prom
          (format "%s %s to:"
                  prompt
@@ -8068,11 +8072,15 @@ save those articles instead."
          (cond
           ((null split-name)
            (gnus-completing-read default prom
-                                 group-map nil nil prefix
+                                 gnus-active-hashtb
+                                 'gnus-valid-move-group-p
+                                 nil prefix
                                  'gnus-group-history))
           ((= 1 (length split-name))
-           (gnus-completing-read (car split-name) prom group-map
-                                 nil nil nil
+           (gnus-completing-read (car split-name) prom
+                                 gnus-active-hashtb
+                                 'gnus-valid-move-group-p
+                                 nil nil
                                  'gnus-group-history))
           (t
            (gnus-completing-read nil prom 
@@ -8081,19 +8089,19 @@ save those articles instead."
                                  nil nil nil
                                  'gnus-group-history)))))
     (when to-newsgroup
-      (when (or (string= to-newsgroup "")
-               (string= to-newsgroup prefix))
-       (setq to-newsgroup (or default "")))
+      (if (or (string= to-newsgroup "")
+             (string= to-newsgroup prefix))
+         (setq to-newsgroup (or default "")))
       (or (gnus-active to-newsgroup)
          (gnus-activate-group to-newsgroup)
-         (when (gnus-y-or-n-p (format "No such group: %s.  Create it? "
-                                      to-newsgroup))
-           (or (and (gnus-request-create-group 
-                     to-newsgroup (gnus-group-name-to-method to-newsgroup))
-                    (gnus-activate-group to-newsgroup nil nil
-                                         (gnus-group-name-to-method
-                                          to-newsgroup)))
-               (error "Couldn't create group %s" to-newsgroup)))
+         (if (gnus-y-or-n-p (format "No such group: %s.  Create it? "
+                                    to-newsgroup))
+             (or (and (gnus-request-create-group 
+                       to-newsgroup (gnus-group-name-to-method to-newsgroup))
+                      (gnus-activate-group to-newsgroup nil nil
+                                           (gnus-group-name-to-method
+                                            to-newsgroup)))
+                 (error "Couldn't create group %s" to-newsgroup)))
          (error "No such group: %s" to-newsgroup)))
     to-newsgroup))
 
index 179fe85..fa1136a 100644 (file)
@@ -437,11 +437,15 @@ articles in the topic and its subtopics."
       (while (and (zerop (forward-line 1))
                  (> (or (gnus-group-topic-level) (1+ level)) level)))
       (delete-region beg (point))
-      (setcdr (cadr (gnus-topic-find-topology topic))
-             (if insert (list 'visible) (list 'invisible)))
-      (when hide
-       (setcdr (cdadr (gnus-topic-find-topology topic))
-               (list hide)))
+      ;; Do the change in this rather odd manner because it has been
+      ;; reported that some topics share parts of some lists, for some
+      ;; reason.  I have been unable to determine why this is the
+      ;; case, but this hack seems to take care of things.
+      (let ((data (cadr (gnus-topic-find-topology topic))))
+       (setcdr data
+               (list (if insert 'visible 'invisible)
+                     (if hide 'hide nil)
+                     (cadddr data))))
       (unless total-remove
        (gnus-topic-insert-topic topic in-level)))))
 
@@ -914,7 +918,8 @@ articles in the topic and its subtopics."
       (remove-hook 'gnus-group-change-level-function 
                   'gnus-topic-change-level)
       (remove-hook 'gnus-check-bogus-groups-hook 'gnus-topic-clean-alist)
-      (setq gnus-group-prepare-function 'gnus-group-prepare-flat))
+      (setq gnus-group-prepare-function 'gnus-group-prepare-flat)
+      (setq gnus-group-sort-alist-function 'gnus-group-sort-flat))
     (when redisplay
       (gnus-group-list-groups))))
     
index a1da976..b88f7a1 100644 (file)
@@ -234,6 +234,11 @@ The headers will be included in the sequence they are matched.")
 (defvar gnus-uu-save-separate-articles nil
   "*Non-nil means that gnus-uu will save articles in separate files.")
 
+(defvar gnus-uu-be-dangerous 'ask
+  "*Specifies what to do if unusual situations arise during decoding.
+If nil, be as conservative as possible.  If t, ignore things that
+didn't work, and overwrite existing files.  Otherwise, ask each time.")
+
 ;; Internal variables
 
 (defvar gnus-uu-saved-article-name nil)
@@ -718,7 +723,10 @@ The headers will be included in the sequence they are matched.")
            (gnus-make-directory (concat dir fromdir))
          (setq to-file (concat dir fromdir))
          (when (or (not (file-exists-p to-file))
-                   (gnus-y-or-n-p (format "%s exists; overwrite? " to-file)))
+                   (eq gnus-uu-be-dangerous t)
+                   (and gnus-uu-be-dangerous
+                        (gnus-y-or-n-p (format "%s exists; overwrite? "
+                                               to-file))))
            (copy-file file to-file t t)))))
     (gnus-message 5 "Saved %d file%s" len (if (= len 1) "" "s"))))
 
@@ -1000,6 +1008,7 @@ The headers will be included in the sequence they are matched.")
   (let (articles)
     (cond 
      (n
+      (setq n (prefix-numeric-value n))
       (let ((backward (< n 0))
            (n (abs n)))
        (save-excursion
@@ -1185,9 +1194,11 @@ The headers will be included in the sequence they are matched.")
          ;; file was unsuccessfully decoded, so we delete it.
          (when (and result-file 
                     (file-exists-p result-file)
-                    (gnus-y-or-n-p
-                     (format "Delete unsuccessfully decoded file %s"
-                             result-file)))
+                    (not gnus-uu-be-dangerous)
+                    (or (eq gnus-uu-be-dangerous t)
+                        (gnus-y-or-n-p
+                         (format "Delete unsuccessfully decoded file %s"
+                                 result-file))))
            (delete-file result-file)))
        (when (memq 'begin process-state)
          (setq result-file (car process-state)))
@@ -1224,7 +1235,9 @@ The headers will be included in the sequence they are matched.")
           (not (memq 'end process-state))
           result-file 
           (file-exists-p result-file)
-          (gnus-y-or-n-p (format "Delete incomplete file %s? " result-file))
+          (not gnus-uu-be-dangerous)
+          (or (eq gnus-uu-be-dangerous t)
+              (gnus-y-or-n-p (format "Delete incomplete file %s? " result-file)))
           (delete-file result-file))
 
       ;; If this was a file of the wrong sort, then 
index b353b77..9dd64c2 100644 (file)
@@ -42,7 +42,7 @@
   "Score and kill file handling."
   :group 'gnus )
 
-(defconst gnus-version-number "0.53"
+(defconst gnus-version-number "0.54"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
@@ -71,23 +71,24 @@ be set in `.emacs' instead."
        (t
         'ignore)))
 
-(defalias 'gnus-make-overlay 'make-overlay)
-(defalias 'gnus-overlay-put 'overlay-put)
-(defalias 'gnus-move-overlay 'move-overlay)
-(defalias 'gnus-overlay-end 'overlay-end)
-(defalias 'gnus-extent-detached-p 'ignore)
-(defalias 'gnus-extent-start-open 'ignore)
-(defalias 'gnus-set-text-properties 'set-text-properties)
-(defalias 'gnus-group-remove-excess-properties 'ignore)
-(defalias 'gnus-topic-remove-excess-properties 'ignore)
-(defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window)
-(defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
-(defalias 'gnus-make-local-hook 'make-local-hook)
-(defalias 'gnus-add-hook 'add-hook)
-(defalias 'gnus-character-to-event 'identity)
-(defalias 'gnus-add-text-properties 'add-text-properties)
-(defalias 'gnus-put-text-property 'put-text-property)
-(defalias 'gnus-mode-line-buffer-identification 'identity)
+(when (not (featurep 'gnus-xmas))
+  (progn (defalias 'gnus-make-overlay 'make-overlay)
+        (defalias 'gnus-overlay-put 'overlay-put)
+        (defalias 'gnus-move-overlay 'move-overlay)
+        (defalias 'gnus-overlay-end 'overlay-end)
+        (defalias 'gnus-extent-detached-p 'ignore)
+        (defalias 'gnus-extent-start-open 'ignore)
+        (defalias 'gnus-set-text-properties 'set-text-properties)
+        (defalias 'gnus-group-remove-excess-properties 'ignore)
+        (defalias 'gnus-topic-remove-excess-properties 'ignore)
+        (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window)
+        (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
+        (defalias 'gnus-make-local-hook 'make-local-hook)
+        (defalias 'gnus-add-hook 'add-hook)
+        (defalias 'gnus-character-to-event 'identity)
+        (defalias 'gnus-add-text-properties 'add-text-properties)
+        (defalias 'gnus-put-text-property 'put-text-property)
+        (defalias 'gnus-mode-line-buffer-identification 'identity)))
 
 ;; The XEmacs people think this is evil, so it must go.
 (defun custom-face-lookup (&optional fg bg stipple bold italic underline)
@@ -758,6 +759,9 @@ want.")
 (defvar gnus-slave nil
   "Whether this Gnus is a slave or not.")
 
+(defvar gnus-batch-mode nil
+  "Whether this Gnus is running in batch mode or not.")
+
 (defvar gnus-variable-list
   '(gnus-newsrc-options gnus-newsrc-options-n
     gnus-newsrc-last-checked-date
@@ -792,8 +796,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
 (defvar gnus-active-hashtb nil
   "Hashtable of active articles.")
 
-(defvar gnus-moderated-list nil
-  "List of moderated newsgroups.")
+(defvar gnus-moderated-hashtb nil
+  "Hashtable of moderated newsgroups.")
 
 ;; Save window configuration.
 (defvar gnus-prev-winconf nil)
@@ -960,7 +964,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
      ("gnus-logic" gnus-score-advanced)
      ("gnus-undo" gnus-undo-mode gnus-undo-register)
      ("gnus-async" gnus-async-request-fetched-article gnus-async-prefetch-next
-      gnus-async-prefetch-article gnus-async-prefetch-remove-group)
+      gnus-async-prefetch-article gnus-async-prefetch-remove-group
+      gnus-async-halt-prefetch)
      ("article" article-decode-rfc1522)
      ("gnus-vm" :interactive t gnus-summary-save-in-vm
       gnus-summary-save-article-vm))))
index 23cb5fe..5abab32 100644 (file)
@@ -961,8 +961,9 @@ C-c C-r  message-caesar-buffer-body (rot13 the message body)."
   "Move point to the beginning of the message signature."
   (interactive)
   (goto-char (point-min))
-  (or (re-search-forward message-signature-separator nil t)
-      (goto-char (point-max))))
+  (if (re-search-forward message-signature-separator nil t)
+      (forward-line 1)
+    (goto-char (point-max))))
 
 \f
 
@@ -1643,9 +1644,12 @@ to find out how to use this."
                   (re-search-forward "^[^ \t:]+: " nil t))
         (save-excursion
           (or (re-search-forward 
-               (concat "^" (setq found
-                                 (buffer-substring
-                                  (match-beginning 0) (- (match-end 0) 2))))
+               (concat "^" 
+                       (regexp-quote
+                        (setq found
+                              (buffer-substring
+                               (match-beginning 0) (- (match-end 0) 2))))
+                       ":")
                nil t)
               (setq found nil))))
        (if found
index b44c247..e9bd427 100644 (file)
@@ -146,7 +146,11 @@ on your system, you could say something like:
 ;; Parsing headers and NOV lines.
 
 (defsubst nnheader-header-value ()
-  (buffer-substring (match-end 0) (gnus-point-at-eol)))
+  (buffer-substring 
+   (match-end 0) 
+   (if (re-search-forward "^[^ \t]" nil 'move)
+       (- (point) 2)
+     (1- (point)))))
 
 (defvar nnheader-newsgroup-none-id 1)
 
@@ -748,6 +752,16 @@ find-file-hooks, etc.
         (after-insert-file-functions nil))
     (insert-file-contents filename visit beg end replace)))
 
+(defun nnheader-directory-regular-files (dir)
+  "Return a list of all regular files in DIR."
+  (let ((files (directory-files dir t))
+       out)
+    (while files
+      (when (file-regular-p (car files))
+       (push (car files) out))
+      (pop files))
+    (nreverse out)))
+
 (fset 'nnheader-run-at-time 'run-at-time)
 (fset 'nnheader-cancel-timer 'cancel-timer)
 (fset 'nnheader-cancel-function-timers 'cancel-function-timers)
index 6eb6442..627d479 100644 (file)
@@ -106,7 +106,9 @@ Eg.:
 This variable is \"/usr/spool/mail/$user\" by default.
 If this variable is nil, no mail backends will read incoming mail.
 If this variable is a list, all files mentioned in this list will be
-used as incoming mailboxes.")
+used as incoming mailboxes.
+If this variable is a directory (i. e., it's name ends with a \"/\"),
+treat all files in that directory as incoming spool files.")
 
 (defvar nnmail-crash-box "~/.gnus-crash-box"
   "*File where Gnus will store mail while processing it.")
@@ -626,15 +628,22 @@ is a spool.  If not using procmail, return GROUP."
   "Put point at the beginning of the next message."
   (let ((case-fold-search t)
        (delim (concat "^" message-unix-mail-delimiter))
-       found)
+       found search )
     (while (not found)
-      (if (re-search-forward delim nil t)
-         (when (or (looking-at "[^\n :]+ *:")
-                   (looking-at delim)
-                   (looking-at (concat ">" message-unix-mail-delimiter)))
-           (forward-line -1)
-           (setq found 'yes))
-       (setq found 'no)))
+      (setq search (condition-case ()
+                      (re-search-forward delim nil t)
+                    (error 'error)))
+      (cond 
+       ((eq search 'error)
+       (setq found 'yes))
+       (search
+       (when (or (looking-at "[^\n :]+ *:")
+                 (looking-at delim)
+                 (looking-at (concat ">" message-unix-mail-delimiter)))
+         (forward-line -1)
+         (setq found 'yes)))
+       (t
+       (setq found 'no))))
     (eq found 'yes)))
 
 (defun nnmail-process-unix-mail-format (func artnum-func)
@@ -1041,9 +1050,24 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
                   (eq nnmail-spool-file 'procmail))
              nil)
             ((listp nnmail-spool-file)
-             (append nnmail-spool-file procmails))
-            ((stringp nnmail-spool-file)
+             (nconc
+              (apply 
+               'nconc
+               (mapcar 
+                (lambda (file)
+                  (if (file-directory-p file)
+                      (nnheader-directory-regular-files file)
+                    (list file)))
+                nnmail-spool-file))
+              procmails))
+            ((and (stringp nnmail-spool-file)
+                  (not (file-directory-p nnmail-spool-file)))
              (cons nnmail-spool-file procmails))
+            ((and (stringp nnmail-spool-file)
+                  (file-directory-p nnmail-spool-file))
+             (nconc
+              (nnheader-directory-regular-files nnmail-spool-file)
+              procmails))
             ((eq nnmail-spool-file 'pop)
              (cons (format "po:%s" (user-login-name)) procmails))
             (t
@@ -1298,13 +1322,19 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
             (nnmail-time-less days (nnmail-time-since time)))))))
 
 (defvar nnmail-read-passwd nil)
-(defun nnmail-read-passwd (prompt)
-  (unless nnmail-read-passwd
-    (if (load "passwd" t)
-       (setq nnmail-read-passwd 'read-passwd)
-      (autoload 'ange-ftp-read-passwd "ange-ftp")
-      (setq nnmail-read-passwd 'ange-ftp-read-passwd)))
-  (funcall nnmail-read-passwd prompt))
+(defun nnmail-read-passwd (prompt &rest args)
+  "Read a password using PROMPT.
+If ARGS, PROMPT is used as an argument to `format'."
+  (let ((prompt
+        (if args
+            (apply 'format prompt args)
+          prompt)))
+    (unless nnmail-read-passwd
+      (if (load "passwd" t)
+         (setq nnmail-read-passwd 'read-passwd)
+       (autoload 'ange-ftp-read-passwd "ange-ftp")
+       (setq nnmail-read-passwd 'ange-ftp-read-passwd)))
+    (funcall nnmail-read-passwd prompt)))
 
 (defun nnmail-check-syntax ()
   "Check (and modify) the syntax of the message in the current buffer."
index 8c99fe8..0a381fc 100644 (file)
@@ -445,18 +445,21 @@ reading."
   "Send the AUTHINFO to the nntp server.
 This function is supposed to be called from `nntp-server-opened-hook'.
 It will prompt for a password."
-  (nntp-send-command "^.*\r?\n" "AUTHINFO USER"
-                    (read-string "NNTP user name: "))
-  (nntp-send-command "^.*\r?\n" "AUTHINFO PASS" 
-                    (nnmail-read-passwd "NNTP password: ")))
+  (nntp-send-command 
+   "^.*\r?\n" "AUTHINFO USER"
+   (read-string "NNTP (%s) user name: " nntp-address))
+  (nntp-send-command 
+   "^.*\r?\n" "AUTHINFO PASS" 
+   (nnmail-read-passwd "NNTP (%s) password: " nntp-address)))
 
 (defun nntp-send-authinfo ()
   "Send the AUTHINFO to the nntp server.
 This function is supposed to be called from `nntp-server-opened-hook'.
 It will prompt for a password."
   (nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name))
-  (nntp-send-command "^.*\r?\n" "AUTHINFO PASS" 
-                    (read-string "NNTP password: ")))
+  (nntp-send-command
+   "^.*\r?\n" "AUTHINFO PASS" 
+   (read-string "NNTP (%s) password: " nntp-address)))
 
 (defun nntp-send-authinfo-from-file ()
   "Send the AUTHINFO to the nntp server.
@@ -583,7 +586,9 @@ It will prompt for a password."
            (save-excursion
              (set-buffer nntp-server-buffer)
              (nntp-read-server-type)
-             (run-hooks 'nntp-server-opened-hook)))
+             (run-hooks 'nntp-server-opened-hook)
+             (set-buffer pbuffer)
+             (erase-buffer)))
        (when (buffer-name (process-buffer process))
          (kill-buffer (process-buffer process)))
        nil))))
@@ -738,7 +743,8 @@ It will prompt for a password."
   (when group
     (let ((entry (nntp-find-connection-entry nntp-server-buffer)))
       (when (not (equal group (caddr entry)))
-       (nntp-request-group group)))))
+       (nntp-request-group group)
+       (erase-buffer)))))
 
 (defun nntp-decode-text (&optional cr-only)
   "Decode the text in the current buffer."
index d42559b..ce264d4 100644 (file)
@@ -388,7 +388,7 @@ virtual group.")
                (mapcar
                 (lambda (g)
                   (when (and (setq active (gnus-activate-group g))
-                             (> (cdr active) (car active)))
+                             (>= (cdr active) (car active)))
                     (setq unreads (gnus-list-of-unread-articles g)
                           marks (gnus-uncompress-marks
                                  (gnus-info-marks (gnus-get-info g))))
index f779619..a35794f 100644 (file)
          (setq header (nnheader-parse-nov))
          (forward-line 1)
          (push (list (mail-header-number header)
-                     header (mail-header-xrefs header))
+                     header (nnheader-header-xref header))
                nnweb-articles)
          (nnweb-set-hashtb header (car nnweb-articles)))))))
 
        (nnheader-insert-nov (cadr (pop articles)))))))
 
 (defun nnweb-set-hashtb (header data)
-  (gnus-sethasb (nnweb-identifier (mail-header-xrefs header))
-               data nnweb-hashtb))
+  (gnus-sethastb (nnweb-identifier (mail-header-xrefs header))
+                data nnweb-hashtb))
 
 (defun nnweb-get-hashtb (url)
   (gnus-gethash (nnweb-identifier url) nnweb-hashtb))
index 7985962..276ee48 100644 (file)
@@ -1,3 +1,12 @@
+Tue Nov  5 10:45:39 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.texi (Other Decode Variables): Addition.
+       (Mail-like Backends): New.
+
+Tue Nov  5 06:41:46 1996  Hrvoje Niksic  <hniksic@srce.hr>
+
+       * gnus.texi (Score File Format): Added warning.
+
 Mon Oct 28 15:50:08 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
 
        * gnus.texi (Startup Variables): Addition.
index 3bd7edb..2451565 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Red Gnus 0.53 Manual
+@settitle Red Gnus 0.54 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -287,7 +287,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Red Gnus 0.53 Manual
+@title Red Gnus 0.54 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -5367,6 +5367,13 @@ View the file.
 Move the file (if you're using a saving function.)
 @end table
 
+@item gnus-uu-be-dangerous
+@vindex gnus-uu-be-dangerous
+Specifies what to do if unusual situations arise during decoding.  If
+@code{nil}, be as conservative as possible.  If @code{t}, ignore things
+that didn't work, and overwrite existing files.  Otherwise, ask each
+time.
+
 @item gnus-uu-ignore-files-by-name
 @vindex gnus-uu-ignore-files-by-name
 Files with name matching this regular expression won't be viewed.
@@ -6110,6 +6117,8 @@ header of the article by pushing @kbd{A R}
 
 @findex gnus-summary-refer-article
 @kindex M-^ (Summary)
+@cindex Message-ID
+@cindex fetching by Message-ID
 You can also ask the @sc{nntp} server for an arbitrary article, no
 matter what group it belongs to.  @kbd{M-^}
 (@code{gnus-summary-refer-article}) will ask you for a
@@ -10166,7 +10175,7 @@ silently to help keep the sizes of the score files down.
 * Score Variables::          Customize your scoring.  (My, what terminology).
 * Score File Format::        What a score file may contain.
 * Score File Editing::       You can edit score files by hand as well.
-* Adaptive Scoring::         Big Sister Gnus @emph{knows} what you read.
+* Adaptive Scoring::         Big Sister Gnus knows what you read.
 * Home Score File::          How to say where new score entries are to go.
 * Followups To Yourself::    Having Gnus notice when people answer you.
 * Scoring Tips::             How to score effectively.
@@ -10678,7 +10687,11 @@ instead, if you feel like.
 
 @item Lines, Chars
 These two headers use different match types: @code{<}, @code{>},
-@code{=}, @code{>=} and @code{<=}.
+@code{=}, @code{>=} and @code{<=}.  When matching on @code{Lines}, be
+careful because some backends (like @code{nndir}) do not generate
+@code{Lines} header, so every article ends up being marked as having 0
+lines.  This can lead to strange results if you happen to lower score of
+the articles with few lines.
 
 @item Date
 For the Date header we have three kinda silly match types:
@@ -14642,6 +14655,7 @@ In the examples and definitions I will refer to the imaginary backend
 * Error Messaging::                   How to get messages and report errors.
 * Writing New Backends::              Extending old backends.
 * Hooking New Backends Into Gnus::    What has to be done on the Gnus end.
+* Mail-like Backends::                Some tips on mail backends.
 @end menu
 
 
@@ -15299,6 +15313,58 @@ The user should be prompted for an address when doing commands like
 @end table
 
 
+@node Mail-like Backends
+@subsubsection Mail-like Backends
+
+One of the things that separate the mail backends from the rest of the
+backends is the heavy dependence by the mail backends on common
+functions in @file{nnmail.el}.  For instance, here's the definition of
+@code{nnml-request-scan}: 
+
+@lisp
+(deffoo nnml-request-scan (&optional group server)
+  (setq nnml-article-file-alist nil)
+  (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
+@end lisp
+
+It simply just calls @code{nnmail-get-new-mail} will a few parameters,
+and @code{nnmail} takes care of all the moving and splitting of the
+mail.  
+
+This function takes four parameters.
+
+@table @var
+@item method
+This should be a symbol to designate which backend is responsible for
+the call.
+
+@item exit-function
+This function should be called after the splitting has been performed.
+
+@item temp-directory
+Where the temporary files should be stored.
+
+@item group
+This optional argument should be a group name if the splitting is to be
+performed for one group only.
+@end table
+
+@code{nnmail-get-new-mail} will call @var{backend}@code{-save-mail} to
+save each article.  @var{backend}@code{-active-number} will be called to
+find the article number assigned to this article.  
+
+The function also uses the following variables:
+@var{backend}@code{-get-new-mail} (to see whether to get new mail for
+this backend); and @var{backend}@code{-group-alist} and
+@var{backend}@code{-active-file} to generate the new active file.
+@var{backend}@code{-group-alist} should be a group-active alist, like
+this:
+
+@example
+(("a-group" (1 . 10))
+ ("some-group" (34 . 39)))
+@end example
+
 
 @node Score File Syntax
 @subsection Score File Syntax