*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Sat, 12 Jun 1999 00:20:28 +0000 (00:20 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Sat, 12 Jun 1999 00:20:28 +0000 (00:20 +0000)
20 files changed:
lisp/ChangeLog
lisp/gnus-art.el
lisp/gnus-cite.el
lisp/gnus-group.el
lisp/gnus-range.el
lisp/gnus-start.el
lisp/gnus-sum.el
lisp/gnus-uu.el
lisp/gnus-xmas.el
lisp/gnus.el
lisp/mail-source.el
lisp/mailcap.el
lisp/mm-bodies.el
lisp/mm-decode.el
lisp/nndoc.el
lisp/nnmail.el
texi/ChangeLog
texi/gnus.texi
texi/message.texi
texi/texi2latex.el

index f857607..56b4e81 100644 (file)
@@ -1,3 +1,87 @@
+Sat Jun 12 00:19:57 1999  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus.el: Pterodactyl Gnus v0.85 is released.
+
+1999-04-20  Michael Cook  <cook@sightpath.com>
+
+       * gnus-cite.el (gnus-cite-attribution-prefix): Tweak for MS
+         Outlook citation regex.
+
+1999-06-12 02:09:49  Lars Magne Ingebrigtsen  <pinard@iro.umontreal.ca>
+
+       * nndoc.el (nndoc-mime-parts-type-p): Accept space before
+       semicolon. 
+
+1999-05-24  Simon Josefsson  <jas@pdc.kth.se>
+
+       * gnus-range.el (gnus-remove-from-range): Document range1
+       modification, protect range2.
+
+1999-05-24  Simon Josefsson  <jas@pdc.kth.se>
+
+       * gnus-sum.el (gnus-update-marks): Protect lists from
+       gnus-remove-from-range, don't sort twice.
+
+1999-05-21  Simon Josefsson  <jas@pdc.kth.se>
+
+        * gnus-start.el (gnus-read-descriptions-file): Protect if no
+        function in backend.
+
+1999-05-15  Simon Josefsson  <jas@pdc.kth.se>
+
+       * gnus-sum.el (gnus-valid-move-group-p): Check for a
+       request-accept-article function in the backend instead of using
+       the 'respool capability.
+
+1999-04-18  Hrvoje Niksic  <hniksic@srce.hr>
+
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Handle
+       spurious whitespace at eob.
+
+1999-06-12 02:02:06  Adrian Aichner  <aichner@ecf.teradyne.com>
+
+       * nnmail.el (nnmail-get-new-mail): Check right variable.
+
+1999-06-12 01:57:39  Karl Kleinpaste  <karl@justresearch.com>
+
+       * mailcap.el (mailcap-mime-data): Fix rfc822.
+
+1999-06-11 23:48:50  TOZAWA Akihiko  <miles@is.s.u-tokyo.ac.jp>
+
+       * nndoc.el (nndoc-nsmail-type-p): New function.
+       (nndoc-type-alist): Recognize nsmail.
+
+1999-05-12  Mike McEwan  <mike@lotusland.demon.co.uk>
+
+       * gnus-art.el (gnus-treatment-function-alist): Display `x-face'
+       *before* `article-hide-headers' deletes the information.
+
+1999-05-22 00:26:46  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-sum.el (gnus-summary-save-parts): New command and
+       keystroke. 
+       (gnus-summary-save-parts-1): New function.
+       (gnus-summary-iterate): Buggy.
+
+       * mm-decode.el (mm-save-part-to-file): Made into own function. 
+
+1999-05-11 05:53:16  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-group.el (gnus-group-set-info): Resist nils.
+
+1999-05-04 19:26:08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * mailcap.el (mailcap-mime-data): Ditto.
+
+       * gnus-uu.el (gnus-uu-default-view-rules): Ditto.
+
+       * gnus-art.el (gnus-article-x-face-command): Default to ee.
+
+1999-05-02  Gareth Jones  <gdj1@gdjones.demon.co.uk>
+
+       * gnus-art.el (article-make-date-line): Put X-Sent below Date if
+       gnus-article-date-lapsed-new-header is t.
+
 Sat May  1 20:27:43 1999  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus.el: Pterodactyl Gnus v0.84 is released.
index 1bf48af..e0a693f 100644 (file)
@@ -193,7 +193,7 @@ regexp.  If it matches, the text in question is not a signature."
   :group 'gnus-article-hiding)
 
 (defcustom gnus-article-x-face-command
-  "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | xv -quit -"
+  "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | eae -"
   "*String or function to be executed to display an X-Face header.
 If it is a string, the command will be executed in a sub-shell
 asynchronously.         The compressed face will be piped to this command."
@@ -890,6 +890,7 @@ See the manual for details."
     (gnus-treat-fill-long-lines gnus-article-fill-long-lines)
     (gnus-treat-strip-cr gnus-article-remove-cr)
     (gnus-treat-emphasize gnus-article-emphasize)
+    (gnus-treat-display-xface gnus-article-display-x-face)
     (gnus-treat-hide-headers gnus-article-maybe-hide-headers)
     (gnus-treat-hide-boring-headers gnus-article-hide-boring-headers)
     (gnus-treat-hide-signature gnus-article-hide-signature)
@@ -914,7 +915,6 @@ See the manual for details."
     (gnus-treat-strip-blank-lines gnus-article-strip-blank-lines)
     (gnus-treat-overstrike gnus-article-treat-overstrike)
     (gnus-treat-buttonize-head gnus-article-add-buttons-to-head)
-    (gnus-treat-display-xface gnus-article-display-x-face)
     (gnus-treat-display-smileys gnus-smiley-display)
     (gnus-treat-display-picons gnus-article-display-picons)
     (gnus-treat-play-sounds gnus-earcon-display)))
