Synch with Oort Gnus.
[elisp/gnus.git-] / lisp / nnfolder.el
index 25613f6..96c53bb 100644 (file)
@@ -6,7 +6,7 @@
 ;;      ShengHuo Zhu <zsh@cs.rochester.edu> (adding NOV)
 ;;      Scott Byer <byer@mv.us.adobe.com>
 ;;     Lars Magne Ingebrigtsen <larsi@gnus.org>
-;;     Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
+;;     Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;; Keywords: mail
 
 ;; This file is part of GNU Emacs.
 
 ;;; Code:
 
+(eval-when-compile (require 'cl))
+(eval-when-compile (require 'gnus-clfns))
+
 (require 'nnheader)
 (require 'message)
 (require 'nnmail)
 (require 'nnoo)
-(eval-when-compile (require 'cl))
 (require 'gnus)
 (require 'gnus-util)
 (require 'gnus-range)
@@ -110,10 +112,10 @@ message, a huge 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 nnheader-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 nnheader-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.") ; FIXME: fill-in the doc-string of this variable
@@ -375,7 +377,7 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
          (let ((newnum (string-to-number (match-string 0))))
            (if (nnmail-within-headers-p)
                (push newnum numbers))))
-      ;; The article numbers are increasing, so this result is sorted.
+       ;; The article numbers are increasing, so this result is sorted.
        (nreverse numbers)))))
 
 (deffoo nnfolder-request-expire-articles
@@ -473,6 +475,8 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
          result art-group)
       (goto-char (point-min))
       (when (looking-at "X-From-Line: ")
+       (save-match-data
+         (mail-header-unfold-field))
        (replace-match "From "))
       (with-temp-buffer
        (let ((nnmail-file-coding-system nnfolder-active-file-coding-system)
@@ -513,15 +517,11 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
   (save-excursion
     (set-buffer buffer)
     (goto-char (point-min))
-    (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"))))
+    (if (not (looking-at "X-From-Line: "))
+       (insert "From nobody " (current-time-string) "\n")
+      (save-match-data
+       (mail-header-unfold-field))
+      (replace-match "From "))
     (nnfolder-normalize-buffer)
     (set-buffer nnfolder-current-buffer)
     (goto-char (point-min))
@@ -673,7 +673,8 @@ deleted.  Point is left where the deleted region was."
     (setq nnfolder-current-buffer nil
          nnfolder-current-group nil))
   ;; Change group.
-  (let ((file-name-coding-system nnmail-pathname-coding-system))
+  (let ((file-name-coding-system nnmail-pathname-coding-system)
+       (pathname-coding-system nnmail-pathname-coding-system))
     (when (and group
               (not (equal group nnfolder-current-group))
               (progn
@@ -684,15 +685,15 @@ deleted.  Point is left where the deleted region was."
          (setq nnfolder-current-group group
                nnfolder-current-buffer nil)
        (let (inf file)
-         ;; If we have to change groups, see if we don't already have
-         ;; the folder in memory.  If we do, verify the modtime and
-         ;; destroy the folder if needed so we can rescan it.
+         ;; If we have to change groups, see if we don't already have the
+         ;; folder in memory.  If we do, verify the modtime and destroy
+         ;; the folder if needed so we can rescan it.
          (setq nnfolder-current-buffer
                (nth 1 (assoc group nnfolder-buffer-alist)))
 
-         ;; If the buffer is not live, make sure it isn't in the
-         ;; alist.  If it is live, verify that nobody else has
-         ;; touched the file since last time.
+         ;; If the buffer is not live, make sure it isn't in the alist.  If it
+         ;; is live, verify that nobody else has touched the file since last
+         ;; time.
          (when (and nnfolder-current-buffer
                     (not (gnus-buffer-live-p nnfolder-current-buffer)))
            (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist)
@@ -834,7 +835,6 @@ deleted.  Point is left where the deleted region was."
                  (let ((nnheader-file-coding-system
                         nnfolder-file-coding-system))
                    (nnheader-find-file-noselect file)))))
-    (mm-enable-multibyte) ;; Use multibyte buffer for future copying.
     (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.
@@ -878,12 +878,12 @@ deleted.  Point is left where the deleted region was."
              (setq articles (nreverse articles))))
          (goto-char (point-min))
 
-         ;; Anytime the active number is 1 or 0, it is suspect.  In
-         ;; that case, search the file manually to find the active
-         ;; number.  Or, of course, if we're being paranoid.  (This
-         ;; would also be the place to build other lists from the
-         ;; header markers, such as expunge lists, etc., if we ever
-         ;; desired to abandon the active file entirely for mboxes.)
+         ;; Anytime the active number is 1 or 0, it is suspect.  In that
+         ;; case, search the file manually to find the active number.  Or,
+         ;; of course, if we're being paranoid.  (This would also be the
+         ;; place to build other lists from the header markers, such as
+         ;; expunge lists, etc., if we ever desired to abandon the active
+         ;; file entirely for mboxes.)
          (when (or nnfolder-ignore-active-file
                    novbuf
                    (< maxid 2))
@@ -910,11 +910,10 @@ deleted.  Point is left where the deleted region was."
            (setcdr active (max maxid (cdr active)))
            (goto-char (point-min)))
 
-         ;; As long as we trust that the user will only insert
-         ;; unmarked mail at the end, go to the end and search
-         ;; backwards for the last marker.  Find the start of that
-         ;; message, and begin to search for unmarked messages from
-         ;; there.
+         ;; As long as we trust that the user will only insert unmarked mail
+         ;; at the end, go to the end and search backwards for the last
+         ;; marker.  Find the start of that message, and begin to search for
+         ;; unmarked messages from there.
          (when (not (or nnfolder-distrust-mbox
                         (< maxid 2)))
            (goto-char (point-max))
@@ -924,16 +923,16 @@ deleted.  Point is left where the deleted region was."
            ;;  (goto-char (point-min)))
            )
 
-         ;; Keep track of the active number on our own, and insert it
-         ;; back into the active list when we're done.  Also, prime
-         ;; the pump to cut down on the number of searches we do.
+         ;; Keep track of the active number on our own, and insert it back
+         ;; into the active list when we're done.  Also, prime the pump to
+         ;; cut down on the number of searches we do.
          (unless (nnmail-search-unix-mail-delim)
            (goto-char (point-max)))
          (setq end (point-marker))
          (while (not (= end (point-max)))
            (setq start (marker-position end))
            (goto-char end)
-          ;; There may be more than one "From " line, so we skip past
+           ;; There may be more than one "From " line, so we skip past
            ;; them.
            (while (looking-at delim)
              (forward-line 1))
@@ -957,8 +956,7 @@ deleted.  Point is left where the deleted region was."
              (widen)))
 
          (set-marker end nil)
-         ;; Make absolutely sure that the active list reflects
-         ;; reality!
+         ;; Make absolutely sure that the active list reflects reality!
          (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)
 
          ;; Set the scantime for this group.
@@ -1010,7 +1008,7 @@ This command does not work if you use short group names."
 (defun nnfolder-group-pathname (group)
   "Make pathname for GROUP."
   (setq group
-       (mm-encode-coding-string group nnmail-pathname-coding-system))
+       (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
@@ -1030,9 +1028,10 @@ This command does not work if you use short group names."
   (when (buffer-modified-p)
     (run-hooks 'nnfolder-save-buffer-hook)
     (gnus-make-directory (file-name-directory (buffer-file-name)))
-    (let ((coding-system-for-write
-          (or nnfolder-file-coding-system-for-write
-              nnfolder-file-coding-system)))
+    (let* ((coding-system-for-write
+           (or nnfolder-file-coding-system-for-write
+               nnfolder-file-coding-system))
+          (output-coding-system coding-system-for-write))
       (save-buffer)))
   (unless (or gnus-nov-is-evil nnfolder-nov-is-evil)
     (nnfolder-save-nov)))
@@ -1163,13 +1162,14 @@ This command does not work if you use short group names."
     (nnfolder-open-marks group server)
     ;; Update info using `nnfolder-marks'.
     (mapcar (lambda (pred)
-             (gnus-info-set-marks
-              info
-              (gnus-update-alist-soft
-               (cdr pred)
-               (cdr (assq (cdr pred) nnfolder-marks))
-               (gnus-info-marks info))
-              t))
+             (unless (memq (cdr pred) gnus-article-unpropagated-mark-lists)
+               (gnus-info-set-marks
+                info
+                (gnus-update-alist-soft
+                 (cdr pred)
+                 (cdr (assq (cdr pred) nnfolder-marks))
+                 (gnus-info-marks info))
+                t)))
            gnus-article-mark-lists)
     (let ((seen (cdr (assq 'read nnfolder-marks))))
       (gnus-info-set-read info
@@ -1213,7 +1213,7 @@ This command does not work if you use short group names."
     (if (file-exists-p file)
        (condition-case err
            (with-temp-buffer
-             (gnus-sethash file (nth 5 (file-attributes file)) 
+             (gnus-sethash file (nth 5 (file-attributes file))
                            nnfolder-marks-modtime)
              (nnheader-insert-file-contents file)
              (setq nnfolder-marks (read (current-buffer)))