Synch to No Gnus 200510111141.
[elisp/gnus.git-] / lisp / nnfolder.el
index 448ada4..0cfa0f2 100644 (file)
@@ -1,6 +1,7 @@
 ;;; nnfolder.el --- mail folder access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;;        Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005 Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org> (adding MARKS)
 ;;      ShengHuo Zhu <zsh@cs.rochester.edu> (adding NOV)
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
 ;;; Code:
 
 (eval-when-compile (require 'cl))
-(eval-when-compile (require 'gnus-clfns))
 
 (require 'nnheader)
 (require 'message)
@@ -202,9 +202,9 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
                       ((search-backward (concat "\n" nnfolder-article-marker)
                                         nil t)
                        (goto-char (match-end 0))
-                       (setq num (string-to-int
+                       (setq num (string-to-number
                                   (buffer-substring
-                                   (point) (gnus-point-at-eol))))
+                                   (point) (point-at-eol))))
                        (goto-char start)
                        (< num article)))
                      ;; Check that we are before an article with a
@@ -212,9 +212,9 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
                      (search-forward (concat "\n" nnfolder-article-marker)
                                      nil t)
                      (progn
-                       (setq num (string-to-int
+                       (setq num (string-to-number
                                   (buffer-substring
-                                   (point) (gnus-point-at-eol))))
+                                   (point) (point-at-eol))))
                        (> num article))
                      ;; Discard any article numbers before the one we're
                      ;; now looking at.
@@ -287,8 +287,8 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
            (cons nnfolder-current-group
                  (if (search-forward (concat "\n" nnfolder-article-marker)
                                      nil t)
-                     (string-to-int (buffer-substring
-                                     (point) (gnus-point-at-eol)))
+                     (string-to-number (buffer-substring
+                                     (point) (point-at-eol)))
                    -1))))))))
 
 (deffoo nnfolder-request-group (group &optional server dont-check)
@@ -372,10 +372,11 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
 (deffoo nnfolder-request-create-group (group &optional server args)
   (nnfolder-possibly-change-group nil server)
   (nnmail-activate 'nnfolder)
-  (when group
-    (unless (assoc group nnfolder-group-alist)
-      (push (list group (cons 1 0)) nnfolder-group-alist)
-      (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)
+  (when (and group
+            (not (assoc group nnfolder-group-alist)))
+    (push (list group (cons 1 0)) nnfolder-group-alist)
+    (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)
+    (save-current-buffer
       (nnfolder-read-folder group)))
   t)
 
@@ -468,8 +469,8 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
       (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)
       (gnus-sorted-difference articles (nreverse deleted-articles)))))
 
-(deffoo nnfolder-request-move-article (article group server
-                                              accept-form &optional last)
+(deffoo nnfolder-request-move-article (article group server accept-form 
+                                              &optional last move-is-internal)
   (save-excursion
     (let ((buf (get-buffer-create " *nnfolder move*"))
          result)
@@ -526,7 +527,10 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
        (while (re-search-backward (concat "^" nnfolder-article-marker) nil t)
          (delete-region (point) (progn (forward-line 1) (point))))
        (when nnmail-cache-accepted-message-ids
-         (nnmail-cache-insert (nnmail-fetch-field "message-id") group))
+         (nnmail-cache-insert (nnmail-fetch-field "message-id") 
+                              group
+                              (nnmail-fetch-field "subject")
+                              (nnmail-fetch-field "from")))
        (setq result (if (stringp group)
                         (list (cons group (nnfolder-active-number group)))
                       (setq art-group
@@ -710,8 +714,7 @@ 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)
-       (pathname-coding-system nnmail-pathname-coding-system))
+  (let ((file-name-coding-system nnmail-pathname-coding-system))
     (when (and group
               (not (equal group nnfolder-current-group))
               (progn
@@ -722,15 +725,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)
@@ -872,7 +875,9 @@ deleted.  Point is left where the deleted region was."
         (buffer (set-buffer
                  (let ((nnheader-file-coding-system
                         nnfolder-file-coding-system))
-                   (nnheader-find-file-noselect file)))))
+                   (nnheader-find-file-noselect file t)))))
+    (set-buffer-multibyte t) ;; Use multibyte buffer for future copying.
+    (buffer-disable-undo)
     (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.
@@ -899,7 +904,6 @@ deleted.  Point is left where the deleted region was."
              maxid start end newscantime
              novbuf articles newnum
              buffer-read-only)
-         (buffer-disable-undo)
          (setq maxid (cdr active))
 
          (unless (or gnus-nov-is-evil nnfolder-nov-is-evil
@@ -916,12 +920,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))
@@ -948,10 +952,11 @@ 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))
@@ -961,9 +966,9 @@ 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))
@@ -994,7 +999,8 @@ 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.
@@ -1024,9 +1030,7 @@ This command does not work if you use short group names."
       (when (not (message-mail-file-mbox-p file))
        (ignore-errors
          (delete-file file)))))
-  (let ((files (directory-files nnfolder-directory))
-       file)
-    (while (setq file (pop files))
+    (dolist (file (directory-files nnfolder-directory))
       (when (and (not (backup-file-name-p file))
                 (message-mail-file-mbox-p
                  (nnheader-concat nnfolder-directory file)))
@@ -1041,7 +1045,7 @@ This command does not work if you use short group names."
          (nnfolder-possibly-change-folder file)
          (nnfolder-possibly-change-group file)
          (nnfolder-close-group file))))
-    (nnheader-message 5 "")))
+    (nnheader-message 5 ""))
 
 (defun nnfolder-group-pathname (group)
   "Make file name for GROUP."
@@ -1066,10 +1070,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))
-          (output-coding-system coding-system-for-write))
+    (let ((coding-system-for-write
+          (or nnfolder-file-coding-system-for-write
+              nnfolder-file-coding-system))
+         (copyright-update nil))
       (save-buffer)))
   (unless (or gnus-nov-is-evil nnfolder-nov-is-evil)
     (nnfolder-save-nov)))
@@ -1172,7 +1176,7 @@ This command does not work if you use short group names."
       (let ((range (nth 0 action))
            (what  (nth 1 action))
            (marks (nth 2 action)))
-       (assert (or (eq what 'add) (eq what 'del)) t
+       (assert (or (eq what 'add) (eq what 'del)) nil
                "Unknown request-set-mark action: %s" what)
        (dolist (mark marks)
          (setq nnfolder-marks (gnus-update-alist-soft
@@ -1193,16 +1197,16 @@ This command does not work if you use short group names."
     (nnheader-message 8 "Updating marks for %s..." group)
     (nnfolder-open-marks group server)
     ;; Update info using `nnfolder-marks'.
-    (mapcar (lambda (pred)
-             (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)
+    (mapc (lambda (pred)
+           (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
                          (if (and (integerp (car seen))
@@ -1238,7 +1242,7 @@ This command does not work if you use short group names."
                        nnfolder-marks-modtime))
       (error (or (gnus-yes-or-no-p
                  (format "Could not write to %s (%s).  Continue? " file err))
-                (error "Cannot write to %s (%s)" err))))))
+                (error "Cannot write to %s (%s)" file err))))))
 
 (defun nnfolder-open-marks (group server)
   (let ((file (nnfolder-group-marks-pathname group)))