Quassia Gnus v0.25.
authormorioka <morioka>
Sun, 15 Feb 1998 14:55:45 +0000 (14:55 +0000)
committermorioka <morioka>
Sun, 15 Feb 1998 14:55:45 +0000 (14:55 +0000)
17 files changed:
lisp/ChangeLog
lisp/gnus-art.el
lisp/gnus-async.el
lisp/gnus-cite.el
lisp/gnus-cus.el
lisp/gnus-draft.el
lisp/gnus-sum.el
lisp/gnus.el
lisp/message.el
lisp/nndoc.el
lisp/nnfolder.el
lisp/nnmail.el
lisp/nnmh.el
lisp/nntp.el
texi/ChangeLog
texi/gnus.texi
texi/message.texi

index 05f5a16..3ec0d58 100644 (file)
@@ -1,3 +1,79 @@
+Fri Feb 13 22:40:39 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus.el: Quassia Gnus v0.25 is released.
+
+Fri Feb 13 19:01:19 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nndoc.el (nndoc-type-alist): Allow blank lines to separate
+       headers from bodies.
+
+       * gnus-art.el (gnus-article-edit): Restore Date header.
+
+       * gnus-async.el (gnus-asynch-obarray): New variable.
+       (gnus-async-prefetched-article-entry): Use it.
+       (gnus-async-set-buffer): Use it.
+
+       * nnmh.el (nnmh-active-number): Create parent dirs.
+
+       * nntp.el (nntp-last-command): New variable.
+       (nntp-handle-authinfo): New function.
+
+       * gnus-sum.el (gnus-summary-exit): Call purging function.
+
+Fri Feb 13 18:59:16 1998  François Pinard  <pinard@iro.umontreal.ca>
+
+       * nnmail.el (nnmail-get-new-mail): Don't clear split-history.
+       (nnmail-purge-split-history): New function.
+
+Fri Feb 13 18:36:16 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nntp.el (nntp-telnet-shell-prompt): Renamed.
+
+Fri Feb 13 18:35:23 1998  Sam Falkner  <samf@channelpoint.com>
+
+       * nntp.el (nntp-open-telnet-envuser): New variable.
+
+Fri Feb 13 18:29:23 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * message.el (message-send-mail-function): Added smtpmail-send-it.
+
+1998-02-11  Dave Love  <d.love@dl.ac.uk>
+
+       * gnus-art.el (gnus-button-url): Don't lose in Emacs 20 with
+       browse-url-browser-function an alist, not a function.
+       (gnus-button-embedded-url): Likewise.
+
+Fri Feb 13 17:10:31 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-cite.el (gnus-cite-localize): New function.
+       (gnus-cite-close): Renamed.
+       (gnus-cite-parse-maybe): Use it.
+
+       * gnus-sum.el (gnus-summary-move-article): Move back to summary
+       buffer. 
+
+       * nnfolder.el (nnfolder-request-accept-article): Save excursion.
+       (nnfolder-request-move-article): Ditto.
+
+       * nntp.el (nntp-find-connection): Don't message.
+
+Fri Feb 13 14:51:56 1998  MORIOKA Tomohiko  <steve@xemacs.org>
+
+       * message.el (message-send-mail-with-qmail): Fix.
+
+1998-02-13  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus-draft.el (gnus-draft-make-menu-bar): Added missing commands.
+
+1998-01-06  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus/gnus-cus.el (gnus-score-parameters): Make `files' and
+       `exclude-files' widgets inline.
+
+Fri Feb 13 12:46:23 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus-sum.el (gnus-article-mark): Dox dox.
+
 Wed Feb 11 15:05:03 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus.el: Quassia Gnus v0.24 is released.
index 5fc5541..5bebe19 100644 (file)
@@ -2597,6 +2597,7 @@ groups."
   (when (and (not force)
             (gnus-group-read-only-p))
     (error "The current newsgroup does not support article editing"))
