*** empty log message ***
[gnus] / lisp / nnfolder.el
index d366fac..ff92039 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nnfolder.el --- mail folder access for Gnus
-;; Copyright (C) 1995 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96 Free Software Foundation, Inc.
 
 ;; Author: Scott Byer <byer@mv.us.adobe.com>
 ;;     Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
@@ -34,6 +34,7 @@
 (require 'nnheader)
 (require 'rmail)
 (require 'nnmail)
+(eval-when-compile (require 'cl))
 
 (defvar nnfolder-directory (expand-file-name "~/Mail/")
   "The name of the mail box file in the users home directory.")
@@ -62,7 +63,7 @@ close, but not killing it), speeding some things up tremendously, especially
 such things as moving mail.  All buffers always get killed upon server close.")
 
 (defvar nnfolder-newsgroups-file 
-  (concat (file-name-as-directory  nnfolder-directory) "newsgroups")
+  (concat (file-name-as-directory nnfolder-directory) "newsgroups")
   "Mail newsgroups description file.")
 
 (defvar nnfolder-get-new-mail t
@@ -71,6 +72,9 @@ such things as moving mail.  All buffers always get killed upon server close.")
 (defvar nnfolder-prepare-save-mail-hook nil
   "Hook run narrowed to an article before saving.")
 
+(defvar nnfolder-inhibit-expiry nil
+  "If non-nil, inhibit expiry.")
+
 \f
 
 (defconst nnfolder-version "nnfolder 1.0"
@@ -96,6 +100,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
    (list 'nnfolder-active-file nnfolder-active-file)
    (list 'nnfolder-newsgroups-file nnfolder-newsgroups-file)
    (list 'nnfolder-get-new-mail nnfolder-get-new-mail)
+   (list 'nnfolder-inhibit-expiry nnfolder-inhibit-expiry) 
    '(nnfolder-current-group nil)
    '(nnfolder-current-buffer nil)
    '(nnfolder-status-string "")
@@ -140,11 +145,8 @@ such things as moving mail.  All buffers always get killed upon server close.")
                (insert ".\n")))
          (setq sequence (cdr sequence)))
 
-       ;; Fold continuation lines.
        (set-buffer nntp-server-buffer)
-       (goto-char (point-min))
-       (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
-         (replace-match " " t t))
+       (nnheader-fold-continuation-lines)
        'headers))))
 
 (defun nnfolder-open-server (server &optional defs)
@@ -165,6 +167,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
     (setq nnfolder-current-server server)))
 
 (defun nnfolder-close-server (&optional server)
+  (setq nnfolder-current-server nil)
   t)
 
 (defun nnfolder-server-opened (&optional server)
@@ -219,26 +222,29 @@ such things as moving mail.  All buffers always get killed upon server close.")
 (defun nnfolder-request-group (group &optional server dont-check)
   (save-excursion
     (nnmail-activate 'nnfolder)
-    (nnfolder-possibly-change-group group)
-    (and (assoc group nnfolder-group-alist)
-        (progn
-          (if dont-check
-              t
-            (let* ((active (assoc group nnfolder-group-alist))
-                   (group (car active))
-                   (range (car (cdr active)))
-                   (minactive (car range))
-                   (maxactive (cdr range)))
-              ;; I've been getting stray 211 lines in my nnfolder active
-              ;; file.  So, let's make sure that doesn't happen. -SLB
-              (set-buffer nntp-server-buffer)
-              (erase-buffer)
-              (if (not active)
-                  ()
-                (insert (format "211 %d %d %d %s\n" 
-                                (1+ (- maxactive minactive))
-                                minactive maxactive group))
-                t)))))))
+    (when (assoc group nnfolder-group-alist)
+      (nnfolder-possibly-change-group group)
+      (cond 
+       (dont-check
+       (nnheader-report 'nnfolder "Selected group %s" group)
+       t)
+       (t
+       (let* ((active (assoc group nnfolder-group-alist))
+              (group (car active))
+              (range (car (cdr active)))
+              (minactive (car range))
+              (maxactive (cdr range)))
+         (set-buffer nntp-server-buffer)
+         (erase-buffer)
+         (cond 
+          ((null active)
+           (nnheader-report 'nnfolder "No such group: %s" group))
+          (t
+           (nnheader-report 'nnfolder "Selected group %s" group)
+           (insert (format "211 %d %d %d %s\n" 
+                           (1+ (- maxactive minactive))
+                           minactive maxactive group))
+           t))))))))
 
 (defun nnfolder-request-scan (&optional group server)
   (nnmail-get-new-mail
@@ -313,10 +319,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
 (defun nnfolder-request-expire-articles 
   (articles newsgroup &optional server force)
   (nnfolder-possibly-change-group newsgroup)
-  (let* ((days (or (and nnmail-expiry-wait-function
-                       (funcall nnmail-expiry-wait-function newsgroup))
-                  nnmail-expiry-wait))
-        (is-old t)
+  (let* ((is-old t)
         rest)
     (nnmail-activate 'nnfolder)
 
@@ -325,17 +328,15 @@ such things as moving mail.  All buffers always get killed upon server close.")
       (while (and articles is-old)
        (goto-char (point-min))
        (if (search-forward (nnfolder-article-string (car articles)) nil t)
-           (if (or force
-                   (setq is-old
-                         (> (nnmail-days-between 
-                             (current-time-string)
-                             (buffer-substring 
-                              (point) (progn (end-of-line) (point))))
-                            days)))
+           (if (setq is-old
+                     (nnmail-expired-article-p 
+                      newsgroup
+                      (buffer-substring 
+                       (point) (progn (end-of-line) (point))) 
+                      force nnfolder-inhibit-expiry))
                (progn
-                 (and gnus-verbose-backends
-                      (message "Deleting article %d..." 
-                               (car articles) newsgroup))
+                 (nnheader-message 5 "Deleting article %d..." 
+                                   (car articles) newsgroup)
                  (nnfolder-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
@@ -393,10 +394,8 @@ such things as moving mail.  All buffers always get killed upon server close.")
   (let ((buf (current-buffer))
        result)
     (goto-char (point-min))
-    (cond ((looking-at "X-From-Line: ")
-          (replace-match "From "))
-         ((not (looking-at "From "))
-          (insert "From nobody " (current-time-string) "\n")))
+    (when (looking-at "X-From-Line: ")
+      (replace-match "From "))
     (and 
      (nnfolder-request-list)
      (save-excursion
@@ -496,7 +495,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
 
 (defun nnfolder-possibly-change-group (group)
   (or (file-exists-p nnfolder-directory)
-      (make-directory (directory-file-name nnfolder-directory)))
+      (make-directory (directory-file-name nnfolder-directory) t))
   (nnfolder-possibly-activate-groups nil)
   (or (assoc group nnfolder-group-alist)
       (not (file-exists-p (concat (file-name-as-directory nnfolder-directory)
@@ -555,7 +554,18 @@ such things as moving mail.  All buffers always get killed upon server close.")
          (if group (list (list group "")) nnmail-split-methods))
         (group-art-list
          (nreverse (nnmail-article-group 'nnfolder-active-number)))
+        (delim (concat "^" rmail-unix-mail-delimiter))
         save-list group-art)
+    (goto-char (point-min))
+    ;; This might come from somewhere else.
+    (unless (looking-at delim)
+      (insert "From nobody " (current-time-string) "\n")
+      (goto-char (point-min)))
+    ;; Quote all "From " lines in the article.
+    (forward-line 1)
+    (while (re-search-forward delim nil t)
+      (beginning-of-line)
+      (insert "> "))
     (setq save-list group-art-list)
     (nnmail-insert-lines)
     (nnmail-insert-xref group-art-list)
@@ -619,8 +629,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
                        nnfolder-group-alist)))
          (cdr active))
       (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
-      (nnfolder-possibly-activate-groups group)
-      )))
+      (nnfolder-possibly-activate-groups group))))
 
 
 ;; This method has a problem if you've accidentally let the active list get
@@ -645,7 +654,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
     ;; and add it if it isn't.
     ;;(if (not (assoc nnfoler-current-group nnfolder-group-alist)
     (set-buffer (setq nnfolder-current-buffer 
-                     (nnheader-find-file-noselect file nil 'raw)))
+                     (find-file-noselect file nil 'raw)))
     (buffer-disable-undo (current-buffer))
     (let ((delim (concat "^" rmail-unix-mail-delimiter))
          (marker (concat "\n" nnfolder-article-marker))
@@ -708,6 +717,21 @@ such things as moving mail.  All buffers always get killed upon server close.")
       (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
       (current-buffer))))
 
+;;;###autoload
+(defun nnfolder-generate-active-file ()
+  "Look for mbox folders in the nnfolder directory and make them into groups."
+  (interactive)
+  (nnmail-activate 'nnfolder)
+  (let ((files (directory-files nnfolder-directory))
+       file group)
+    (while (setq file (pop files))
+      (when (nnheader-mail-file-mbox-p file)
+       (nnheader-message 5 "Adding group %s..." file)
+       (push (list file (cons 1 0)) nnfolder-group-alist)
+       (nnfolder-read-folder file)
+       (nnfolder-close-group file))
+      (message ""))))
+
 (provide 'nnfolder)
 
 ;;; nnfolder.el ends here