2001-11-29 12:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
[gnus] / lisp / nnfolder.el
index 2863776..e678140 100644 (file)
@@ -40,6 +40,7 @@
 (require 'gnus-range)
 
 (eval-and-compile
+  (autoload 'gnus-article-unpropagatable-p "gnus-sum")
   (autoload 'gnus-intersection "gnus-range"))
 
 (nnoo-declare nnfolder)
@@ -161,6 +162,8 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
 
 (defvoo nnfolder-marks-file-suffix ".mrk")
 
+(defvar nnfolder-marks-modtime (gnus-make-hashtable))
+
 \f
 
 ;;; Interface functions
@@ -424,9 +427,10 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
              (with-temp-buffer
                (nnfolder-request-article (car maybe-expirable)
                                          newsgroup server (current-buffer))
-               (let ((nnml-current-directory nil))
+               (let ((nnfolder-current-directory nil))
                  (nnmail-expiry-target-group
-                  nnmail-expiry-target newsgroup))))
+                  nnmail-expiry-target newsgroup)))
+             (nnfolder-possibly-change-group newsgroup server))
            (nnheader-message 5 "Deleting article %d in %s..."
                              (car maybe-expirable) newsgroup)
            (nnfolder-delete-mail)
@@ -786,7 +790,8 @@ deleted.  Point is left where the deleted region was."
   (goto-char (point-max))
   (skip-chars-backward "\n")
   (delete-region (point) (point-max))
-  (insert "\n\n"))
+  (unless (bobp)
+    (insert "\n\n")))
 
 (defun nnfolder-insert-newsgroup-line (group-art)
   (save-excursion
@@ -958,7 +963,7 @@ deleted.  Point is left where the deleted region was."
              (nnfolder-insert-newsgroup-line
               (cons nil
                     (setq newnum
-                          (nnfolder-active-number nnfolder-current-group))))
+                          (nnfolder-active-number group))))
              (when novbuf
                (let ((headers (nnfolder-parse-head newnum (point-min)
                                                    (point-max))))
@@ -976,7 +981,7 @@ deleted.  Point is left where the deleted region was."
          (setq newscantime (visited-file-modtime))
          (if scantime
              (setcdr scantime (list newscantime))
-           (push (list nnfolder-current-group newscantime)
+           (push (list group newscantime)
                  nnfolder-scantime-alist))
          ;; Save nov.
          (when novbuf
@@ -1169,7 +1174,7 @@ This command does not work if you use short group names."
   (when (and server
             (not (nnfolder-server-opened server)))
     (nnfolder-open-server server))
-  (unless nnfolder-marks-is-evil
+  (when (and (not nnfolder-marks-is-evil) (nnfolder-marks-changed-p group))
     (nnheader-message 8 "Updating marks for %s..." group)
     (nnfolder-open-marks group server)
     ;; Update info using `nnfolder-marks'.
@@ -1187,7 +1192,8 @@ This command does not work if you use short group names."
                          (if (and (integerp (car seen))
                                   (null (cdr seen)))
                              (list (cons (car seen) (car seen)))
-                           seen))))
+                           seen)))
+    (nnheader-message 8 "Updating marks for %s...done" group))
   info)
 
 (defun nnfolder-group-marks-pathname (group)
@@ -1195,14 +1201,25 @@ This command does not work if you use short group names."
   (let ((nnfolder-directory (or nnfolder-marks-directory nnfolder-directory)))
     (concat (nnfolder-group-pathname group) nnfolder-marks-file-suffix)))
 
+(defun nnfolder-marks-changed-p (group)
+  (let ((file (nnfolder-group-marks-pathname group)))
+    (if (null (gnus-gethash file nnfolder-marks-modtime))
+       t ;; never looked at marks file, assume it has changed
+      (not (equal (gnus-gethash file nnfolder-marks-modtime)
+                 (nth 5 (file-attributes file)))))))
+
 (defun nnfolder-save-marks (group server)
   (let ((file-name-coding-system nnmail-pathname-coding-system)
        (file (nnfolder-group-marks-pathname group)))
     (condition-case err
-       (with-temp-file file
-         (erase-buffer)
-         (princ nnfolder-marks (current-buffer))
-         (insert "\n"))
+       (progn
+         (with-temp-file file
+           (erase-buffer)
+           (gnus-prin1 nnfolder-marks)
+           (insert "\n"))
+         (gnus-sethash file
+                       (nth 5 (file-attributes file))
+                       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))))))
@@ -1210,13 +1227,17 @@ This command does not work if you use short group names."
 (defun nnfolder-open-marks (group server)
   (let ((file (nnfolder-group-marks-pathname group)))
     (if (file-exists-p file)
-       (setq nnfolder-marks (condition-case err
-                                (with-temp-buffer
-                                  (nnheader-insert-file-contents file)
-                                  (read (current-buffer)))
-                              (error (or (gnus-yes-or-no-p
-                                          (format "Error reading nnfolder marks file %s (%s).  Continuing will use marks from .newsrc.eld.  Continue? " file err))
-                                         (error "Cannot read nnfolder marks file %s (%s)" file err)))))
+       (condition-case err
+           (with-temp-buffer
+             (gnus-sethash file (nth 5 (file-attributes file)) 
+                           nnfolder-marks-modtime)
+             (nnheader-insert-file-contents file)
+             (setq nnfolder-marks (read (current-buffer)))
+             (dolist (el gnus-article-unpropagated-mark-lists)
+               (setq nnfolder-marks (gnus-remassoc el nnfolder-marks))))
+         (error (or (gnus-yes-or-no-p
+                     (format "Error reading nnfolder marks file %s (%s).  Continuing will use marks from .newsrc.eld.  Continue? " file err))
+                    (error "Cannot read nnfolder marks file %s (%s)" file err))))
       ;; User didn't have a .marks file.  Probably first time
       ;; user of the .marks stuff.  Bootstrap it from .newsrc.eld.
       (let ((info (gnus-get-info
@@ -1226,6 +1247,8 @@ This command does not work if you use short group names."
        (nnheader-message 7 "Bootstrapping marks for %s..." group)
        (setq nnfolder-marks (gnus-info-marks info))
        (push (cons 'read (gnus-info-read info)) nnfolder-marks)
+       (dolist (el gnus-article-unpropagated-mark-lists)
+         (setq nnfolder-marks (gnus-remassoc el nnfolder-marks)))
        (nnfolder-save-marks group server)))))
 
 (provide 'nnfolder)