+  (gnus-article-date-original)
   (gnus-article-edit-article
    `(lambda (no-highlight)
       (gnus-summary-edit-article-done
@@ -3187,11 +3188,17 @@ forbidden in URL encoding."
 
 (defun gnus-button-url (address)
   "Browse ADDRESS."
-  (funcall browse-url-browser-function address))
+  ;; In Emacs 20, `browse-url-browser-function' may be an alist.
+  (if (listp browse-url-browser-function)
+      (browse-url address)
+    (funcall browse-url-browser-function address)))
 
 (defun gnus-button-embedded-url (address)
   "Browse ADDRESS."
-  (funcall browse-url-browser-function (gnus-strip-whitespace address)))
+  ;; In Emacs 20, `browse-url-browser-function' may be an alist.
+  (if (listp browse-url-browser-function)
+      (browse-url (gnus-strip-whitespace address))
+    (funcall browse-url-browser-function (gnus-strip-whitespace address))))
 
 ;;; Next/prev buttons in the article buffer.
 
index b8d4d13..c8a9cf1 100644 (file)
@@ -77,6 +77,7 @@ It should return non-nil if the article is to be prefetched."
 (defvar gnus-async-article-alist nil)
 (defvar gnus-async-article-semaphore '(nil))
 (defvar gnus-async-fetch-list nil)
+(defvar gnus-asynch-obarray nil)
 
 (defvar gnus-async-prefetch-headers-buffer " *Async Prefetch Headers*")
 (defvar gnus-async-header-prefetched nil)
@@ -120,7 +121,10 @@ It should return non-nil if the article is to be prefetched."
        gnus-async-header-prefetched nil))
 
 (defun gnus-async-set-buffer ()
-  (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t))
+  (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t)
+  (unless gnus-asynch-obarray
+    (set (make-local-variable 'gnus-asynch-obarray)
+        (gnus-make-hashtable 1023))))
 
 (defun gnus-async-halt-prefetch ()
   "Stop prefetching."
@@ -209,7 +213,8 @@ It should return non-nil if the article is to be prefetched."
        (when arg
         (gnus-async-set-buffer)
         (gnus-async-with-semaphore
-         (push (list ',(intern (format "%s-%d" group article))
+         (push (list ',(intern (format "%s-%d" group article)
+                               gnus-asynch-obarray)
                      ,mark (set-marker (make-marker) (point-max))
                      ,group ,article)
                gnus-async-article-alist)))
@@ -259,8 +264,11 @@ It should return non-nil if the article is to be prefetched."
 
 (defun gnus-async-prefetched-article-entry (group article)
   "Return the entry for ARTICLE in GROUP iff it has been prefetched."
-  (let ((entry (assq (intern (format "%s-%d" group article))
-                    gnus-async-article-alist)))
+  (let ((entry (save-excursion
+                (gnus-async-set-buffer)
+                (assq (intern (format "%s-%d" group article)
+                              gnus-asynch-obarray)
+                      gnus-async-article-alist))))
     ;; Perhaps something has emptied the buffer?
     (if (and entry
             (= (cadr entry) (caddr entry)))
index 0a1c4c5..7aa68ab 100644 (file)
@@ -571,8 +571,10 @@ See also the documentation for `gnus-article-highlight-citation'."
 
 (defun gnus-cite-parse-maybe (&optional force)
   ;; Parse if the buffer has changes since last time.
-  (if (and (not force) (equal gnus-cite-article gnus-article-current))
+  (if (and (not force)
+          (equal gnus-cite-article gnus-article-current))
       ()
+    (gnus-cite-localize)
     ;;Reset parser information.
     (setq gnus-cite-prefix-alist nil
          gnus-cite-attribution-alist nil
@@ -906,10 +908,14 @@ See also the documentation for `gnus-article-highlight-citation'."
        (setq prefix (car entry))))
     prefix))
 
-(gnus-add-shutdown 'gnus-cache-close 'gnus)
-
-(defun gnus-cache-close ()
-  (setq gnus-cite-prefix-alist nil))
+(defun gnus-cite-localize ()
+  "Make the citation variables local to the article buffer."
+  (let ((vars '(gnus-cite-article
+               gnus-cite-overlay-list gnus-cite-prefix-alist
+               gnus-cite-attribution-alist gnus-cite-loose-prefix-alist
+               gnus-cite-loose-attribution-alist)))
+    (while vars
+      (make-local-variable (pop vars)))))
 
 (gnus-ems-redefine)
 
index dfbff5d..339914b 100644 (file)
@@ -287,12 +287,12 @@ number will be marked as read and removed from the summary buffer.
 `gnus-thread-score-function' says how to compute the total score
 for a thread.")
 
-    (files (repeat :tag "Files" file) "\
+    (files (repeat :inline t :tag "Files" file) "\
 The value of this entry should be any number of file names.
 These files are assumed to be score files as well, and will be loaded
 the same way this one was.")
 
-    (exclude-files (repeat :tag "Exclude-files" file) "\
+    (exclude-files (repeat :inline t :tag "Exclude-files" file) "\
 The clue of this entry should be any number of files.
 These files will not be loaded, even though they would normally be so,
 for some reason or other.")
index e3af17a..9223727 100644 (file)
     (easy-menu-define
      gnus-draft-menu gnus-draft-mode-map ""
      '("Drafts"
-       ["Toggle whether to send" gnus-draft-toggle-sending t]))))
+       ["Toggle whether to send" gnus-draft-toggle-sending t]
+       ["Edit" gnus-draft-edit-message t]
+       ["Send selected message(s)" gnus-draft-send-message t]
+       ["Send all messages" gnus-draft-send-all-messages t]))))
 
 (defun gnus-draft-mode (&optional arg)
   "Minor mode for providing a draft summary buffers.
index 22d54d6..72a1ffb 100644 (file)
@@ -2173,10 +2173,12 @@ article number."
         (gnus-summary-last-subject))))
 
 (defmacro gnus-summary-article-header (&optional number)
+  "Return the header of article NUMBER."
   `(gnus-data-header (gnus-data-find
                      ,(or number '(gnus-summary-article-number)))))
 
 (defmacro gnus-summary-thread-level (&optional number)
+  "Return the level of thread that starts with article NUMBER."
   `(if (and (eq gnus-summary-make-false-root 'dummy)
            (get-text-property (point) 'gnus-intangible))
        0
@@ -2184,10 +2186,12 @@ article number."
                       ,(or number '(gnus-summary-article-number))))))
 
 (defmacro gnus-summary-article-mark (&optional number)
+  "Return the mark of article NUMBER."
   `(gnus-data-mark (gnus-data-find
                    ,(or number '(gnus-summary-article-number)))))
 
 (defmacro gnus-summary-article-pos (&optional number)
+  "Return the position of the line of article NUMBER."
   `(gnus-data-pos (gnus-data-find
                   ,(or number '(gnus-summary-article-number)))))
 
@@ -2210,6 +2214,7 @@ article number."
        gnus-summary-default-score 0))
 
 (defun gnus-summary-article-children (&optional number)
+  "Return a list of article numbers that are children of article NUMBER."
   (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number))))
         (level (gnus-data-level (car data)))
         l children)
@@ -2221,6 +2226,7 @@ article number."
     (nreverse children)))
 
 (defun gnus-summary-article-parent (&optional number)
+  "Return the article number of the parent of article NUMBER."
   (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number))
                                    (gnus-data-list t)))
         (level (gnus-data-level (car data))))
