X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fnnfolder.el;h=e6781409c94c7e1cccebeacfd61e392b42bfbbe0;hb=acb72c0dca6be11013a6f97915d5d4426445beee;hp=2863776048178688e9ae51e4a78e72b5f3b9d5ee;hpb=7416a4ac9f2a5ba4dc6320f42be6ec96b02645c7;p=gnus diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 286377604..e6781409c 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -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)) + ;;; 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)