Synch with `t-gnus-6_14' and Gnus.
[elisp/gnus.git-] / lisp / gnus-agent.el
index d9104f4..4924a29 100644 (file)
 (require 'gnus-cache)
 (require 'nnvirtual)
 (require 'gnus-sum)
-(eval-when-compile (require 'gnus-score) (require 'gnus-group))
+(eval-when-compile
+  (if (featurep 'xemacs)
+      (require 'itimer)
+    (require 'timer))
+  (require 'gnus-score)
+  (require 'gnus-group))
 
 (defcustom gnus-agent-directory (nnheader-concat gnus-directory "agent/")
   "Where the Gnus agent will store its files."
@@ -443,7 +448,7 @@ Currently sends flag setting requests, if any."
       (when (file-exists-p (gnus-agent-lib-file "flags"))
        (set-buffer (get-buffer-create " *Gnus Agent flag synchronize*"))
        (erase-buffer)
-       (insert-file-contents (gnus-agent-lib-file "flags"))
+       (nnheader-insert-file-contents (gnus-agent-lib-file "flags"))
        (if (null (gnus-check-server gnus-command-method))
            (message "Couldn't open server %s" (nth 1 gnus-command-method))
          (while (not (eobp))
@@ -453,7 +458,8 @@ Currently sends flag setting requests, if any."
              (write-file (gnus-agent-lib-file "flags"))
              (error "Couldn't set flags from file %s"
                     (gnus-agent-lib-file "flags"))))
-         (write-file (gnus-agent-lib-file "flags")))))))
+         (write-file (gnus-agent-lib-file "flags")))
+        (kill-buffer nil)))))
 
 ;;;
 ;;; Server mode commands
@@ -493,8 +499,12 @@ Currently sends flag setting requests, if any."
 (defun gnus-agent-write-servers ()
   "Write the alist of covered servers."
   (gnus-make-directory (nnheader-concat gnus-agent-directory "lib"))
-  (with-temp-file (nnheader-concat gnus-agent-directory "lib/servers")
-    (prin1 gnus-agent-covered-methods (current-buffer))))
+  (let ((coding-system-for-write nnheader-file-coding-system)
+       (output-coding-system nnheader-file-coding-system)
+       (file-name-coding-system nnmail-pathname-coding-system)
+       (pathname-coding-system nnmail-pathname-coding-system))
+    (with-temp-file (nnheader-concat gnus-agent-directory "lib/servers")
+      (prin1 gnus-agent-covered-methods (current-buffer)))))
 
 ;;;
 ;;; Summary commands
@@ -624,8 +634,7 @@ the actual number of articles toggled is returned."
     (gnus-make-directory (file-name-directory file))
     ;; The hashtable contains real names of groups,  no more prefix
     ;; removing, so set `full' to `t'.