@@ -2245,6 +2251,11 @@ This is all marks except unread, ticked, dormant, and expirable."
           (= mark gnus-expirable-mark))))
 
 (defmacro gnus-article-mark (number)
+  "Return the MARK of article NUMBER.
+This macro should only be used when computing the mark the \"first\"
+time; i.e., when generating the summary lines.  After that,
+`gnus-summary-article-mark' should be used to examine the
+marks of articles."
   `(cond
     ((memq ,number gnus-newsgroup-unsendable) gnus-unsendable-mark)
     ((memq ,number gnus-newsgroup-undownloaded) gnus-undownloaded-mark)
@@ -5068,6 +5079,8 @@ gnus-exit-group-hook is called with no arguments if that value is non-nil."
       (gnus-dup-enter-articles))
     (when gnus-use-trees
       (gnus-tree-close group))
+    ;; Remove entries for this group.
+    (nnmail-purge-split-history group)
     ;; Make all changes in this group permanent.
     (unless quit-config
       (run-hooks 'gnus-exit-group-hook)
@@ -7035,6 +7048,9 @@ and `request-accept' functions."
              (gnus-request-replace-article
               article gnus-newsgroup-name (current-buffer)))))
 
+       ;;;!!!Why is this necessary?
+       (set-buffer gnus-summary-buffer)
+       
        (gnus-summary-goto-subject article)
        (when (eq action 'move)
          (gnus-summary-mark-article article gnus-canceled-mark))))
index 3201236..34abacf 100644 (file)
@@ -246,7 +246,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.24"
+(defconst gnus-version-number "0.25"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number)
@@ -1529,6 +1529,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
      ("pp" pp pp-to-string pp-eval-expression)
      ("ps-print" ps-print-preprint)
      ("mail-extr" mail-extract-address-components)
+     ("browse-url" browse-url)
      ("message" :interactive t
       message-send-and-exit message-yank-original)
      ("nnmail" nnmail-split-fancy nnmail-article-group nnmail-date-to-time)
index 9539701..21b9229 100644 (file)
@@ -320,10 +320,12 @@ The headers should be delimited by a line whose contents match the
 variable `mail-header-separator'.
 
 Legal values include `message-send-mail-with-sendmail' (the default),
-`message-send-mail-with-mh' and `message-send-mail-with-qmail'."
+`message-send-mail-with-mh', `message-send-mail-with-qmail' and
+`smtpmail-send-it'."
   :type '(radio (function-item message-send-mail-with-sendmail)
                (function-item message-send-mail-with-mh)
                (function-item message-send-mail-with-qmail)
+               (function-item smtpmail-send-it)
                (function :tag "Other"))
   :group 'message-sending
   :group 'message-mail)
@@ -1807,6 +1809,7 @@ The text will also be indented the normal way."
 (defun message-dont-send ()
   "Don't send the message you have been editing."
   (interactive)
+  (save-buffer)
   (let ((actions message-postpone-actions))
     (message-bury (current-buffer))
     (message-do-actions actions)))
@@ -1983,7 +1986,8 @@ the user from the mailer."
        (save-excursion
          (set-buffer errbuf)
          (erase-buffer))))
-    (let ((default-directory "/"))
+    (let ((default-directory "/")
+         (coding-system-for-write 'binary))
       (apply 'call-process-region
             (append (list (point-min) (point-max)
                           (if (boundp 'sendmail-program)
@@ -2031,27 +2035,28 @@ to find out how to use this."
   (run-hooks 'message-send-mail-hook)
   ;; send the message
   (case
-      (apply
-       'call-process-region 1 (point-max) message-qmail-inject-program
-       nil nil nil
-       ;; qmail-inject's default behaviour is to look for addresses on the
-       ;; command line; if there're none, it scans the headers.
-       ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin.
-       ;;
-       ;; in general, ALL of qmail-inject's defaults are perfect for simply
-       ;; reading a formatted (i. e., at least a To: or Resent-To header)
-       ;; message from stdin.
-       ;;
-       ;; qmail also has the advantage of not having been raped by
-       ;; various vendors, so we don't have to allow for that, either --
-       ;; compare this with message-send-mail-with-sendmail and weep
-       ;; for sendmail's lost innocence.
-       ;;
-       ;; all this is way cool coz it lets us keep the arguments entirely
-       ;; free for -inject-arguments -- a big win for the user and for us
-       ;; since we don't have to play that double-guessing game and the user
-       ;; gets full control (no gestapo'ish -f's, for instance).  --sj
-       message-qmail-inject-args)
+      (let ((coding-system-for-write 'binary))
+       (apply
+        'call-process-region 1 (point-max) message-qmail-inject-program
+        nil nil nil
+        ;; qmail-inject's default behaviour is to look for addresses on the
+        ;; command line; if there're none, it scans the headers.
+        ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin.
+        ;;
+        ;; in general, ALL of qmail-inject's defaults are perfect for simply
+        ;; reading a formatted (i. e., at least a To: or Resent-To header)
+        ;; message from stdin.
+        ;;
+        ;; qmail also has the advantage of not having been raped by
+        ;; various vendors, so we don't have to allow for that, either --
+        ;; compare this with message-send-mail-with-sendmail and weep
+        ;; for sendmail's lost innocence.
+        ;;
+        ;; all this is way cool coz it lets us keep the arguments entirely
+        ;; free for -inject-arguments -- a big win for the user and for us
+        ;; since we don't have to play that double-guessing game and the user
+        ;; gets full control (no gestapo'ish -f's, for instance).  --sj
+        message-qmail-inject-args))
     ;; qmail-inject doesn't say anything on it's stdout/stderr,
     ;; we have to look at the retval instead
     (0 nil)
index 0ecd3ca..1727d18 100644 (file)
@@ -43,6 +43,11 @@ One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward',
 (defvoo nndoc-post-type 'mail
   "*Whether the nndoc group is `mail' or `post'.")
 
+(defvoo nndoc-open-document-hook 'nnheader-ms-strip-cr
+  "Hook run after opening a document.
+The default function removes all trailing carriage returns
+from the document.")  
+
 (defvar nndoc-type-alist
   `((mmdf
      (article-begin .  "^\^A\^A\^A\^A\n")
@@ -86,8 +91,8 @@ One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward',
      (article-begin . ,(concat "^\n" (make-string 30 ?-) "\n\n+"))
      (prepare-body-function . nndoc-unquote-dashes)
      (body-end-function . nndoc-digest-body-end)
-     (head-end . "^ ?$")
-     (body-begin . "^ ?\n")
+     (head-end . "^ *$")
+     (body-begin . "^ *\n")
      (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
      (subtype digest guess))
     (slack-digest
@@ -279,7 +284,8 @@ One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward',
        (erase-buffer)
        (if (stringp nndoc-address)
            (nnheader-insert-file-contents nndoc-address)
-         (insert-buffer-substring nndoc-address)))))
+         (insert-buffer-substring nndoc-address))
+       (run-hooks 'nndoc-open-document-hook))))
     ;; Initialize the nndoc structures according to this new document.
     (when (and nndoc-current-buffer
               (not nndoc-dissection-alist))
index 84d6cc6..0863a94 100644 (file)
@@ -329,76 +329,78 @@ time saver for large mailboxes.")
       (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
       (nconc rest articles))))
 
-(deffoo nnfolder-request-move-article
-  (article group server accept-form &optional last)
-  (let ((buf (get-buffer-create " *nnfolder move*"))
-       result)
-    (and
-     (nnfolder-request-article article group server)
-     (save-excursion
-       (set-buffer buf)
-       (buffer-disable-undo (current-buffer))
-       (erase-buffer)
-       (insert-buffer-substring nntp-server-buffer)
-       (goto-char (point-min))
-       (while (re-search-forward
-              (concat "^" nnfolder-article-marker)
-              (save-excursion (search-forward "\n\n" nil t) (point)) t)
-        (delete-region (progn (beginning-of-line) (point))
-                       (progn (forward-line 1) (point))))
-       (setq result (eval accept-form))
-       (kill-buffer buf)
-       result)
-     (save-excursion
-       (nnfolder-possibly-change-group group server)
-       (set-buffer nnfolder-current-buffer)
-       (goto-char (point-min))
-       (when (search-forward (nnfolder-article-string article) nil t)
-        (nnfolder-delete-mail))
-       (when last
-        (nnfolder-save-buffer)
-        (nnfolder-adjust-min-active group)
-        (nnmail-save-active nnfolder-group-alist nnfolder-active-file))))
-    result))
+(deffoo nnfolder-request-move-article (article group server
+                                              accept-form &optional last)
+  (save-excursion
+    (let ((buf (get-buffer-create " *nnfolder move*"))
+         result)
+      (and
+       (nnfolder-request-article article group server)
+       (save-excursion
+        (set-buffer buf)
+        (buffer-disable-undo (current-buffer))
+        (erase-buffer)
+        (insert-buffer-substring nntp-server-buffer)
+        (goto-char (point-min))
+        (while (re-search-forward
+                (concat "^" nnfolder-article-marker)
+                (save-excursion (search-forward "\n\n" nil t) (point)) t)
+          (delete-region (progn (beginning-of-line) (point))
+                         (progn (forward-line 1) (point))))
+        (setq result (eval accept-form))
+        (kill-buffer buf)
+        result)
+       (save-excursion
+        (nnfolder-possibly-change-group group server)
+        (set-buffer nnfolder-current-buffer)
+        (goto-char (point-min))
+        (when (search-forward (nnfolder-article-string article) nil t)
+          (nnfolder-delete-mail))
+        (when last
+          (nnfolder-save-buffer)
+          (nnfolder-adjust-min-active group)
+          (nnmail-save-active nnfolder-group-alist nnfolder-active-file))))
+      result)))
 
 (deffoo nnfolder-request-accept-article (group &optional server last)
-  (nnfolder-possibly-change-group group server)
-  (nnmail-check-syntax)
-  (let ((buf (current-buffer))
-       result art-group)
-    (goto-char (point-min))
-    (when (looking-at "X-From-Line: ")
-      (replace-match "From "))
-    (and
-     (nnfolder-request-list)
-     (save-excursion
-       (set-buffer buf)
-       (goto-char (point-min))
-       (search-forward "\n\n" nil t)
-       (forward-line -1)
-       (while (re-search-backward (concat "^" nnfolder-article-marker) nil t)
-        (delete-region (point) (progn (forward-line 1) (point))))
-       (when nnmail-cache-accepted-message-ids
-        (nnmail-cache-insert (nnmail-fetch-field "message-id")))
-       (setq result (if (stringp group)
-                       (list (cons group (nnfolder-active-number group)))
-                     (setq art-group
-                           (nnmail-article-group 'nnfolder-active-number))))
-       (if (and (null result)
-               (yes-or-no-p "Moved to `junk' group; delete article? "))
-          (setq result 'junk)
-        (setq result
-              (car (nnfolder-save-mail result)))))
-     (when last
+  (save-excursion
+    (nnfolder-possibly-change-group group server)
+    (nnmail-check-syntax)
+    (let ((buf (current-buffer))
+         result art-group)
+      (goto-char (point-min))
+      (when (looking-at "X-From-Line: ")
+       (replace-match "From "))
+      (and
+       (nnfolder-request-list)
        (save-excursion
-        (nnfolder-possibly-change-folder (or (caar art-group) group))
-        (nnfolder-save-buffer)
+        (set-buffer buf)
+        (goto-char (point-min))
+        (search-forward "\n\n" nil t)
+        (forward-line -1)
+        (while (re-search-backward (concat "^" nnfolder-article-marker) nil t)
+          (delete-region (point) (progn (forward-line 1) (point))))
         (when nnmail-cache-accepted-message-ids
-          (nnmail-cache-close)))))
-    (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
-    (unless result
-      (nnheader-report 'nnfolder "Couldn't store article"))
-    result))
+          (nnmail-cache-insert (nnmail-fetch-field "message-id")))
+        (setq result (if (stringp group)
+                         (list (cons group (nnfolder-active-number group)))
+                       (setq art-group
+                             (nnmail-article-group 'nnfolder-active-number))))
+        (if (and (null result)
+                 (yes-or-no-p "Moved to `junk' group; delete article? "))
+            (setq result 'junk)
+          (setq result
+                (car (nnfolder-save-mail result)))))
+       (when last
+        (save-excursion
+          (nnfolder-possibly-change-folder (or (caar art-group) group))
+          (nnfolder-save-buffer)
+          (when nnmail-cache-accepted-message-ids
+            (nnmail-cache-close)))))
+      (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
+      (unless result
+       (nnheader-report 'nnfolder "Couldn't store article"))
+      result)))
 
 (deffoo nnfolder-request-replace-article (article group buffer)
   (nnfolder-possibly-change-group group)
@@ -537,7 +539,8 @@ time saver for large mailboxes.")
          (setq nnfolder-current-group group)
 
          (when (or (not nnfolder-current-buffer)
-                   (not (verify-visited-file-modtime nnfolder-current-buffer)))
+                   (not (verify-visited-file-modtime
+                         nnfolder-current-buffer)))
            (save-excursion
              (setq file (nnfolder-group-pathname group))
              ;; See whether we need to create the new file.
index 3e9cd0f..c6cb367 100644 (file)
@@ -1547,9 +1547,6 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
 (defun nnmail-get-new-mail (method exit-func temp
                                   &optional group spool-func)
   "Read new incoming mail."
-  ;; Nix out the previous split history.
-  (unless group
-    (setq nnmail-split-history nil))
   (let* ((spools (nnmail-get-spool-files group))
         (group-in group)
         nnmail-current-spool incoming incomings spool)
@@ -1748,6 +1745,17 @@ If ARGS, PROMPT is used as an argument to `format'."
                          ", "))
        (princ "\n")))))
 
+(defun nnmail-purge-split-history (group)
+  (let ((history nnmail-split-history))
+    (while history
+      (let ((pairs (car history)))
+       (while pairs
+         (if (string= (car (car pairs)) group)
+             (setcar pairs (cdr pairs))
+           (setq pairs (cdr pairs)))))
+      (setq history (cdr history))))
+  (setq nnmail-split-history (delq nil nnmail-split-history)))
+
 (defun nnmail-new-mail-p (group)
   "Say whether GROUP has new mail."
   (let ((his nnmail-split-history)
index 8ac6e44..b0c1cb8 100644 (file)
       (setq active (cons 1 0))
       (push (list group active) nnmh-group-alist)
       (unless (file-exists-p dir)
-       (make-directory dir))
+       (gnus-make-directory dir))
       ;; Find the highest number in the group.
       (let ((files (sort
                    (mapcar
index b050beb..0e9c402 100644 (file)
@@ -103,6 +103,12 @@ via telnet.")
 (defvoo nntp-telnet-passwd nil
   "Password to use to log in via telnet with.")
 
+(defvoo nntp-open-telnet-envuser nil
+  "*If non-nil, telnet session (client and server both) will support the ENVIRON option and not prompt for login name.")
+
+(defvoo nntp-telnet-shell-prompt "bash\\|\$ *\r?$\\|> *\r?"
+  "*Regular expression to match the shell prompt on the remote machine.")
+
 (defvoo nntp-telnet-command "telnet"
   "Command used to start telnet.")
 
@@ -172,6 +178,7 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
 (defvar nntp-process-start-point nil)
 (defvar nntp-inside-change-function nil)
 (defvoo nntp-last-command-time nil)
+(defvoo nntp-last-command nil)
 
 (defvar nntp-connection-list nil)
 
@@ -194,6 +201,8 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
 
 (defsubst nntp-send-string (process string)
   "Send STRING to PROCESS."
+  (setq nntp-last-command-time (current-time)
+       nntp-last-command string)
   (process-send-string process (concat string nntp-end-of-line)))
 
 (defsubst nntp-wait-for (process wait-for buffer &optional decode discard)
@@ -204,8 +213,7 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
     (while (or (not (memq (char-after (point)) '(?2 ?3 ?4 ?5)))
               (looking-at "480"))
       (when (looking-at "480")
-       (erase-buffer)
-       (funcall nntp-authinfo-function))
+       (nntp-handle-authinfo process))
       (nntp-accept-process-output process)
       (goto-char (point-min)))
     (prog1
@@ -248,7 +256,6 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
       (if (memq (process-status process) '(open run))
          process
        (when (buffer-name (process-buffer process))
-         (message "Killed buffer %s" (process-buffer process))
          (kill-buffer (process-buffer process)))
        (setq nntp-connection-alist (delq entry nntp-connection-alist))
        nil))))
@@ -264,9 +271,8 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
       (process-buffer process))))
 
 (defsubst nntp-retrieve-data (command address port buffer
-                                  &optional wait-for callback decode)
+                                     &optional wait-for callback decode)
   "Use COMMAND to retrieve data into BUFFER from PORT on ADDRESS."
-  (setq nntp-last-command-time (current-time))
   (let ((process (or (nntp-find-connection buffer)
                     (nntp-open-connection buffer))))
     (if (not process)
@@ -600,7 +606,7 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
 
 (deffoo nntp-request-group (group &optional server dont-check)
   (nntp-possibly-change-group nil server)
-  (when (nntp-send-command "^2.*\n" "GROUP" group)
+  (when (nntp-send-command "^21.*\n" "GROUP" group)
     (let ((entry (nntp-find-connection-entry nntp-server-buffer)))
       (setcar (cddr entry) group))))
 
@@ -702,19 +708,19 @@ reading."
 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"
+   "^3.*\r?\n" "AUTHINFO USER"
    (read-string (format "NNTP (%s) user name: " nntp-address)))
   (nntp-send-command
-   "^.*\r?\n" "AUTHINFO PASS"
+   "^2.*\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 "^3.*\r?\n" "AUTHINFO USER" (user-login-name))
   (nntp-send-command
-   "^.*\r?\n" "AUTHINFO PASS"
+   "^2.*\r?\n" "AUTHINFO PASS"
    (nnmail-read-passwd (format "NNTP (%s) password: " nntp-address))))
 
 (defun nntp-send-authinfo-from-file ()
@@ -724,13 +730,24 @@ This function is supposed to be called from `nntp-server-opened-hook'."
     (nnheader-temp-write nil
       (insert-file-contents "~/.nntp-authinfo")
       (goto-char (point-min))
-      (nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name))
+      (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" (user-login-name))
       (nntp-send-command
-       "^.*\r?\n" "AUTHINFO PASS"
+       "^2.*\r?\n" "AUTHINFO PASS"
        (buffer-substring (point) (progn (end-of-line) (point)))))))
 
 ;;; Internal functions.
 
+(defun nntp-handle-authinfo (process)
+  "Take care of an authinfo response from the server."
+  (let ((last nntp-last-command))
+    (funcall nntp-authinfo-function)
+    ;; We have to re-send the function that was interrupted by
+    ;; the authinfo request.
+    (save-excursion
+      (set-buffer nntp-server-buffer)
+      (erase-buffer))
+    (nntp-send-string process last)))
+
 (defun nntp-make-process-buffer (buffer)
   "Create a new, fresh buffer usable for nntp process connections."
   (save-excursion
@@ -804,7 +821,7 @@ This function is supposed to be called from `nntp-server-opened-hook'."
          (save-excursion
            (goto-char beg)
            (if (looking-at "480")
-               (funcall nntp-authinfo-function)
+               (nntp-handle-authinfo nntp-process-to-buffer)
              (nntp-snarf-error-message)
              (funcall nntp-process-callback nil)))
        (goto-char end)
@@ -1070,13 +1087,20 @@ This function is supposed to be called from `nntp-server-opened-hook'."
          (case-fold-search t))
       (when (memq (process-status proc) '(open run))
        (process-send-string proc "set escape \^X\n")
-       (process-send-string proc (concat "open " nntp-address "\n"))
-       (nntp-wait-for-string "^\r*.?login:")
-       (process-send-string
-        proc (concat
-              (or nntp-telnet-user-name
-                  (setq nntp-telnet-user-name (read-string "login: ")))
-              "\n"))
+       (cond
+        ((and nntp-open-telnet-envuser nntp-telnet-user-name)
+         (process-send-string proc (concat "open " "-l" nntp-telnet-user-name
+                                           nntp-address "\n")))
+        (t
+         (process-send-string proc (concat "open " nntp-address "\n"))))
+       (cond
+        ((not nntp-open-telnet-envuser)
+         (nntp-wait-for-string "^\r*.?login:")
+         (process-send-string
+          proc (concat
+                (or nntp-telnet-user-name
+                    (setq nntp-telnet-user-name (read-string "login: ")))
+                "\n"))))
        (nntp-wait-for-string "^\r*.?password:")
        (process-send-string
         proc (concat
@@ -1085,7 +1109,7 @@ This function is supposed to be called from `nntp-server-opened-hook'."
                         (nnmail-read-passwd "Password: ")))
               "\n"))
        (erase-buffer)
-       (nntp-wait-for-string "bash\\|\$ *\r?$\\|> *\r?")
+       (nntp-wait-for-string nntp-telnet-shell-prompt)
        (process-send-string
         proc (concat (mapconcat 'identity nntp-telnet-parameters " ") "\n"))
        (nntp-wait-for-string "^\r*20[01]")
index 022f635..c16dce1 100644 (file)
@@ -1,3 +1,9 @@
+Fri Feb 13 18:23:19 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.texi (Mail Group Commands): Typo.
+       (NNTP): Addition.
+       (Mail and Procmail): Addition.
+
 Mon Feb  9 16:30:30 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
        * gnus.texi (Article Date): Addition.
index 560d5dc..6c6db39 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Quassia Gnus 0.24 Manual
+@settitle Quassia Gnus 0.25 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -313,7 +313,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Quassia Gnus 0.24 Manual
+@title Quassia Gnus 0.25 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -349,7 +349,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local
 spool or your mbox file.  All at the same time, if you want to push your
 luck.
 
-This manual corresponds to Quassia Gnus 0.24.
+This manual corresponds to Quassia Gnus 0.25.
 
 @end ifinfo
 
@@ -686,7 +686,7 @@ zombies later (with @kbd{A z}) and either kill them all off properly
 @item gnus-subscribe-randomly
 @vindex gnus-subscribe-randomly
 Subscribe all new groups in arbitrary order.  This really means that all
-new groups will be added at ``the top'' of the grop buffer.
+new groups will be added at ``the top'' of the group buffer.
 
 @item gnus-subscribe-alphabetically
 @vindex gnus-subscribe-alphabetically
@@ -7123,8 +7123,8 @@ Move the article from one mail group to another
 Copy the article from one group (mail group or not) to a mail group
 (@code{gnus-summary-copy-article}).
 
-@item B C
-@kindex B C (Summary)
+@item B B
+@kindex B B (Summary)
 @cindex crosspost mail
 @findex gnus-summary-crosspost-article
 Crosspost the current article to some other group
@@ -8994,6 +8994,17 @@ Password to use when logging in.
 A list of strings executed as a command after logging in
 via @code{telnet}.
 
+@item nntp-telnet-shell-prompt
+@vindex nntp-telnet-shell-prompt
+Regexp matching the shell prompt on the remote machine.  The default is
+@samp{bash\\|\$ *\r?$\\|> *\r?}.
+
+@item nntp-open-telnet-envuser
+@vindex nntp-open-telnet-envuser
+If non-@code{nil}, the @code{telnet} session (client and server both)
+will support the @code{ENVIRON} option and not prompt for login name.
+This works for Solaris @code{telnet}, for instance.
+
 @end table
 
 @item nntp-end-of-line
@@ -9543,6 +9554,16 @@ incoming mail into groups.  If you do that, you should set
 @code{nnmail-spool-file} to @code{procmail} to ensure that the mail
 backends never ever try to fetch mail by themselves.
 
+If you have a combined @code{procmail}/POP/mailbox setup, you can do
+something like the following:
+
+@vindex nnmail-use-procmail
+@lisp
+(setq nnmail-use-procmail t)
+(setq nnmail-spool-file
+      '("/usr/spool/mail/my-name" "po:my-name"))
+@end lisp
+
 This also means that you probably don't want to set
 @code{nnmail-split-methods} either, which has some, perhaps, unexpected
 side effects.
@@ -17121,9 +17142,6 @@ X characters in the body.
  handle 480/381 authinfo requests separately.
 
 @item
- when sending authinfo automatically, things hang.
-
-@item
  include the texi/dir file in the distribution.
 
 @item
@@ -17150,10 +17168,6 @@ to something someone else has said.
 snews://secnews.netscape.com/netscape.communicator.unix 
 
 @item
-When the nntp server hangs up while the user is composing the message,
-when sending the message and the nntp server asks for AUTH, Gnus hangs. 
-
-@item
 One command to edit the original version if an article, and one to edit
 the displayed version.
 
@@ -17165,6 +17179,12 @@ current article.
 Switch from initial text to the new default text mechanism.
 
 @item
+How about making it possible to expire local articles?  Will it be
+possible to make various constraints on when an article can be
+expired, e.g. (read), (age > 14 days), or the more interesting (read
+& age > 14 days)?
+
+@item
 Solve the halting problem.
 
 @c TODO
index 3c55f21..6a973b7 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename message
-@settitle Message 0.24 Manual
+@settitle Message 0.25 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -39,7 +39,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Message 0.24 Manual
+@title Message 0.25 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -80,7 +80,7 @@ Message mode buffers.
 * Key Index::         List of Message mode keys.
 @end menu
 
-This manual corresponds to Message 0.24.  Message is distributed with
+This manual corresponds to Message 0.25.  Message is distributed with
 the Gnus distribution bearing the same version number as this manual
 has.