;;; 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>
(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.")
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
(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"
(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 "")
(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)
(setq nnfolder-current-server server)))
(defun nnfolder-close-server (&optional server)
+ (setq nnfolder-current-server nil)
t)
(defun nnfolder-server-opened (&optional server)
(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
(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)
(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)))
(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
(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)
(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)
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
;; 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))
(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