Importing qgnus-0.19
[elisp/gnus.git-] / lisp / nnmail.el
index 200d060..57ba600 100644 (file)
@@ -405,7 +405,7 @@ Example:
   :group 'nnmail-split
   :type '(repeat (cons :format "%v" symbol regexp)))
 
-(defcustom nnmail-delete-incoming t
+(defcustom nnmail-delete-incoming nil
   "*If non-nil, the mail backends will delete incoming files after
 splitting."
   :group 'nnmail-retrieve
@@ -445,6 +445,8 @@ parameter.  It should return nil, `warn' or `delete'."
 (defvar nnmail-split-history nil
   "List of group/article elements that say where the previous split put messages.")
 
+(defvar nnmail-current-spool nil)
+
 (defvar nnmail-pop-password nil
   "*Password to use when reading mail from a POP server, if required.")
 
@@ -475,7 +477,7 @@ parameter.  It should return nil, `warn' or `delete'."
   (mail-send-and-exit nil))
 
 ;; 1997/5/4 by MORIOKA Tomohiko <morioka@jaist.ac.jp>
-(defvar nnmail-file-coding-system nil
+(defvar nnmail-file-coding-system 'raw-text
   "Coding system used in nnmail.")
 
 (defun nnmail-find-file (file)
@@ -503,6 +505,7 @@ parameter.  It should return nil, `warn' or `delete'."
   "Make pathname for GROUP."
   (concat
    (let ((dir (file-name-as-directory (expand-file-name dir))))
+     (setq group (nnheader-translate-file-chars group))
      ;; If this directory exists, we use it directly.
      (if (or nnmail-use-long-file-names
             (file-directory-p (concat dir group)))
@@ -615,17 +618,17 @@ parameter.  It should return nil, `warn' or `delete'."
              (save-excursion
                (setq errors (generate-new-buffer " *nnmail loss*"))
                (buffer-disable-undo errors)
-               (let ((default-directory "/"))
-                 (if (nnheader-functionp nnmail-movemail-program)
-                     (condition-case err
-                         (progn
-                           (funcall nnmail-movemail-program inbox tofile)
-                           (setq result 0))
-                       (error
-                        (save-excursion
-                          (set-buffer errors)
-                          (insert (prin1-to-string err))
-                          (setq result 255))))
+               (if (nnheader-functionp nnmail-movemail-program)
+                   (condition-case err
+                       (progn
+                         (funcall nnmail-movemail-program inbox tofile)
+                         (setq result 0))
+                     (error
+                      (save-excursion
+                        (set-buffer errors)
+                        (insert (prin1-to-string err))
+                        (setq result 255))))
+                 (let ((default-directory "/"))
                    (setq result
                          (apply
                           'call-process
@@ -875,7 +878,9 @@ is a spool.  If not using procmail, return GROUP."
     (if (not (and (re-search-forward "^From " nil t)
                  (goto-char (match-beginning 0))))
        ;; Possibly wrong format?
-       (error "Error, unknown mail format! (Possibly corrupted.)")
+       (progn
+         (pop-to-buffer (find-file-noselect nnmail-current-spool))
+         (error "Error, unknown mail format! (Possibly corrupted.)"))
       ;; Carry on until the bitter end.
       (while (not (eobp))
        (setq start (point)
@@ -960,7 +965,9 @@ is a spool.  If not using procmail, return GROUP."
     (if (not (and (re-search-forward delim nil t)
                  (forward-line 1)))
        ;; Possibly wrong format?
-       (error "Error, unknown mail format! (Possibly corrupted.)")
+       (progn
+         (pop-to-buffer (find-file-noselect nnmail-current-spool))
+         (error "Error, unknown mail format! (Possibly corrupted.)"))
       ;; Carry on until the bitter end.
       (while (not (eobp))
        (setq start (point))
@@ -1038,14 +1045,13 @@ FUNC will be called with the buffer narrowed to each mail."
        (funcall exit-func))
       (kill-buffer (current-buffer)))))
 
-;; Mail crossposts suggested by Brian Edmonds <edmonds@cs.ubc.ca>.
 (defun nnmail-article-group (func)
   "Look at the headers and return an alist of groups that match.
 FUNC will be called with the group name to determine the article number."
   (let ((methods nnmail-split-methods)
        (obuf (current-buffer))
        (beg (point-min))
-       end group-art method)
+       end group-art method regrepp)
     (if (and (sequencep methods) (= (length methods) 1))
        ;; If there is only just one group to put everything in, we
        ;; just return a list with just this one method in.
@@ -1092,21 +1098,31 @@ FUNC will be called with the group name to determine the article number."
                       (lambda (group) (cons group (funcall func group)))
                       split))))
          ;; Go through the split methods to find a match.
-         (while (and methods (or nnmail-crosspost (not group-art)))
+         (while (and methods
+                     (or nnmail-crosspost
+                         (not group-art)))
            (goto-char (point-max))
-           (setq method (pop methods))
+           (setq method (pop methods)
+                 regrepp nil)
            (if (or methods
                    (not (equal "" (nth 1 method))))
                (when (and
                       (ignore-errors
                         (if (stringp (nth 1 method))
-                            (re-search-backward (cadr method) nil t)
+                            (progn
+                              (setq regrepp
+                                    (string-match "\\\\[0-9&]" (car method)))
+                              (re-search-backward (cadr method) nil t))
                           ;; Function to say whether this is a match.
                           (funcall (nth 1 method) (car method))))
                       ;; Don't enter the article into the same
                       ;; group twice.
                       (not (assoc (car method) group-art)))
-                 (push (cons (car method) (funcall func (car method)))
+                 (push (cons (if regrepp
+                                 (replace-match
+                                  (car method) nil nil (car method))
+                               (car method))
+                             (funcall func (car method)))
                        group-art))
              ;; This is the final group, which is used as a
              ;; catch-all.
@@ -1185,7 +1201,6 @@ Return the number of characters in the body."
 
 ;;; Utility functions
 
-;; Written by byer@mv.us.adobe.com (Scott Byer).
 (defun nnmail-make-complex-temp-name (prefix)
   (let ((newname (make-temp-name prefix))
        (newprefix prefix))
@@ -1238,7 +1253,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
 
    ;; Builtin : operation.
    ((eq (car split) ':)
-    (nnmail-split-it (eval (cdr split))))
+    (nnmail-split-it (save-excursion (eval (cdr split)))))
 
    ;; Check the cache for the regexp for this split.
    ;; FIX FIX FIX could avoid calling assq twice here
@@ -1333,7 +1348,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
                     nnmail-use-procmail)
                 (directory-files
                  nnmail-procmail-directory
-                 t (concat (if group (concat "^" group) "")
+                 t (concat (if group (concat "^" (regexp-quote group)) "")
                            nnmail-procmail-suffix "$"))))
           (p procmails)
           (crash (when (and (file-exists-p nnmail-crash-box)
@@ -1537,7 +1552,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
     (setq nnmail-split-history nil))
   (let* ((spools (nnmail-get-spool-files group))
         (group-in group)
-        incoming incomings spool)
+        nnmail-current-spool incoming incomings spool)
     (when (and (nnmail-get-value "%s-get-new-mail" method)
               nnmail-spool-file)
       ;; We first activate all the groups.
@@ -1559,6 +1574,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
          (nnheader-message 3 "%s: Reading incoming mail..." method)
          (when (and (nnmail-move-inbox spool)
                     (file-exists-p nnmail-crash-box))
+           (setq nnmail-current-spool spool)
            ;; There is new mail.  We first find out if all this mail
            ;; is supposed to go to some specific group.
            (setq group (nnmail-get-split-group spool group-in))