X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Fnnfolder.el;h=b79299c79e0aa398ce6ac1d49ebf6a7a2b579d66;hb=3aca09c100b6c60da9524bebf9c9eed6ad3e0174;hp=334b2b69aba8f103a9ad22c9167fc2731170369f;hpb=aa1506499895e49a74c2ac8c22892333c1a01e48;p=elisp%2Fgnus.git- diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 334b2b6..b79299c 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -1,5 +1,5 @@ ;;; nnfolder.el --- mail folder access for Gnus -;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc. +;; Copyright (C) 1995,96,97,98,99 Free Software Foundation, Inc. ;; Author: Scott Byer ;; Lars Magne Ingebrigtsen @@ -31,7 +31,7 @@ (require 'message) (require 'nnmail) (require 'nnoo) -(require 'cl) +(eval-when-compile (require 'cl)) (require 'gnus-util) (nnoo-declare nnfolder) @@ -90,6 +90,13 @@ time saver for large mailboxes.") (defvoo nnfolder-buffer-alist nil) (defvoo nnfolder-scantime-alist nil) (defvoo nnfolder-active-timestamp nil) +(defvoo nnfolder-active-file-coding-system mm-text-coding-system) +(defvoo nnfolder-active-file-coding-system-for-write + nnmail-active-file-coding-system) +(defvoo nnfolder-file-coding-system mm-text-coding-system) +(defvoo nnfolder-file-coding-system-for-write nnheader-file-coding-system + "Coding system for save nnfolder file. +If NIL, NNFOLDER-FILE-CODING-SYSTEM is used.") @@ -266,15 +273,14 @@ time saver for large mailboxes.") (when group (unless (assoc group nnfolder-group-alist) (push (list group (cons 1 0)) nnfolder-group-alist) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) (nnfolder-read-folder group))) t) (deffoo nnfolder-request-list (&optional server) (nnfolder-possibly-change-group nil server) (save-excursion - (let ((nnmail-file-coding-system nnmail-active-file-coding-system) - (pathname-coding-system 'binary)) + (let ((nnmail-file-coding-system nnfolder-active-file-coding-system)) (nnmail-find-file nnfolder-active-file) (setq nnfolder-group-alist (nnmail-get-active))) t)) @@ -286,7 +292,8 @@ time saver for large mailboxes.") (deffoo nnfolder-request-list-newsgroups (&optional server) (nnfolder-possibly-change-group nil server) (save-excursion - (nnmail-find-file nnfolder-newsgroups-file))) + (let ((nnmail-file-coding-system nnfolder-file-coding-system)) + (nnmail-find-file nnfolder-newsgroups-file)))) (deffoo nnfolder-request-expire-articles (articles newsgroup &optional server force) @@ -299,7 +306,10 @@ time saver for large mailboxes.") (set-buffer nnfolder-current-buffer) (while (and articles is-old) (goto-char (point-min)) - (when (nnfolder-goto-article (car articles)) + (when (and (nnfolder-goto-article (car articles)) + (search-forward (concat "\n" nnfolder-article-marker) + nil t)) + (forward-sexp) (if (setq is-old (nnmail-expired-article-p newsgroup @@ -316,7 +326,7 @@ time saver for large mailboxes.") (nnheader-message 5 "Deleting articles...done")) (nnfolder-save-buffer) (nnfolder-adjust-min-active newsgroup) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) (nconc rest articles)))) (deffoo nnfolder-request-move-article (article group server @@ -328,7 +338,6 @@ time saver for large mailboxes.") (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)) @@ -349,7 +358,7 @@ time saver for large mailboxes.") (when last (nnfolder-save-buffer) (nnfolder-adjust-min-active group) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file)))) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)))) result))) (deffoo nnfolder-request-accept-article (group &optional server last) @@ -387,7 +396,7 @@ time saver for large mailboxes.") (nnfolder-save-buffer) (when nnmail-cache-accepted-message-ids (nnmail-cache-close))))) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) (unless result (nnheader-report 'nnfolder "Couldn't store article")) result))) @@ -397,14 +406,21 @@ time saver for large mailboxes.") (save-excursion (set-buffer buffer) (goto-char (point-min)) - (when (looking-at "X-From-Line: ") - (replace-match "From ")) + (let (xfrom) + (while (re-search-forward "^X-From-Line: \\(.*\\)$" nil t) + (setq xfrom (match-string 1)) + (gnus-delete-line)) + (goto-char (point-min)) + (if xfrom + (insert "From " xfrom "\n") + (unless (looking-at "From ") + (insert "From nobody " (current-time-string) "\n")))) (nnfolder-normalize-buffer) (set-buffer nnfolder-current-buffer) (goto-char (point-min)) (if (not (nnfolder-goto-article article)) nil - (nnfolder-delete-mail t) + (nnfolder-delete-mail) (insert-buffer-substring buffer) (nnfolder-save-buffer) t))) @@ -423,7 +439,7 @@ time saver for large mailboxes.") nnfolder-current-group nil nnfolder-current-buffer nil) ;; Save the active file. - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) t) (deffoo nnfolder-request-rename-group (group new-name &optional server) @@ -434,7 +450,9 @@ time saver for large mailboxes.") (ignore-errors (rename-file buffer-file-name - (nnfolder-group-pathname new-name)) + (let ((new-file (nnfolder-group-pathname new-name))) + (gnus-make-directory (file-name-directory new-file)) + new-file)) t) ;; That went ok, so we change the internal structures. (let ((entry (assoc group nnfolder-group-alist))) @@ -442,7 +460,7 @@ time saver for large mailboxes.") (setq nnfolder-current-buffer nil nnfolder-current-group nil) ;; Save the new group alist. - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) ;; We kill the buffer instead of renaming it and stuff. (kill-buffer (current-buffer)) t)))) @@ -504,17 +522,21 @@ Returns t if successful, nil otherwise." "Delete the message that point is in. If optional argument LEAVE-DELIM is t, then mailbox delimiter is not deleted. Point is left where the deleted region was." - (delete-region - (save-excursion - (forward-line 1) ; in case point is at beginning of message already - (nnmail-search-unix-mail-delim-backward) - (if leave-delim (progn (forward-line 1) (point)) - (point))) - (progn - (forward-line 1) - (if (nnmail-search-unix-mail-delim) - (point) - (point-max))))) + (save-restriction + (narrow-to-region + (save-excursion + ;; In case point is at the beginning of the message already. + (forward-line 1) + (nnmail-search-unix-mail-delim-backward) + (if leave-delim (progn (forward-line 1) (point)) + (point))) + (progn + (forward-line 1) + (if (nnmail-search-unix-mail-delim) + (point) + (point-max)))) + (run-hooks 'nnfolder-delete-mail-hook) + (delete-region (point-min) (point-max)))) (defun nnfolder-possibly-change-group (group &optional server dont-check) ;; Change servers. @@ -527,14 +549,14 @@ deleted. Point is left where the deleted region was." ;; Change group. (when (and group (not (equal group nnfolder-current-group))) - (let ((pathname-coding-system 'binary)) + (let ((pathname-coding-system nnmail-pathname-coding-system)) (nnmail-activate 'nnfolder) (when (and (not (assoc group nnfolder-group-alist)) (not (file-exists-p (nnfolder-group-pathname group)))) ;; The group doesn't exist, so we create a new entry for it. (push (list group (cons 1 0)) nnfolder-group-alist) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)) (if dont-check (setq nnfolder-current-group group @@ -564,7 +586,10 @@ deleted. Point is left where the deleted region was." ;; See whether we need to create the new file. (unless (file-exists-p file) (gnus-make-directory (file-name-directory file)) - (nnmail-write-region 1 1 file t 'nomesg)) + (let ((nnmail-file-coding-system + (or nnfolder-file-coding-system-for-write + nnfolder-file-coding-system-for-write))) + (nnmail-write-region 1 1 file t 'nomesg))) (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) (set-buffer nnfolder-current-buffer) (push (list group nnfolder-current-buffer) @@ -575,10 +600,10 @@ deleted. Point is left where the deleted region was." (let* (save-list group-art) (goto-char (point-min)) ;; The From line may have been quoted by movemail. - (when (looking-at (concat ">" message-unix-mail-delimiter)) + (when (looking-at ">From") (delete-char 1)) ;; This might come from somewhere else. - (unless (looking-at message-unix-mail-delimiter) + (unless (looking-at "From ") (insert "From nobody " (current-time-string) "\n") (goto-char (point-min))) ;; Quote all "From " lines in the article. @@ -652,7 +677,7 @@ deleted. Point is left where the deleted region was." (when inf (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist))) (when nnfolder-group-alist - (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)) (push (list group (nnfolder-read-folder group)) nnfolder-buffer-alist)))) @@ -673,7 +698,10 @@ deleted. Point is left where the deleted region was." (defun nnfolder-read-folder (group) (let* ((file (nnfolder-group-pathname group)) - (buffer (set-buffer (nnheader-find-file-noselect file)))) + (buffer (set-buffer + (let ((nnheader-file-coding-system + nnfolder-file-coding-system)) + (nnheader-find-file-noselect file))))) (if (equal (cadr (assoc group nnfolder-scantime-alist)) (nth 5 (file-attributes file))) ;; This looks up-to-date, so we don't do any scanning. @@ -684,9 +712,13 @@ deleted. Point is left where the deleted region was." (save-buffer)) ;; Parse the damn thing. (save-excursion + (goto-char (point-min)) + ;; Remove any blank lines at the start. + (while (eq (following-char) ?\n) + (delete-char 1)) (nnmail-activate 'nnfolder) ;; Read in the file. - (let ((delim (concat "^" message-unix-mail-delimiter)) + (let ((delim "^From ") (marker (concat "\n" nnfolder-article-marker)) (number "[0-9]+") (active (or (cadr (assoc group nnfolder-group-alist)) @@ -695,7 +727,7 @@ deleted. Point is left where the deleted region was." (minid (lsh -1 -1)) maxid start end newscantime buffer-read-only) - (buffer-disable-undo (current-buffer)) + (buffer-disable-undo) (setq maxid (cdr active)) (goto-char (point-min)) @@ -755,7 +787,7 @@ deleted. Point is left where the deleted region was." (set-marker end nil) ;; Make absolutely sure that the active list reflects reality! - (nnmail-save-active nnfolder-group-alist nnfolder-active-file) + (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) ;; Set the scantime for this group. (setq newscantime (visited-file-modtime)) (if scantime @@ -766,7 +798,8 @@ deleted. Point is left where the deleted region was." ;;;###autoload (defun nnfolder-generate-active-file () - "Look for mbox folders in the nnfolder directory and make them into groups." + "Look for mbox folders in the nnfolder directory and make them into groups. +This command does not work if you use short group names." (interactive) (nnmail-activate 'nnfolder) (let ((files (directory-files nnfolder-directory)) @@ -790,7 +823,8 @@ deleted. Point is left where the deleted region was." (defun nnfolder-group-pathname (group) "Make pathname for GROUP." - (setq group (gnus-encode-coding-string group nnmail-pathname-coding-system)) + (setq group + (mm-encode-coding-string group nnmail-pathname-coding-system)) (let ((dir (file-name-as-directory (expand-file-name nnfolder-directory)))) ;; If this file exists, we use it directly. (if (or nnmail-use-long-file-names @@ -804,7 +838,16 @@ deleted. Point is left where the deleted region was." (when (buffer-modified-p) (run-hooks 'nnfolder-save-buffer-hook) (gnus-make-directory (file-name-directory (buffer-file-name))) - (save-buffer))) + (let ((coding-system-for-write + (or nnfolder-file-coding-system-for-write + nnfolder-file-coding-system))) + (save-buffer)))) + +(defun nnfolder-save-active (group-alist active-file) + (let ((nnmail-active-file-coding-system + (or nnfolder-active-file-coding-system-for-write + nnfolder-active-file-coding-system))) + (nnmail-save-active group-alist active-file))) (provide 'nnfolder)