*** empty log message ***
[gnus] / lisp / nnkiboze.el
index 531f2e4..6fba5d0 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nnkiboze.el --- select virtual news access for Gnus
-;; Copyright (C) 1995,96 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
 ;; Keywords: news
@@ -80,7 +80,7 @@
          (save-excursion
            (set-buffer nntp-server-buffer)
            (erase-buffer)
-           (insert-file-contents nov)
+           (nnheader-insert-file-contents nov)
            (nnheader-nov-delete-outside-range
             (car articles) (car (last articles)))
            'nov))))))
        (erase-buffer)
        (if (not (file-exists-p nov-file))
            (nnheader-report 'nnkiboze "Can't select group %s" group)
-         (insert-file-contents nov-file)
+         (nnheader-insert-file-contents nov-file)
          (if (zerop (buffer-size))
              (nnheader-insert "211 0 0 0 %s\n" group)
            (goto-char (point-min))
             nnkiboze-remove-read-articles)
     (nnheader-temp-write (nnkiboze-nov-file-name)
       (let ((cur (current-buffer)))
-       (insert-file-contents (nnkiboze-nov-file-name))
+       (nnheader-insert-file-contents (nnkiboze-nov-file-name))
        (goto-char (point-min))
        (while (not (eobp))
          (if (not (gnus-article-read-p (read cur)))
@@ -193,7 +193,7 @@ Finds out what articles are to be part of the nnkiboze groups."
     (while (setq info (pop newsrc))
       (when (string-match "nnkiboze" (gnus-info-group info))
        ;; For each kiboze group, we call this function to generate
-       ;; it.  
+       ;; it.
        (nnkiboze-generate-group (gnus-info-group info))))))
 
 (defun nnkiboze-score-file (group)
@@ -207,108 +207,109 @@ Finds out what articles are to be part of the nnkiboze groups."
   (let* ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb)))
         (newsrc-file (concat nnkiboze-directory group ".newsrc"))
         (nov-file (concat nnkiboze-directory group ".nov"))
+        method nnkiboze-newsrc gname newsrc active
+        ginfo lowest glevel orig-info nov-buffer
+        ;; Bind various things to nil to make group entry faster.
         (gnus-expert-user t)
         (gnus-large-newsgroup nil)
-        (version-control 'never)
         (gnus-score-find-score-files-function 'nnkiboze-score-file)
-        gnus-select-group-hook gnus-summary-prepare-hook 
-        gnus-thread-sort-functions gnus-show-threads 
-        gnus-visual
-        method nnkiboze-newsrc nov-buffer gname newsrc active
-        ginfo lowest glevel orig-info)
+        (gnus-verbose (min gnus-verbose 3))
+        gnus-select-group-hook gnus-summary-prepare-hook
+        gnus-thread-sort-functions gnus-show-threads
+        gnus-visual gnus-suppress-duplicates)
     (unless info
       (error "No such group: %s" group))
     ;; Load the kiboze newsrc file for this group.
     (when (file-exists-p newsrc-file)
       (load newsrc-file))
-    ;; We also load the nov file for this group.
-    (save-excursion
-      (set-buffer (setq nov-buffer (find-file-noselect nov-file)))
-      (buffer-disable-undo (current-buffer)))
-    ;; Go through the active hashtb and add new all groups that match the 
-    ;; kiboze regexp.
-    (mapatoms
-     (lambda (group)
-       (and (string-match nnkiboze-regexp
-                         (setq gname (symbol-name group))) ; Match
-           (not (assoc gname nnkiboze-newsrc)) ; It isn't registered
-           (numberp (car (symbol-value group))) ; It is active
-           (or (> nnkiboze-level 7)
-               (and (setq glevel (nth 1 (nth 2 (gnus-gethash
-                                                gname gnus-newsrc-hashtb))))
-                    (>= nnkiboze-level glevel)))
-           (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes
-           (push (cons gname (1- (car (symbol-value group))))
-                 nnkiboze-newsrc)))
-     gnus-active-hashtb)
-    ;; `newsrc' is set to the list of groups that possibly are
-    ;; component groups to this kiboze group.  This list has elements
-    ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest
-    ;; number that has been kibozed in GROUP in this kiboze group.
-    (setq newsrc nnkiboze-newsrc)
-    (while newsrc
-      (if (not (setq active (gnus-gethash 
-                            (caar newsrc) gnus-active-hashtb)))
-         ;; This group isn't active after all, so we remove it from
-         ;; the list of component groups.
-         (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc))
-       (setq lowest (cdar newsrc))
-       ;; Ok, we have a valid component group, so we jump to it. 
-       (switch-to-buffer gnus-group-buffer)
-       (gnus-group-jump-to-group (caar newsrc))
-       (setq ginfo (gnus-get-info (gnus-group-group-name))
-             orig-info (gnus-copy-sequence ginfo))
-       (unwind-protect
-           (progn
-             ;; We set all list of article marks to nil.  Since we operate
-             ;; on copies of the real lists, we can destroy anything we
-             ;; want here.
-             (when (nth 3 ginfo)
-               (setcar (nthcdr 3 ginfo) nil))
-             ;; We set the list of read articles to be what we expect for
-             ;; this kiboze group -- either nil or `(1 . LOWEST)'. 
-             (when ginfo
-               (setcar (nthcdr 2 ginfo)
-                       (and (not (= lowest 1)) (cons 1 lowest))))
-             (when (and (or (not ginfo)
-                            (> (length (gnus-list-of-unread-articles 
-                                        (car ginfo)))
-                               0))
-                        (progn
-                          (gnus-group-select-group nil)
-                          (eq major-mode 'gnus-summary-mode)))
-               ;; We are now in the group where we want to be.
-               (setq method (gnus-find-method-for-group gnus-newsgroup-name))
-               (when (eq method gnus-select-method)
-                 (setq method nil))
-               ;; We go through the list of scored articles.
-               (while gnus-newsgroup-scored
-                 (when (> (caar gnus-newsgroup-scored) lowest)
-                   ;; If it has a good score, then we enter this article
-                   ;; into the kiboze group.
-                   (nnkiboze-enter-nov 
-                    nov-buffer
-                    (gnus-summary-article-header 
-                     (caar gnus-newsgroup-scored))
-                    gnus-newsgroup-name))
-                 (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored)))
-               ;; That's it.  We exit this group.
-               (gnus-summary-exit-no-update)))
-         ;; Restore the proper info.
-         (setcdr ginfo (cdr orig-info))))
-      (setcdr (car newsrc) (car active))
-      (setq newsrc (cdr newsrc)))
-    ;; We save the nov file.
-    (set-buffer nov-buffer)
-    (save-buffer)
-    (kill-buffer (current-buffer))
+    (nnheader-temp-write nov-file
+      (when (file-exists-p nov-file)
+       (insert-file-contents nov-file))
+      (setq nov-buffer (current-buffer))
+      ;; Go through the active hashtb and add new all groups that match the
+      ;; kiboze regexp.
+      (mapatoms
+       (lambda (group)
+        (and (string-match nnkiboze-regexp
+                           (setq gname (symbol-name group))) ; Match
+             (not (assoc gname nnkiboze-newsrc)) ; It isn't registered
+             (numberp (car (symbol-value group))) ; It is active
+             (or (> nnkiboze-level 7)
+                 (and (setq glevel (nth 1 (nth 2 (gnus-gethash
+                                                  gname gnus-newsrc-hashtb))))
+                      (>= nnkiboze-level glevel)))
+             (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes
+             (push (cons gname (1- (car (symbol-value group))))
+                   nnkiboze-newsrc)))
+       gnus-active-hashtb)
+      ;; `newsrc' is set to the list of groups that possibly are
+      ;; component groups to this kiboze group.  This list has elements
+      ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest
+      ;; number that has been kibozed in GROUP in this kiboze group.
+      (setq newsrc nnkiboze-newsrc)
+      (while newsrc
+       (if (not (setq active (gnus-gethash
+                              (caar newsrc) gnus-active-hashtb)))
+           ;; This group isn't active after all, so we remove it from
+           ;; the list of component groups.
+           (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc))
+         (setq lowest (cdar newsrc))
+         ;; Ok, we have a valid component group, so we jump to it.
+         (switch-to-buffer gnus-group-buffer)
+         (gnus-group-jump-to-group (caar newsrc))
+         (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc))
+         (setq ginfo (gnus-get-info (gnus-group-group-name))
+               orig-info (gnus-copy-sequence ginfo))
+         (unwind-protect
+             (progn
+               ;; We set all list of article marks to nil.  Since we operate
+               ;; on copies of the real lists, we can destroy anything we
+               ;; want here.
+               (when (nth 3 ginfo)
+                 (setcar (nthcdr 3 ginfo) nil))
+               ;; We set the list of read articles to be what we expect for
+               ;; this kiboze group -- either nil or `(1 . LOWEST)'.
+               (when ginfo
+                 (setcar (nthcdr 2 ginfo)
+                         (and (not (= lowest 1)) (cons 1 lowest))))
+               (when (and (or (not ginfo)
+                              (> (length (gnus-list-of-unread-articles
+                                          (car ginfo)))
+                                 0))
+                          (progn
+                            (gnus-group-select-group nil)
+                            (eq major-mode 'gnus-summary-mode)))
+                 ;; We are now in the group where we want to be.
+                 (setq method (gnus-find-method-for-group
+                               gnus-newsgroup-name))
+                 (when (eq method gnus-select-method)
+                   (setq method nil))
+                 ;; We go through the list of scored articles.
+                 (while gnus-newsgroup-scored
+                   (when (> (caar gnus-newsgroup-scored) lowest)
+                     ;; If it has a good score, then we enter this article
+                     ;; into the kiboze group.
+                     (nnkiboze-enter-nov
+                      nov-buffer
+                      (gnus-summary-article-header
+                       (caar gnus-newsgroup-scored))
+                      gnus-newsgroup-name))
+                   (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored)))
+                 ;; That's it.  We exit this group.
+                 (gnus-summary-exit-no-update)))
+           ;; Restore the proper info.
+           (when ginfo
+             (setcdr ginfo (cdr orig-info)))))
+       (setcdr (car newsrc) (car active))
+       (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc))
+       (setq newsrc (cdr newsrc))))
     ;; We save the kiboze newsrc for this group.
     (nnheader-temp-write newsrc-file
       (insert "(setq nnkiboze-newsrc '")
       (gnus-prin1 nnkiboze-newsrc)
       (insert ")\n"))
     t))
-    
+
 (defun nnkiboze-enter-nov (buffer header group)
   (save-excursion
     (set-buffer buffer)
@@ -326,11 +327,13 @@ Finds out what articles are to be part of the nnkiboze groups."
       (mail-header-set-number oheader article)
       (nnheader-insert-nov oheader)
       (search-backward "\t" nil t 2)
-      (forward-char 1)
+      (if (re-search-forward " [^ ]+:[0-9]+" nil t)
+         (goto-char (match-beginning 0))
+       (forward-char 1))
       ;; The first Xref has to be the group this article
       ;; really came for - this is the article nnkiboze
       ;; will request when it is asked for the article.
-      (insert group ":" 
+      (insert group ":"
              (int-to-string (mail-header-number header)) " ")
       (while (re-search-forward " [^ ]+:[0-9]+" nil t)
        (goto-char (1+ (match-beginning 0)))