Synch with Oort Gnus.
[elisp/gnus.git-] / lisp / gnus-agent.el
index 98c9d0f..6ee9ef1 100644 (file)
@@ -33,6 +33,7 @@
 (require 'nnvirtual)
 (require 'gnus-sum)
 (require 'gnus-score)
+(require 'gnus-srvr)
 (eval-when-compile
   (if (featurep 'xemacs)
       (require 'itimer)
@@ -289,7 +290,8 @@ If this is `ask' the hook will query the user."
   "JY" gnus-agent-synchronize-flags
   "JS" gnus-group-send-queue
   "Ja" gnus-agent-add-group
-  "Jr" gnus-agent-remove-group)
+  "Jr" gnus-agent-remove-group
+  "Jo" gnus-agent-toggle-group-plugged)
 
 (defun gnus-agent-group-make-menu-bar ()
   (unless (boundp 'gnus-agent-group-menu)
@@ -297,6 +299,7 @@ If this is `ask' the hook will query the user."
      gnus-agent-group-menu gnus-agent-group-mode-map ""
      '("Agent"
        ["Toggle plugged" gnus-agent-toggle-plugged t]
+       ["Toggle group plugged" gnus-agent-toggle-group-plugged t]
        ["List categories" gnus-enter-category-buffer t]
        ["Send queue" gnus-group-send-queue gnus-plugged]
        ("Fetch"
@@ -1033,7 +1036,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 (gnus-range-add articles (cdr arts))))
+      (unless (memq (car arts) '(seen recent))
+       (setq articles (gnus-range-add articles (cdr arts)))))
     (setq articles (sort (gnus-uncompress-sequence articles) '<))
     ;; Remove known articles.
     (when (gnus-agent-load-alist group)
@@ -1107,11 +1111,16 @@ the actual number of articles toggled is returned."
       (unless (eobp)
        (gnus-agent-copy-nov-line (car articles))
        (setq articles (cdr articles))))
+    (set-buffer nntp-server-buffer)
     (when articles
       (let (b e)
        (set-buffer gnus-agent-overview-buffer)
        (setq b (point)
              e (point-max))
+       (while (and (not (eobp))
+                   (<= (read (current-buffer)) (car articles)))
+         (forward-line 1)
+         (setq b (point)))
        (set-buffer nntp-server-buffer)
        (insert-buffer-substring gnus-agent-overview-buffer b e)))))
 
@@ -1417,7 +1426,7 @@ The following commands are available:
     (gnus-category-position-point)))
 
 (defun gnus-category-name ()
-  (or (get-text-property (gnus-point-at-bol) 'gnus-category)
+  (or (intern (get-text-property (gnus-point-at-bol) 'gnus-category))
       (error "No category on the current line")))
 
 (defun gnus-category-read ()
@@ -1809,8 +1818,9 @@ The following commands are available:
   (let ((init-file-user "")
        (gnus-always-read-dribble-file t))
     (gnus))
-  (gnus-group-send-queue)
-  (gnus-agent-fetch-session))
+  (let ((gnus-agent-confirmation-function 'gnus-agent-batch-confirmation))
+    (gnus-group-send-queue)
+    (gnus-agent-fetch-session)))
 
 (defun gnus-agent-retrieve-headers (articles group &optional fetch-old)
   (save-excursion
@@ -1832,36 +1842,38 @@ The following commands are available:
              (push (read (current-buffer)) cached-articles))
            (forward-line 1))
          (setq cached-articles (sort cached-articles '<))))
-      (when (setq uncached-articles
-                 (gnus-set-difference articles cached-articles))
+      (if (setq uncached-articles
+               (gnus-set-difference articles cached-articles))
+         (progn
+           (set-buffer nntp-server-buffer)
+           (erase-buffer)
+           (let (gnus-agent-cache)
+             (unless (eq 'nov
+                         (gnus-retrieve-headers
+                          uncached-articles group fetch-old))
+               (nnvirtual-convert-headers)))
+           (set-buffer gnus-agent-overview-buffer)
+           (erase-buffer)
+           (set-buffer nntp-server-buffer)
+           (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max))
+           (when (and uncached-articles (file-exists-p file))
+             (gnus-agent-braid-nov group uncached-articles file))
+           (set-buffer nntp-server-buffer)
+           (write-region-as-coding-system gnus-agent-file-coding-system
+                                          (point-min) (point-max)
+                                          file nil 'silent)
+           (gnus-agent-load-alist group)
+           (gnus-agent-save-alist group uncached-articles nil)
+           (gnus-agent-open-history)
+           (setq gnus-agent-current-history (gnus-agent-history-buffer))
+           (gnus-agent-enter-history
+            "last-header-fetched-for-session"
+            (list (cons group (nth (- (length  articles) 1) articles)))
+            (time-to-days (current-time)))
+           (gnus-agent-save-history))
        (set-buffer nntp-server-buffer)
        (erase-buffer)
-       (let (gnus-agent-cache)
-         (unless (eq 'nov
-                     (gnus-retrieve-headers
-                      uncached-articles group fetch-old))
-           (nnvirtual-convert-headers)))
-       (set-buffer gnus-agent-overview-buffer)
-       (erase-buffer)
-       (set-buffer nntp-server-buffer)
-       (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max))
-       (when (and uncached-articles (file-exists-p file))
-         (gnus-agent-braid-nov group uncached-articles file))
-       (write-region-as-coding-system gnus-agent-file-coding-system
-                                      (point-min) (point-max)
-                                      file nil 'silent)
-       (gnus-agent-load-alist group)
-       (gnus-agent-save-alist group uncached-articles nil)
-       (gnus-agent-open-history)
-       (setq gnus-agent-current-history (gnus-agent-history-buffer))
-       (gnus-agent-enter-history
-        "last-header-fetched-for-session"
-        (list (cons group (nth (- (length  articles) 1) articles)))
-        (time-to-days (current-time)))
-       (gnus-agent-save-history)))
-    (set-buffer nntp-server-buffer)
-    (erase-buffer)
-    (insert-buffer-substring gnus-agent-overview-buffer)
+       (insert-buffer-substring gnus-agent-overview-buffer)))
     (if (and fetch-old
             (not (numberp fetch-old)))
        t                               ; Don't remove anything.
@@ -1879,8 +1891,9 @@ The following commands are available:
                  (gnus-agent-directory)
                  (gnus-agent-group-path group) "/"
                  (number-to-string article)))
-       (buffer-read-only nil))
-    (when (file-exists-p file)
+        (buffer-read-only nil))
+    (when (and (file-exists-p file)
+              (> (nth 7 (file-attributes file)) 0))
       (erase-buffer)
       (gnus-kill-all-overlays)
       (insert-file-contents-as-coding-system gnus-cache-coding-system file)
@@ -2097,6 +2110,19 @@ If CLEAN, don't read existing active and agentview files."
            force)
          (setcar (nthcdr 1 server) 'close)))))
 
+(defun gnus-agent-toggle-group-plugged (group)
+  "Toggle the status of the server of the current group."
+  (interactive (list (gnus-group-group-name)))
+  (let* ((method (gnus-find-method-for-group group))
+        (status (cadr (assoc method gnus-opened-servers))))
+    (if (eq status 'offline)
+       (gnus-server-set-status method 'closed)
+      (gnus-close-server method)
+      (gnus-server-set-status method 'offline))
+    (message "Turn %s:%s from %s to %s." (car method) (cadr method)
+            (if (eq status 'offline) 'offline 'online)
+            (if (eq status 'offline) 'online 'offline))))
+
 (provide 'gnus-agent)
 
 ;;; gnus-agent.el ends here