@@ -1781,6 +1781,8 @@ should replace the \"Date:\" one, or should be added below it."
                (delete-region (progn (beginning-of-line) (point))
                               (progn (forward-line 1) (point))))
              (setq newline nil))
+           (if (re-search-forward tdate-regexp nil t)
+               (forward-line 1))
            (insert (article-make-date-line date type))
            (when newline
              (insert "\n")
index aaf46a5..6c70d44 100644 (file)
@@ -104,7 +104,7 @@ The first regexp group should match the Supercite attribution."
   :type 'integer)
 
 (defcustom gnus-cite-attribution-prefix
-  "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),\\|    > -----Original Message-----"
+  "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),\\|-----Original Message-----"
   "*Regexp matching the beginning of an attribution line."
   :group 'gnus-cite
   :type 'regexp)
index 0e6f1b1..58d5bdf 100644 (file)
@@ -3287,59 +3287,60 @@ and the second element is the address."
   (gnus-browse-foreign-server method))
 
 (defun gnus-group-set-info (info &optional method-only-group part)
-  (let* ((entry (gnus-gethash
-                (or method-only-group (gnus-info-group info))
-                gnus-newsrc-hashtb))
-        (part-info info)
-        (info (if method-only-group (nth 2 entry) info))
-        method)
-    (when method-only-group
+  (when info
+    (let* ((entry (gnus-gethash
+                  (or method-only-group (gnus-info-group info))
+                  gnus-newsrc-hashtb))
+          (part-info info)
+          (info (if method-only-group (nth 2 entry) info))
+          method)
+      (when method-only-group
+       (unless entry
+         (error "Trying to change non-existent group %s" method-only-group))
+       ;; We have received parts of the actual group info - either the
+       ;; select method or the group parameters.        We first check
+       ;; whether we have to extend the info, and if so, do that.
+       (let ((len (length info))
+             (total (if (eq part 'method) 5 6)))
+         (when (< len total)
+           (setcdr (nthcdr (1- len) info)
+                   (make-list (- total len) nil)))
+         ;; Then we enter the new info.
+         (setcar (nthcdr (1- total) info) part-info)))
       (unless entry
-       (error "Trying to change non-existent group %s" method-only-group))
-      ;; We have received parts of the actual group info - either the
-      ;; select method or the group parameters.         We first check
-      ;; whether we have to extend the info, and if so, do that.
-      (let ((len (length info))
-           (total (if (eq part 'method) 5 6)))
-       (when (< len total)
-         (setcdr (nthcdr (1- len) info)
-                 (make-list (- total len) nil)))
-       ;; Then we enter the new info.
-       (setcar (nthcdr (1- total) info) part-info)))
-    (unless entry
-      ;; This is a new group, so we just create it.
-      (save-excursion
-       (set-buffer gnus-group-buffer)
-       (setq method (gnus-info-method info))
-       (when (gnus-server-equal method "native")
-         (setq method nil))
+       ;; This is a new group, so we just create it.
        (save-excursion
          (set-buffer gnus-group-buffer)
-         (if method
-             ;; It's a foreign group...
-             (gnus-group-make-group
-              (gnus-group-real-name (gnus-info-group info))
-              (if (stringp method) method
-                (prin1-to-string (car method)))
-              (and (consp method)
-                   (nth 1 (gnus-info-method info))))
-           ;; It's a native group.
-           (gnus-group-make-group (gnus-info-group info))))
-       (gnus-message 6 "Note: New group created")
-       (setq entry
-             (gnus-gethash (gnus-group-prefixed-name
-                            (gnus-group-real-name (gnus-info-group info))
-                            (or (gnus-info-method info) gnus-select-method))
-                           gnus-newsrc-hashtb))))
-    ;; Whether it was a new group or not, we now have the entry, so we
-    ;; can do the update.
-    (if entry
-       (progn
-         (setcar (nthcdr 2 entry) info)
-         (when (and (not (eq (car entry) t))
-                    (gnus-active (gnus-info-group info)))
-           (setcar entry (length (gnus-list-of-unread-articles (car info))))))
-      (error "No such group: %s" (gnus-info-group info)))))
+         (setq method (gnus-info-method info))
+         (when (gnus-server-equal method "native")
+           (setq method nil))
+         (save-excursion
+           (set-buffer gnus-group-buffer)
+           (if method
+               ;; It's a foreign group...
+               (gnus-group-make-group
+                (gnus-group-real-name (gnus-info-group info))
+                (if (stringp method) method
+                  (prin1-to-string (car method)))
+                (and (consp method)
+                     (nth 1 (gnus-info-method info))))
+             ;; It's a native group.
+             (gnus-group-make-group (gnus-info-group info))))
+         (gnus-message 6 "Note: New group created")
+         (setq entry
+               (gnus-gethash (gnus-group-prefixed-name
+                              (gnus-group-real-name (gnus-info-group info))
+                              (or (gnus-info-method info) gnus-select-method))
+                             gnus-newsrc-hashtb))))
+      ;; Whether it was a new group or not, we now have the entry, so we
+      ;; can do the update.
+      (if entry
+         (progn
+           (setcar (nthcdr 2 entry) info)
+           (when (and (not (eq (car entry) t))
+                      (gnus-active (gnus-info-group info)))
+             (setcar entry (length (gnus-list-of-unread-articles (car info))))))
+       (error "No such group: %s" (gnus-info-group info))))))
 
 (defun gnus-group-set-method-info (group select-method)
   (gnus-group-set-info select-method group 'method))
index 14b6f49..1964880 100644 (file)
@@ -227,18 +227,17 @@ Note: LIST has to be sorted over `<'."
 (defun gnus-remove-from-range (range1 range2)
   "Return a range that has all articles from RANGE2 removed from
 RANGE1. The returned range is always a list. RANGE2 can also be a
-unsorted list of articles."
+unsorted list of articles. RANGE1 is modified by side effects, RANGE2
+is not modified."
   (if (or (null range1) (null range2))
       range1
     (let (out r1 r2 r1_min r1_max r2_min r2_max
-             (range1 range1)
-             (range2 (if (listp (cdr range2))
-                         (sort range2 (lambda (e1 e2)
-                                        (< (if (consp e1) (car e1) e1)
-                                           (if (consp e2) (car e2) e2))))
-                       range2)))
+             (range2 (gnus-copy-sequence range2)))
       (setq range1 (if (listp (cdr range1)) range1 (list range1))
-           range2 (if (listp (cdr range2)) range2 (list range2))
+           range2 (sort (if (listp (cdr range2)) range2 (list range2))
+                        (lambda (e1 e2)
+                          (< (if (consp e1) (car e1) e1)
+                             (if (consp e2) (car e2) e2))))
            r1 (car range1)
            r2 (car range2)
            r1_min (if (consp r1) (car r1) r1)
index 45d87a1..4830d43 100644 (file)
@@ -2499,6 +2499,8 @@ If FORCE is non-nil, the .newsrc file is read."
 
     (gnus-message 5 "Reading descriptions file via %s..." (car method))
     (cond
+     ((null (gnus-get-function method 'request-list-newsgroups t))
+      t)
      ((not (gnus-check-server method))
       (gnus-message 1 "Couldn't open server")
       nil)
index c92f080..016c28c 100644 (file)
@@ -4289,27 +4289,24 @@ If SELECT-ARTICLES, only select those articles from GROUP."
                (setq arts (cdr arts)))
              (setq list (cdr all)))))
 
-         (when (gnus-check-backend-function 'request-set-mark
-                                            gnus-newsgroup-name)
-           ;; uncompressed:s are not proper flags (they are cons cells)
-           ;; cache is a internal gnus flag
-           (unless (memq (cdr type) (cons 'cache uncompressed))
-             (let* ((old (cdr (assq (cdr type) (gnus-info-marks info))))
-                    (list (gnus-compress-sequence (sort list '<)))
-                    (del (gnus-remove-from-range old list))
-                    (add (gnus-remove-from-range list old)))
-               (if add
-                   (push (list add 'add (list (cdr type))) delta-marks))
-               (if del
-                   (push (list del 'del (list (cdr type))) delta-marks)))))
+       (or (memq (cdr type) uncompressed)
+           (setq list (gnus-compress-sequence (set symbol (sort list '<)) t)))
+       
+       (when (gnus-check-backend-function 'request-set-mark
+                                          gnus-newsgroup-name)
+         ;; uncompressed:s are not proper flags (they are cons cells)
+         ;; cache is a internal gnus flag
+         (unless (memq (cdr type) (cons 'cache uncompressed))
+           (let* ((old (cdr (assq (cdr type) (gnus-info-marks info))))
+                  (del (gnus-remove-from-range (gnus-copy-sequence old) list))
+                  (add (gnus-remove-from-range (gnus-copy-sequence list) old)))
+             (if add
+                 (push (list add 'add (list (cdr type))) delta-marks))
+             (if del
+                 (push (list del 'del (list (cdr type))) delta-marks)))))
          
        (when list
-         (push (cons (cdr type)
-                     (if (memq (cdr type) uncompressed) list
-                       (gnus-compress-sequence
-                        (set symbol (sort list '<)) t)))
-               newmarked)))
-       
+         (push (cons (cdr type) list) newmarked)))
 
       (when delta-marks
        (unless (gnus-check-group gnus-newsgroup-name)
@@ -4872,7 +4869,8 @@ executed with point over the summary line of the articles."
     `(let ((,articles (gnus-summary-work-articles ,arg)))
        (while ,articles
         (gnus-summary-goto-subject (car ,articles))
-        ,@forms))))
+        ,@forms
+        (pop ,articles)))))
 
 (put 'gnus-summary-iterate 'lisp-indent-function 1)
 (put 'gnus-summary-iterate 'edebug-form-spec '(form body))
@@ -6141,7 +6139,7 @@ If given a prefix, remove all limits."
   "Limit the summary buffer to articles that are older than (or equal) AGE days.
 If YOUNGER-P (the prefix) is non-nil, limit the summary buffer to
 articles that are younger than AGE days."
-  (interactive "nTime in days: \nP")
+  (interactive "nLimit to articles older than (in days): \nP")
   (prog1
       (let ((data gnus-newsgroup-data)
            (cutoff (days-to-time age))
@@ -8793,11 +8791,8 @@ save those articles instead."
   (and (boundp group)
        (symbol-name group)
        (symbol-value group)
-       (memq 'respool
-            (assoc (symbol-name
-                    (car (gnus-find-method-for-group
-                          (symbol-name group))))
-                   gnus-valid-select-methods))))
+       (gnus-get-function (gnus-find-method-for-group
+                          (symbol-name group)) 'request-accept-article t)))
 
 (defun gnus-read-move-group-name (prompt default articles prefix)
   "Read a group name."
@@ -8848,6 +8843,39 @@ save those articles instead."
          (error "No such group: %s" to-newsgroup)))
     to-newsgroup))
 
+(defun gnus-summary-save-parts (type dir n reverse)
+  "Save parts matching a type."
+  (interactive
+   (list (read-string "Save parts of type: " "image/.*")
+        (read-file-name "Save to directory: " t nil t)
+        current-prefix-arg))
+  (gnus-summary-iterate n
+    (let ((gnus-display-mime-function nil)
+         (gnus-inhibit-treatment t))
+      (gnus-summary-select-article))
+    (save-excursion
+      (set-buffer gnus-article-buffer)
+      (let ((handles (or (mm-dissect-buffer) (mm-uu-dissect))))
+       (when handles
+         (gnus-summary-save-parts-1 type dir handles reverse))))))
+
+(defun gnus-summary-save-parts-1 (type dir handle reverse)
+  (if (stringp (car handle))
+      (mapcar (lambda (h) (gnus-summary-save-parts-1 type dir h reverse))
+             (cdr handle))
+    (when (if reverse
+             (not (string-match type (car (mm-handle-type handle))))
+           (string-match type (car (mm-handle-type handle))))
+      (let ((file (expand-file-name
+                  (file-name-nondirectory
+                   (or
+                    (mail-content-type-get
+                     (mm-handle-disposition handle) 'filename)
+                    (concat gnus-newsgroup-name "." gnus-current-article)))
+                  dir)))
+       (unless (file-exists-p file)
+         (mm-save-part-to-file handle file))))))
+
 ;; Summary extract commands
 
 (defun gnus-summary-insert-pseudos (pslist &optional not-view)
index 387d178..c3e1b31 100644 (file)
@@ -58,8 +58,8 @@
   '(("\\.te?xt$\\|\\.doc$\\|read.*me\\|\\.c?$\\|\\.h$\\|\\.bat$\\|\\.asm$\\|makefile" "cat %s | sed 's/\r$//'")
     ("\\.pas$" "cat %s | sed 's/\r$//'")
     ("\\.[1-9]$" "groff -mandoc -Tascii %s | sed s/\b.//g")
-    ("\\.\\(jpe?g\\|gif\\|tiff?\\|p[pgb]m\\|xwd\\|xbm\\|pcx\\)$" "xv")
-    ("\\.tga$" "tgatoppm %s | xv -")
+    ("\\.\\(jpe?g\\|gif\\|tiff?\\|p[pgb]m\\|xwd\\|xbm\\|pcx\\)$" "ee")
+    ("\\.tga$" "tgatoppm %s | ee -")
     ("\\.\\(wav\\|aiff\\|hcom\\|u[blw]\\|s[bfw]\\|voc\\|smp\\)$"
      "sox -v .5 %s -t .au -u - > /dev/audio")
     ("\\.au$" "cat %s > /dev/audio")
@@ -369,7 +369,8 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
   "k" gnus-summary-kill-process-mark
   "y" gnus-summary-yank-process-mark
   "w" gnus-summary-save-process-mark
-  "i" gnus-uu-invert-processable)
+  "i" gnus-uu-invert-processable
+  "m" gnus-summary-save-parts)
 
 (gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map)
   ;;"x" gnus-uu-extract-any
@@ -1398,7 +1399,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
          ;; We replace certain characters that could make things messy.
          (setq gnus-uu-file-name
                (let ((nnheader-file-name-translation-alist
-                      '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_))))
+                      '((?/ . ?,) (?  . ?_) (?* . ?_) (?$ . ?_))))
                  (nnheader-translate-file-chars (match-string 1))))
           (replace-match (concat "begin 644 " gnus-uu-file-name) t t)
 
index 773aef7..daa7b8d 100644 (file)
@@ -77,7 +77,7 @@ automatically."
   (if (or (featurep 'xface)
          (featurep 'xpm))
       'gnus-xmas-article-display-xface
-    "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | xv -quit -")
+    "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | ee -")
   "*String or function to be executed to display an X-Face header.
 If it is a string, the command will be executed in a sub-shell
 asynchronously.         The compressed face will be piped to this command."
index 5fc357c..67488f5 100644 (file)
@@ -260,7 +260,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.84"
+(defconst gnus-version-number "0.85"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number)
index acd758c..9444bca 100644 (file)
@@ -392,10 +392,10 @@ If ARGS, PROMPT is used as an argument to `format'."
       (if result
          (prog1
              (mail-source-callback callback server)
-           (when prescript
+           (when postscript
              (if (and (symbolp postscript)
                       (fboundp postscript))
-                 (funcall prescript)
+                 (funcall postscript)
                (call-process shell-file-name nil 0 nil
                              shell-command-switch 
                              (format-spec
index 9a4df73..82161b2 100644 (file)
       (viewer . mm-view-message)
       (test   . (and (featurep 'gnus)
                     (gnus-alive-p)))
-      (type   . "message/rfc-822"))
+      (type   . "message/rfc822"))
      ("rfc-*822"
       (viewer . vm-mode)
       (test   . (fboundp 'vm-mode))
-      (type   . "message/rfc-822"))
+      (type   . "message/rfc822"))
      ("rfc-*822"
       (viewer . w3-mode)
       (test   . (fboundp 'w3-mode))
-      (type   . "message/rfc-822"))
+      (type   . "message/rfc822"))
      ("rfc-*822"
       (viewer . view-mode)
       (test   . (fboundp 'view-mode))
-      (type   . "message/rfc-822"))
+      (type   . "message/rfc822"))
      ("rfc-*822"
       (viewer . fundamental-mode)
-      (type   . "message/rfc-822")))
+      (type   . "message/rfc822")))
     ("image"
      ("x-xwd"
       (viewer  . "xwud -in %s")
       (test   . (eq (mm-device-type) 'x))
       ("needsx11"))
      (".*"
-      (viewer . "xv -perfect %s")
+      (viewer . "ee %s")
       (type . "image/*")
       (test   . (eq (mm-device-type) 'x))
       ("needsx11")))
index 79afd06..bcbd4f1 100644 (file)
@@ -161,7 +161,14 @@ If no encoding was done, nil is returned."
           ((eq encoding 'quoted-printable)
            (quoted-printable-decode-region (point-min) (point-max)))
           ((eq encoding 'base64)
-           (base64-decode-region (point-min) (point-max)))
+           (base64-decode-region (point-min)
+                                 ;; Some mailers insert whitespace
+                                 ;; junk at the end which
+                                 ;; base64-decode-region dislikes.
+                                 (save-excursion
+                                   (goto-char (point-max))
+                                   (skip-chars-backward "\n\t ")
+                                   (point))))
           ((memq encoding '(7bit 8bit binary))
            )
           ((null encoding)
index 375efd6..0538fb5 100644 (file)
@@ -505,28 +505,31 @@ This overrides entries in the mailcap file."
                           (or filename name "")
                           (or mm-default-directory default-directory))))
     (setq mm-default-directory (file-name-directory file))
-    (mm-with-unibyte-buffer
-      (mm-insert-part handle)
-      (when (or (not (file-exists-p file))
-               (yes-or-no-p (format "File %s already exists; overwrite? "
-                                    file)))
-       ;; Now every coding system is 100% binary within mm-with-unibyte-buffer
-       ;; Is text still special?
-       (let ((coding-system-for-write
-              (if (equal "text" (car (split-string
-                                      (car (mm-handle-type handle)) "/")))
-                  buffer-file-coding-system
-                'binary))
-             ;; Don't re-compress .gz & al.  Arguably we should make
-             ;; `file-name-handler-alist' nil, but that would chop
-             ;; ange-ftp which it's reasonable to use here.
-             (inhibit-file-name-operation 'write-region)
-             (inhibit-file-name-handlers
-              (if (equal (car (mm-handle-type handle))
-                         "application/octet-stream")
-                  (cons 'jka-compr-handler inhibit-file-name-handlers)
-                inhibit-file-name-handlers)))
-         (write-region (point-min) (point-max) file))))))
+    (when (or (not (file-exists-p file))
+             (yes-or-no-p (format "File %s already exists; overwrite? "
+                                  file)))
+      (mm-save-part-to-file handle file))))
+
+(defun mm-save-part-to-file (handle file)
+  (mm-with-unibyte-buffer
+    (mm-insert-part handle)
+    ;; Now every coding system is 100% binary within mm-with-unibyte-buffer
+    ;; Is text still special?
+    (let ((coding-system-for-write
+          (if (equal "text" (car (split-string
+                                  (car (mm-handle-type handle)) "/")))
+              buffer-file-coding-system
+            'binary))
+         ;; Don't re-compress .gz & al.  Arguably we should make
+         ;; `file-name-handler-alist' nil, but that would chop
+         ;; ange-ftp which it's reasonable to use here.
+         (inhibit-file-name-operation 'write-region)
+         (inhibit-file-name-handlers
+          (if (equal (car (mm-handle-type handle))
+                     "application/octet-stream")
+              (cons 'jka-compr-handler inhibit-file-name-handlers)
+            inhibit-file-name-handlers)))
+      (write-region (point-min) (point-max) file))))
 
 (defun mm-pipe-part (handle)
   "Pipe HANDLE to a process."
index cca3283..2eac39b 100644 (file)
@@ -39,7 +39,7 @@
   "*Type of the file.
 One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward',
 `rfc934', `rfc822-forward', `mime-parts', `standard-digest',
-`slack-digest', `clari-briefs' or `guess'.")
+`slack-digest', `clari-briefs', `nsmail' or `guess'.")
 
 (defvoo nndoc-post-type 'mail
   "*Whether the nndoc group is `mail' or `post'.")
@@ -53,6 +53,8 @@ from the document.")
   `((mmdf
      (article-begin .  "^\^A\^A\^A\^A\n")
      (body-end .  "^\^A\^A\^A\^A\n"))
+    (nsmail
+     (article-begin .  "^From - "))
     (news
      (article-begin . "^Path:"))
     (rnews
@@ -448,7 +450,7 @@ from the document.")
     (when (and limit
               (re-search-forward
                (concat "\
-^Content-Type:[ \t]*multipart/[a-z]+ *;\\(\\(\n[ \t]\\)?.*;\\)*"
+^Content-Type:[ \t]*multipart/[a-z]+ *; *\\(\\(\n[ \t]\\)?.*;\\)*"
                        "\\(\n[ \t]\\)?[ \t]*boundary=\"?[^\"\n]*[^\" \t\n]")
                limit t))
       t)))
@@ -551,11 +553,14 @@ from the document.")
     (insert "From: "  (or from "unknown")
            "\nSubject: " (or subject "(no subject)") "\n")))
 
+(defun nndoc-nsmail-type-p ()
+  (when (looking-at "From - ")
+    t))
+
 (deffoo nndoc-request-accept-article (group &optional server last)
   nil)
 
 
-
 ;;;
 ;;; Functions for dissecting the documents
 ;;;
index d120169..cd453ff 100644 (file)
@@ -1401,7 +1401,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
            (incf total new)
            (incf i))))
       ;; If we did indeed read any incoming spools, we save all info.
-      (unless (zerop i)
+      (unless (zerop new)
        (nnmail-save-active
         (nnmail-get-value "%s-group-alist" method)
         (nnmail-get-value "%s-active-file" method))
index 13df68b..fe984bc 100644 (file)
@@ -1,3 +1,17 @@
+1999-06-12 00:13:25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Comparing Mail Backends): Slight edits.
+
+1999-06-12 00:13:20  Karl Kleinpaste  <karl@justresearch.com>
+
+       * gnus.texi (Comparing Mail Backends): New.
+
+1999-06-11 21:47:22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Group Score): Doc fix.
+       (The Active File): Addition.
+       (Document Groups): Addition.
+
 1999-04-18  Didier Verna  <verna@inf.enst.fr>
 
        * gnus.texi (Article treatment): document the new variable
index 27a9a1e..c92bf16 100644 (file)
@@ -1,8 +1,7 @@
-
-\input texinfo                  @c -*-texinfo-*-
+@c \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Pterodactyl Gnus 0.84 Manual
+@settitle Pterodactyl Gnus 0.85 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -51,6 +50,7 @@
 \newcommand{\gnussc}[1]{\textsc{#1}}
 \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
 \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
+\newcommand{\gnusresult}[1]{\gnustt{=> #1}}
 
 \newcommand{\gnusbullet}{{${\bullet}$}}
 \newcommand{\gnusdollar}{\$}
@@ -319,7 +319,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Pterodactyl Gnus 0.84 Manual
+@title Pterodactyl Gnus 0.85 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -355,7 +355,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 Pterodactyl Gnus 0.84.
+This manual corresponds to Pterodactyl Gnus 0.85.
 
 @end ifinfo
 
@@ -993,6 +993,10 @@ support the @code{LIST ACTIVE group} command), on others this isn't fast
 at all.  In any case, @code{some} should be faster than @code{nil}, and
 is certainly faster than @code{t} over slow lines.
 
+Some news servers (Leafnode and old versions of INN, for instance) do
+not support the @code{LIST ACTIVE group}.  For these servers, @code{nil}
+is probably the most effficient value for this variable.
+
 If this variable is @code{nil}, Gnus will ask for group info in total
 lock-step, which isn't very fast.  If it is @code{some} and you use an
 @sc{nntp} server, Gnus will pump out commands as fast as it can, and
@@ -1000,6 +1004,9 @@ read all the replies in one swoop.  This will normally result in better
 performance, but if the server does not support the aforementioned
 @code{LIST ACTIVE group} command, this isn't very nice to the server.
 
+If you think that starting up Gnus takes too long, try all the three
+different values for this variable and see what works best for you. 
+
 In any case, if you use @code{some} or @code{nil}, you should definitely
 kill all groups that you aren't interested in to speed things up.
 
@@ -1742,13 +1749,14 @@ is somewhat restrictive.  Don't you wish you could have Gnus sort the
 group buffer according to how often you read groups, perhaps?  Within
 reason?
 
-This is what @dfn{group score} is for.  You can assign a score to each
-group.  You can then sort the group buffer based on this score.
-Alternatively, you can sort on score and then level.  (Taken together,
-the level and the score is called the @dfn{rank} of the group.  A group
-that is on level 4 and has a score of 1 has a higher rank than a group
-on level 5 that has a score of 300.  (The level is the most significant
-part and the score is the least significant part.))
+This is what @dfn{group score} is for.  You can have Gnus assign a score
+to each group through the mechanism described below.  You can then sort
+the group buffer based on this score.  Alternatively, you can sort on
+score and then level.  (Taken together, the level and the score is
+called the @dfn{rank} of the group.  A group that is on level 4 and has
+a score of 1 has a higher rank than a group on level 5 that has a score
+of 300.  (The level is the most significant part and the score is the
+least significant part.))
 
 @findex gnus-summary-bubble-group
 If you want groups you read often to get higher scores than groups you
@@ -1928,9 +1936,9 @@ Make a group based on some file or other
 command, you will be prompted for a file name and a file type.
 Currently supported types are @code{babyl}, @code{mbox}, @code{digest},
 @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs},
-@code{rfc934}, @code{rfc822-forward}, and @code{forward}.  If you run
-this command without a prefix, Gnus will guess at the file type.
-@xref{Document Groups}.
+@code{rfc934}, @code{rfc822-forward}, @code{nsmail} and @code{forward}.
+If you run this command without a prefix, Gnus will guess at the file
+type.  @xref{Document Groups}.
 
 @item G u
 @kindex G u (Group)
@@ -10849,6 +10857,7 @@ backends are available separately.  The mail backend most people use
 * Mail Spool::                  Store your mail in a private spool?
 * MH Spool::                    An mhspool-like backend.
 * Mail Folders::                Having one file for each group.
+* Comparing Mail Backends::     An in-depth looks at pros and cons.
 @end menu
 
 
@@ -11078,6 +11087,127 @@ command to make @code{nnfolder} aware of all likely files in
 @code{nnfolder-directory}.  This only works if you use long file names,
 though.
 
+@node Comparing Mail Backends
+@subsubsection Comparing Mail Backends
+
+First, just for terminology, the @dfn{backend} is the common word for a
+low-level access method---a transport, if you will, by which something
+is acquired.  The sense is that one's mail has to come from somewhere,
+and so selection of a suitable backend is required in order to get that
+mail within spitting distance of Gnus.
+
+The same concept exists for Usenet itself: Though access to articles is
+typically done by NNTP these days, once upon a midnight dreary, everyone
+in the world got at Usenet by running a reader on the machine where the
+articles lay (the machine which today we call an NNTP server), and
+access was by the reader stepping into the articles' directory spool
+area directly.  One can still select between either the @code{nntp} or
+@code{nnspool} backends, to select between these methods, if one happens
+actually to live on the server (or can see its spool directly, anyway,
+via NFS).
+
+The goal in selecting a mail backend is to pick one which
+simultaneously represents a suitable way of dealing with the original
+format plus leaving mail in a form that is convenient to use in the
+future.  Here are some high and low points on each:
+
+@table @code
+@item nnmbox
+
+UNIX systems have historically had a single, very common, and well-
+defined format.  All messages arrive in a single @dfn{spool file}, and
+they are delineated by a line whose regular expression matches
+@samp{^From_}.  (My notational use of @samp{_} is to indicate a space,
+to make it clear in this instance that this is not the RFC-specified
+@samp{From:} header.)  Because Emacs and therefore Gnus emanate
+historically from the Unix environment, it is simplest if one does not
+mess a great deal with the original mailbox format, so if one chooses
+this backend, Gnus' primary activity in getting mail from the real spool
+area to Gnus' preferred directory is simply to copy it, with no
+(appreciable) format change in the process.  It is the ``dumbest'' way
+to move mail into availability in the Gnus environment.  This makes it
+fast to move into place, but slow to parse, when Gnus has to look at
+what's where.
+
+@item nnbabyl
+
+Once upon a time, there was the DEC-10 and DEC-20, running operating
+systems called TOPS and related things, and the usual (only?) mail
+reading environment was a thing called Babyl.  I don't know what format
+was used for mail landing on the system, but Babyl had its own internal
+format to which mail was converted, primarily involving creating a
+spool-file-like entity with a scheme for inserting Babyl-specific
+headers and status bits above the top of each message in the file.
+RMAIL was Emacs' first mail reader, it was written by Richard Stallman,
+and Stallman came out of that TOPS/Babyl environment, so he wrote RMAIL
+to understand the mail files folks already had in existence.  Gnus (and
+VM, for that matter) continue to support this format because it's
+perceived as having some good qualities in those mailer-specific
+headers/status bits stuff.  RMAIL itself still exists as well, of
+course, and is still maintained by Stallman.
+
+Both of the above forms leave your mail in a single file on your
+filesystem, and they must parse that entire file each time you take a
+look at your mail.
+
+@item nnml
+
+@code{nnml} is the backend which smells the most as though you were
+actually operating with an @code{nnspool}-accessed Usenet system.  (In
+fact, I believe @code{nnml} actually derived from @code{nnspool} code,
+lo these years ago.)  One's mail is taken from the original spool file,
+and is then cut up into individual message files, 1:1.  It maintains a
+Usenet-style active file (analogous to what one finds in an INN- or
+CNews-based news system in (for instance) @file{/var/lib/news/active},
+or what is returned via the @samp{NNTP LIST} verb) and also creates
+@dfn{overview} files for efficient group entry, as has been defined for
+@sc{nntp} servers for some years now.  It is slower in mail-splitting,
+due to the creation of lots of files, updates to the @code{nnml} active
+file, and additions to overview files on a per-message basis, but it is
+extremely fast on access because of what amounts to the indexing support
+provided by the active file and overviews.
+
+@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
+resource which defines available places in the filesystem to put new
+files.  Sysadmins take a dim view of heavy inode occupation within
+tight, shared filesystems.  But if you live on a personal machine where
+the filesystem is your own and space is not at a premium, @code{nnml}
+wins big.
+
+It is also problematic using this backend if you are living in a
+FAT16-based Windows world, since much space will be wasted on all these
+tiny files.
+
+@item nnmh
+
+The Rand MH mail-reading system has been around UNIX systems for a very
+long time; it operates by splitting one's spool file of messages into
+individual files, but with little or no indexing support -- @code{nnmh}
+is considered to be semantically equivalent to ``@code{nnml} without
+active file or overviews''.  This is arguably the worst choice, because
+one gets the slowness of individual file creation married to the
+slowness of access parsing when learning what's new in one's groups.
+
+@item nnfolder
+
+Basically the effetc of @code{nnfolder} is @code{nnmbox} (the first
+method described above) on a per-group basis.  That is, @code{nnmbox}
+itself puts *all* one's mail in one file; @code{nnfolder} provides a
+little bit of optimization to this so that each of one's mail groups has
+a Unix mail box file.  It's faster than @code{nnmbox} because each group
+can be parsed separately, and still provides the simple Unix mail box
+format requiring minimal effort in moving the mail around.  In addition, 
+it maintains an ``active'' file making it much faster for Gnus to figure 
+out how many messages there are in each separate group.
+
+If you have groups that are expected to have a massive amount of
+messages, @code{nnfolder} is not the best choice, but if you receive
+only a moderate amount of mail, @code{nnfolder} is probably the most
+friendly mail backend all over.
+
+@end table
+
+
 
 @node Other Sources
 @section Other Sources
@@ -11224,6 +11354,9 @@ The rnews batch transport format.
 @item forward
 Forwarded articles.
 
+@item nsmail
+Netscape mail boxes.
+
 @item mime-parts
 MIME multipart messages.
 
@@ -11262,7 +11395,7 @@ Virtual server variables:
 This should be one of @code{mbox}, @code{babyl}, @code{digest},
 @code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
 @code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
-@code{slack-digest}, @code{clari-briefs} or @code{guess}.
+@code{slack-digest}, @code{clari-briefs}, @code{nsmail} or @code{guess}.
 
 @item nndoc-post-type
 @vindex nndoc-post-type
@@ -18819,6 +18952,20 @@ but it gives an error that it cant access the group.
 Is the "+" character illegal in newsgroup names?  Is there any way in
 Gnus to work around this?  (gnus 5.6.45 - XEmacs 20.4)
 
+@item
+
+When `#F', do:
+
+@example
+Subject: Answer to your mails 01.01.1999-01.05.1999
+ --text follows this line--
+Sorry I killfiled you...
+
+Under the subject "foo", you wrote on 01.01.1999:
+> bar
+Under the subject "foo1", you wrote on 01.01.1999:
+> bar 1
+@end example
 
 @item
 Solve the halting problem.
index e2d3a30..f87deb0 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename message
-@settitle Pterodactyl Message 0.84 Manual
+@settitle Pterodactyl Message 0.85 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -42,7 +42,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Pterodactyl Message 0.84 Manual
+@title Pterodactyl Message 0.85 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -83,7 +83,7 @@ Message mode buffers.
 * Key Index::         List of Message mode keys.
 @end menu
 
-This manual corresponds to Pterodactyl Message 0.84.  Message is
+This manual corresponds to Pterodactyl Message 0.85.  Message is
 distributed with the Gnus distribution bearing the same version number
 as this manual.
 
index ccd53a8..58f7d7a 100644 (file)
           ((member command '("xref" "pxref"))
            (latexi-exchange-command (concat "gnus" command) arg))
           ((member command '("sc" "file" "dfn" "emph" "kbd" 
-                             "code" "samp" "var" "strong" "i"))
+                             "code" "samp" "var" "strong" "i"
+                             "result"))
            (goto-char (match-beginning 0))
            (delete-char 1)
            (insert "\\gnus"))