-    (gnus-write-active-file-as-coding-system gnus-agent-file-coding-system
-                                            file orig t)))
+    (gnus-write-active-file file orig t)))
 
 (defun gnus-agent-save-groups (method)
   (gnus-agent-save-active-1 method 'gnus-groups-to-gnus-format))
@@ -633,6 +642,10 @@ the actual number of articles toggled is returned."
 (defun gnus-agent-save-group-info (method group active)
   (when (gnus-agent-method-p method)
     (let* ((gnus-command-method method)
+          (coding-system-for-write nnheader-file-coding-system)
+          (output-coding-system nnheader-file-coding-system)
+          (file-name-coding-system nnmail-pathname-coding-system)
+          (pathname-coding-system nnmail-pathname-coding-system)
           (file (gnus-agent-lib-file "active"))
           oactive)
       (gnus-make-directory (file-name-directory file))
@@ -700,7 +713,7 @@ the actual number of articles toggled is returned."
     (insert "\n")
     (let ((file (gnus-agent-lib-file "history")))
       (when (file-exists-p file)
-       (insert-file file))
+       (nnheader-insert-file-contents file))
       (set (make-local-variable 'gnus-agent-file-name) file))))
 
 (defun gnus-agent-save-history ()
@@ -869,6 +882,20 @@ the actual number of articles toggled is returned."
        (insert "\n"))
       (pop gnus-agent-group-alist))))
 
+(defun gnus-agent-union (l1 l2)
+  "Set union of lists L1 and L2."
+  (cond ((null l1) l2)
+       ((null l2) l1)
+       ((equal l1 l2) l1)
+       (t
+        (or (>= (length l1) (length l2))
+            (setq l1 (prog1 l2 (setq l2 l1))))
+        (while l2
+          (or (memq (car l2) l1)
+              (push (car l2) l1))
+          (pop l2))
+        l1)))
+
 (defun gnus-agent-fetch-headers (group &optional force)
   (let* ((articles (gnus-list-of-unread-articles group))
         (len (length articles))
@@ -882,8 +909,8 @@ the actual number of articles toggled is returned."
           (setq articles (nthcdr i articles))))
     ;; add article with marks to list of article headers we want to fetch.
     (dolist (arts (gnus-info-marks (gnus-get-info group)))
-      (setq articles (union (gnus-uncompress-sequence (cdr arts))
-                           articles)))
+      (setq articles (gnus-agent-union (gnus-uncompress-sequence (cdr arts))
+                                      articles)))
     (setq articles (sort articles '<))
     ;; Remove known articles.
     (when (gnus-agent-load-alist group)
@@ -974,15 +1001,17 @@ the actual number of articles toggled is returned."
 
 (defun gnus-agent-save-alist (group &optional articles state dir)
   "Save the article-state alist for GROUP."
-  (with-temp-file (if dir
-                     (concat dir ".agentview")
-                   (gnus-agent-article-name ".agentview" group))
-    (princ (setq gnus-agent-article-alist
-                (nconc gnus-agent-article-alist
-                       (mapcar (lambda (article) (cons article state))
-                               articles)))
-          (current-buffer))
-    (insert "\n")))
+  (let ((file-name-coding-system nnmail-pathname-coding-system)
+       (pathname-coding-system nnmail-pathname-coding-system))
+    (with-temp-file (if dir
+                       (concat dir ".agentview")
+                     (gnus-agent-article-name ".agentview" group))
+      (princ (setq gnus-agent-article-alist
+                  (nconc gnus-agent-article-alist
+                         (mapcar (lambda (article) (cons article state))
+                                 articles)))
+            (current-buffer))
+      (insert "\n"))))
 
 (defun gnus-agent-article-name (article group)
   (concat (gnus-agent-directory) (gnus-agent-group-path group) "/"
@@ -1032,7 +1061,13 @@ the actual number of articles toggled is returned."
        gnus-newsgroup-dependencies gnus-newsgroup-headers
        gnus-newsgroup-scored gnus-headers gnus-score
        gnus-use-cache articles arts
-       category predicate info marks score-param)
+       category predicate info marks score-param
+       (gnus-summary-expunge-below gnus-summary-expunge-below)
+       (gnus-summary-mark-below gnus-summary-mark-below)
+       (gnus-orphan-score gnus-orphan-score)
+       ;; Maybe some other gnus-summary local variables should also
+       ;; be put here.
+       )
     (unless (gnus-check-group group)
       (error "Can't open server for %s" group))
     ;; Fetch headers.
@@ -1616,9 +1651,7 @@ The following commands are available:
                (gnus-delete-line))
              (gnus-agent-save-history)
              (gnus-agent-close-history)
-             (gnus-write-active-file-as-coding-system
-              gnus-agent-file-coding-system
-              (gnus-agent-lib-file "active") orig))
+             (gnus-write-active-file (gnus-agent-lib-file "active") orig))
            (gnus-message 4 "Expiry...done")))))))
 
 ;;;###autoload