*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 23:19:23 +0000 (23:19 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 23:19:23 +0000 (23:19 +0000)
20 files changed:
lisp/ChangeLog
lisp/article.el
lisp/gnus-art.el
lisp/gnus-group.el
lisp/gnus-int.el
lisp/gnus-nocem.el
lisp/gnus-sum.el
lisp/gnus-util.el
lisp/gnus.el
lisp/nnbabyl.el
lisp/nndb.el
lisp/nndraft.el
lisp/nnfolder.el
lisp/nnheader.el
lisp/nnmail.el
lisp/nnmh.el
lisp/nnml.el
lisp/nnweb.el
texi/Makefile [deleted file]
texi/gnus.texi

index 6807ca7..0eded61 100644 (file)
@@ -1,3 +1,37 @@
+Thu Sep 26 22:13:00 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * nnweb.el (nnweb-altavista-wash-article): Didn't remove all
+       markup. 
+
+       * gnus-nocem.el (gnus-nocem-check-article): Fix security hole. 
+
+Thu Sep 26 20:23:11 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
+
+       * gnus-group.el (gnus-group-make-group): Accept an ARGS param.
+
+       * nnheader.el (nnheader-concat): Accept many file names.
+
+Thu Sep 26 19:53:09 1996  Kurt Swanson  <kurt@dna.lth.se>
+
+       * gnus-art.el (gnus-header-content-face): Buggy color names.
+
+Thu Sep 26 14:57:38 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * nnmail.el (nnmail-save-active): Rewrite.
+       (nnmail-generate-active): New function.
+
+       * gnus-util.el (gnus-delete-assq): New macro.
+       (gnus-delete-assoc): Ditto.
+
+Wed Sep 25 23:44:40 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus-sum.el (gnus-get-newsgroup-headers-xover): Just use one
+       single condition-case.
+
+Wed Sep 25 21:15:59 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.el: Red Gnus v0.42 is released.
+
 Wed Sep 25 19:40:34 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
        * gnus-art.el (gnus-header-newsgroups-face): Yucky on light
index 5b5d886..aa2e79e 100644 (file)
@@ -52,7 +52,7 @@ If `article-visible-headers' is non-nil, this variable will be ignored."
     "^Gnus-Warning:" "^Resent-")
   "All headers that do not match this regexp will be hidden.
 This variable can also be a list of regexp of headers to remain visible.
-If this variable is non-nil, `article-ignored-headers' will be ignored."
+If this variable is non-nil, `gnus-article-ignored-headers' will be ignored."
   :type '(repeat string)               ;Leave monster regexp to lisp.
   :group 'article)
 
index 6818dfc..1b9ebb7 100644 (file)
@@ -203,7 +203,7 @@ above them."
 (defface gnus-header-from-face 
   '((((class color)
       (background dark))
-     (:foreground "light-blue" :bold t :italic t))
+     (:foreground "light blue" :bold t :italic t))
     (((class color)
       (background light))
      (:foreground "MidnightBlue" :bold t :italic t))
@@ -251,7 +251,7 @@ above them."
 (defface gnus-header-content-face
   '((((class color)
       (background dark))
-     (:foreground "foerestgreen" :italic t))
+     (:foreground "forest green" :italic t))
     (((class color)
       (background light))
      (:foreground "DarkGreen" :italic t))
index 0b62567..8f783c9 100644 (file)
@@ -590,6 +590,7 @@ ticked: The number of ticked articles.")
        ["Add the help group" gnus-group-make-help-group t]
        ["Add the archive group" gnus-group-make-archive-group t]
        ["Make a doc group" gnus-group-make-doc-group t]
+       ["Make a web group" gnus-group-make-web-group t]
        ["Make a kiboze group" gnus-group-make-kiboze-group t]
        ["Make a virtual group" gnus-group-make-empty-virtual t]
        ["Add a group to a virtual" gnus-group-add-to-virtual t]
@@ -1435,10 +1436,10 @@ Return the name of the group is selection was successful."
     (unless (gnus-check-server method)
       (error "Unable to contact server: %s" (gnus-status-message method)))
     (when activate
+      (gnus-activate-group group 'scan t)
       (unless (gnus-request-group group)
        (error "Couldn't request group: %s" 
-              (nnheader-get-report (car method))))
-      (gnus-activate-group group nil t))
+              (nnheader-get-report (car method)))))
     (if request-only
        group
       (condition-case ()
@@ -1609,7 +1610,7 @@ If EXCLUDE-GROUP, do not go to that group."
   (interactive)
   (gnus-enter-server-buffer))
 
-(defun gnus-group-make-group (name &optional method address)
+(defun gnus-group-make-group (name &optional method address args)
   "Add a new newsgroup.
 The user will be prompted for a NAME, for a select METHOD, and an
 ADDRESS."
@@ -1653,7 +1654,7 @@ ADDRESS."
       (require backend))
     (gnus-check-server meth)
     (and (gnus-check-backend-function 'request-create-group nname)
-        (gnus-request-create-group nname))
+        (gnus-request-create-group nname nil args))
     t))
 
 (defun gnus-group-delete-group (group &optional force)
@@ -1889,9 +1890,10 @@ If SOLID (the prefix), create a solid group."
           'gnus-group-web-search-history))
         (method
          `(nnweb ,group (nnweb-search ,search)
-                 (nnweb-type ,(intern type)))))
+                 (nnweb-type ,(intern type))
+                 (nnweb-ephemeral-p t))))
     (if solid
-       (gnus-group-make-group group method)
+       (gnus-group-make-group group "nnweb" "" `(,(intern type) ,search))
       (gnus-group-read-ephemeral-group
        group method t
        (cons (current-buffer)
index 8f5563f..44e65ac 100644 (file)
@@ -369,12 +369,12 @@ If GROUP is nil, all groups on METHOD are scanned."
     (funcall (gnus-get-function method 'request-restore-buffer)
             article (gnus-group-real-name group) (nth 1 method))))
 
-(defun gnus-request-create-group (group &optional method)
+(defun gnus-request-create-group (group &optional method args)
   (when (stringp method)
     (setq method (gnus-server-to-method method)))
   (let ((method (or method (gnus-find-method-for-group group))))
     (funcall (gnus-get-function method 'request-create-group)
-            (gnus-group-real-name group) (nth 1 method))))
+            (gnus-group-real-name group) (nth 1 method) args)))
 
 (defun gnus-request-delete-group (group &optional force)
   (let ((method (gnus-find-method-for-group group)))
index 79f3f3a..ce78e1d 100644 (file)
@@ -141,6 +141,11 @@ isn't bound, the message will be used unconditionally.")
               (nnmail-days-to-time gnus-nocem-expiry-wait)))
       (gnus-request-article-this-buffer (mail-header-number header) group)
       (goto-char (point-min))
+      (when (re-search-forward "-----BEGIN PGP MESSAGE-----" nil t)
+       (delete-region (point-min) (match-beginning 0)))
+      (when (re-search-forward "-----END PGP MESSAGE-----\n?" nil t)
+       (delete-region (match-end 0) (point-max)))
+      (goto-char (point-min))
       ;; The article has to have proper NoCeM headers.
       (when (and (setq b (search-forward "\n@@BEGIN NCM HEADERS\n" nil t))
                 (setq e (search-forward "\n@@BEGIN NCM BODY\n" nil t)))
index 5199b45..3bda04e 100644 (file)
@@ -3946,38 +3946,6 @@ The resulting hash table is returned, or nil if no Xrefs were found."
 (defmacro gnus-nov-field ()
   '(buffer-substring (point) (if (gnus-nov-skip-field) (1- (point)) eol)))
 
-;; Goes through the xover lines and returns a list of vectors
-(defun gnus-get-newsgroup-headers-xover (sequence &optional 
-                                                 force-new dependencies)
-  "Parse the news overview data in the server buffer, and return a
-list of headers that match SEQUENCE (see `nntp-retrieve-headers')."
-  ;; Get the Xref when the users reads the articles since most/some
-  ;; NNTP servers do not include Xrefs when using XOVER.
-  (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs))
-  (let ((cur nntp-server-buffer)
-       (dependencies (or dependencies gnus-newsgroup-dependencies))
-       number headers header)
-    (save-excursion
-      (set-buffer nntp-server-buffer)
-      ;; Allow the user to mangle the headers before parsing them.
-      (run-hooks 'gnus-parse-headers-hook)
-      (goto-char (point-min))
-      (while (and sequence (not (eobp)))
-       (setq number (read cur))
-       (while (and sequence (< (car sequence) number))
-         (setq sequence (cdr sequence)))
-       (and sequence
-            (eq number (car sequence))
-            (progn
-              (setq sequence (cdr sequence))
-              (if (setq header
-                        (inline (gnus-nov-parse-line
-                                 number dependencies force-new)))
-                  (setq headers (cons header headers)))))
-       (forward-line 1))
-      (setq headers (nreverse headers)))
-    headers))
-
 ;; This function has to be called with point after the article number
 ;; on the beginning of the line.
 (defun gnus-nov-parse-line (number dependencies &optional force-new)
@@ -3990,70 +3958,100 @@ list of headers that match SEQUENCE (see `nntp-retrieve-headers')."
     (narrow-to-region (point) eol)
     (or (eobp) (forward-char))
 
-    (condition-case nil
-       (setq header
-             (vector
-              number                   ; number
-              (gnus-nov-field)         ; subject
-              (gnus-nov-field)         ; from
-              (gnus-nov-field)         ; date
-              (setq id (or (gnus-nov-field)
-                           (concat "none+"
-                                   (int-to-string
-                                    (setq none (1+ none)))))) ; id
-              (progn
-                (save-excursion
-                  (let ((beg (point)))
-                    (search-forward "\t" eol)
-                    (if (search-backward ">" beg t)
-                        (setq ref
-                              (buffer-substring
-                               (1+ (point))
-                               (search-backward "<" beg t)))
-                      (setq ref nil))))
-                (gnus-nov-field))      ; refs
-              (gnus-nov-read-integer)  ; chars
-              (gnus-nov-read-integer)  ; lines
-              (if (= (following-char) ?\n)
-                  nil
-                (gnus-nov-field))      ; misc
-              ))
-      (error (progn
-              (gnus-error 4 "Strange nov line")
-              (setq header nil)
-              (goto-char eol))))
+    (setq header
+         (vector
+          number                       ; number
+          (gnus-nov-field)             ; subject
+          (gnus-nov-field)             ; from
+          (gnus-nov-field)             ; date
+          (setq id (or (gnus-nov-field)
+                       (concat "none+"
+                               (int-to-string
+                                (setq none (1+ none)))))) ; id
+          (progn
+            (save-excursion
+              (let ((beg (point)))
+                (search-forward "\t" eol)
+                (if (search-backward ">" beg t)
+                    (setq ref
+                          (buffer-substring
+                           (1+ (point))
+                           (search-backward "<" beg t)))
+                  (setq ref nil))))
+            (gnus-nov-field))          ; refs
+          (gnus-nov-read-integer)      ; chars
+          (gnus-nov-read-integer)      ; lines
+          (if (= (following-char) ?\n)
+              nil
+            (gnus-nov-field))          ; misc
+          ))
 
     (widen)
 
     ;; We build the thread tree.
-    (when header
-      (when (equal id ref)
-       ;; This article refers back to itself.  Naughty, naughty.
-       (setq ref nil))
-      (if (boundp (setq id-dep (intern id dependencies)))
-         (if (and (car (symbol-value id-dep))
-                  (not force-new))
-             ;; An article with this Message-ID has already been seen,
-             ;; so we ignore this one, except we add any additional
-             ;; Xrefs (in case the two articles came from different
-             ;; servers.
-             (progn
-               (mail-header-set-xref
-                (car (symbol-value id-dep))
-                (concat (or (mail-header-xref
-                             (car (symbol-value id-dep))) "")
-                        (or (mail-header-xref header) "")))
-               (setq header nil))
-           (setcar (symbol-value id-dep) header))
-       (set id-dep (list header))))
-    (when header
-      (if (boundp (setq ref-dep (intern (or ref "none") dependencies)))
-         (setcdr (symbol-value ref-dep)
-                 (nconc (cdr (symbol-value ref-dep))
-                        (list (symbol-value id-dep))))
-       (set ref-dep (list nil (symbol-value id-dep)))))
+    (when (equal id ref)
+      ;; This article refers back to itself.  Naughty, naughty.
+      (setq ref nil))
+    (if (boundp (setq id-dep (intern id dependencies)))
+       (if (and (car (symbol-value id-dep))
+                (not force-new))
+           ;; An article with this Message-ID has already been seen,
+           ;; so we ignore this one, except we add any additional
+           ;; Xrefs (in case the two articles came from different
+           ;; servers.
+           (progn
+             (mail-header-set-xref
+              (car (symbol-value id-dep))
+              (concat (or (mail-header-xref
+                           (car (symbol-value id-dep))) "")
+                      (or (mail-header-xref header) "")))
+             (setq header nil))
+         (setcar (symbol-value id-dep) header))
+      (set id-dep (list header)))
+    (if (boundp (setq ref-dep (intern (or ref "none") dependencies)))
+       (setcdr (symbol-value ref-dep)
+               (nconc (cdr (symbol-value ref-dep))
+                      (list (symbol-value id-dep))))
+      (set ref-dep (list nil (symbol-value id-dep))))
     header))
 
+;; Goes through the xover lines and returns a list of vectors
+(defun gnus-get-newsgroup-headers-xover (sequence &optional 
+                                                 force-new dependencies)
+  "Parse the news overview data in the server buffer, and return a
+list of headers that match SEQUENCE (see `nntp-retrieve-headers')."
+  ;; Get the Xref when the users reads the articles since most/some
+  ;; NNTP servers do not include Xrefs when using XOVER.
+  (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs))
+  (let ((cur nntp-server-buffer)
+       (dependencies (or dependencies gnus-newsgroup-dependencies))
+       number headers header)
+    (save-excursion
+      (set-buffer nntp-server-buffer)
+      ;; Allow the user to mangle the headers before parsing them.
+      (run-hooks 'gnus-parse-headers-hook)
+      (goto-char (point-min))
+      (while (not (eobp))
+       (condition-case ()
+           (while (and sequence (not (eobp)))
+             (setq number (read cur))
+             (while (and sequence
+                         (< (car sequence) number))
+               (setq sequence (cdr sequence)))
+             (and sequence
+                  (eq number (car sequence))
+                  (progn
+                    (setq sequence (cdr sequence))
+                    (push (inline (gnus-nov-parse-line
+                                   number dependencies force-new))
+                          headers)))
+             (forward-line 1))
+         (error
+          (progn
+            (gnus-error 4 "Strange nov line")
+            (forward-line 1)))))
+      (nreverse headers))))
+
 (defun gnus-article-get-xrefs ()
   "Fill in the Xref value in `gnus-current-headers', if necessary.
 This is meant to be called in `gnus-article-internal-prepare-hook'."
@@ -7901,9 +7899,6 @@ save those articles instead."
                  (t gnus-reffed-article-number))
                 (current-buffer))
          (insert " Article retrieved.\n"))
-                                       ;(when (and header
-                                       ;          (memq (mail-header-number header) gnus-newsgroup-sparse))
-                                       ;  (setcar (gnus-id-to-thread id) nil))
        (if (not (setq header (car (gnus-get-newsgroup-headers))))
            ()                          ; Malformed head.
          (unless (memq (mail-header-number header) gnus-newsgroup-sparse)
index 2ed2c34..12bcb71 100644 (file)
@@ -552,7 +552,20 @@ Bind `print-quoted' to t while printing."
   (when (not (file-exists-p directory))
     (make-directory directory t))
   t)
+
+(defmacro gnus-delete-assq (key list)
+  `(let ((listval (eval ,list)))
+     (setq ,list (delq (assq ,key listval) listval))))
+
+(defmacro gnus-delete-assoc (key list)
+  `(let ((listval ,list))
+     (setq ,list (delq (assoc ,key listval) listval))))
+
+(defun gnus-delete-file (file)
+  "Delete FILE if it exists."
+  (when (file-exists-p file)
+    (delete-file file)))
+
 (provide 'gnus-util)
 
 ;;; gnus-util.el ends here
index 2ca8738..5e41816 100644 (file)
@@ -42,7 +42,7 @@
   "Score and kill file handling."
   :group 'gnus )
 
-(defconst gnus-version-number "0.42"
+(defconst gnus-version-number "0.43"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
index 28cf828..70db9b3 100644 (file)
 (deffoo nnbabyl-close-group (group &optional server)
   t)
 
-(deffoo nnbabyl-request-create-group (group &optional server) 
+(deffoo nnbabyl-request-create-group (group &optional server args
   (nnmail-activate 'nnbabyl)
   (unless (assoc group nnbabyl-group-alist)
     (setq nnbabyl-group-alist (cons (list group (cons 1 0))
index 188d3cb..e7fbbcf 100644 (file)
 ; get new mail from somewhere -- maybe this is not needed?
 ; --> todo
 
-(deffoo nndb-request-create-group (group &optional server)
+(deffoo nndb-request-create-group (group &optional server args)
   "Creates a group if it doesn't exist yet."
   (nntp-send-command "^[23].*\n" "MKGROUP" group))
 
index c3b890a..77d5552 100644 (file)
 (deffoo nndraft-close-group (group &optional server)
   t)
 
-(deffoo nndraft-request-create-group (group &optional server)
+(deffoo nndraft-request-create-group (group &optional server args)
   (if (file-exists-p nndraft-directory)
       (if (file-directory-p nndraft-directory)
          t
index 3b03f3f..cb61716 100644 (file)
@@ -275,7 +275,7 @@ time saver for large mailboxes.")
        nnfolder-current-buffer nil)
   t)
 
-(deffoo nnfolder-request-create-group (group &optional server) 
+(deffoo nnfolder-request-create-group (group &optional server args
   (nnfolder-possibly-change-group nil server)
   (nnmail-activate 'nnfolder)
   (when group 
index 0d8b3ea..89554e3 100644 (file)
@@ -239,6 +239,41 @@ on your system, you could say something like:
        (goto-char (point-min))
        (delete-char 1)))))
 
+(defmacro nnheader-nov-skip-field ()
+  '(search-forward "\t" eol 'move))
+
+(defmacro nnheader-nov-field ()
+  '(buffer-substring (point) (if (nnheader-nov-skip-field) (1- (point)) eol)))
+
+(defmacro nnheader-nov-read-integer ()
+  '(prog1
+       (if (= (following-char) ?\t)
+          0
+        (let ((num (condition-case nil (read (current-buffer)) (error nil))))
+          (if (numberp num) num 0)))
+     (or (eobp) (forward-char 1))))
+
+(defvar nnheader-none-counter 0)
+
+(defun nnheader-parse-nov ()
+  (let ((eol (gnus-point-at-eol)))
+    (vector
+     (nnheader-nov-read-integer)       ; number
+     (nnheader-nov-field)              ; subject
+     (nnheader-nov-field)              ; from
+     (nnheader-nov-field)              ; date
+     (or (nnheader-nov-field)
+        (concat "none+"
+                (int-to-string
+                 (incf nnheader-none-counter)))) ; id
+     (nnheader-nov-field)              ; refs
+     (nnheader-nov-read-integer)       ; chars
+     (nnheader-nov-read-integer)       ; lines
+     (if (= (following-char) ?\n)
+        nil
+       (nnheader-nov-field))           ; misc
+     )))
+
 (defun nnheader-insert-nov (header)
   (princ (mail-header-number header) (current-buffer))
   (insert 
@@ -630,9 +665,9 @@ without formatting."
   (or (and (symbolp form) (fboundp form))
       (and (listp form) (eq (car form) 'lambda))))
 
-(defun nnheader-concat (dir file)
+(defun nnheader-concat (dir &rest files)
   "Concat DIR as directory to FILE."
-  (concat (file-name-as-directory dir) file))
+  (apply 'concat (file-name-as-directory dir) files))
 
 (defun nnheader-ms-strip-cr ()
   "Strip ^M from the end of all lines."
index 9c8c105..ec8b82a 100644 (file)
@@ -514,20 +514,16 @@ nn*-request-list should have been called before calling this function."
 (defun nnmail-save-active (group-assoc file-name)
   "Save GROUP-ASSOC in ACTIVE-FILE."
   (when file-name
-    (let (group)
-      (save-excursion
-       (set-buffer (get-buffer-create " *nnmail active*"))
-       (buffer-disable-undo (current-buffer))
-       (erase-buffer)
-       (while group-assoc
-         (setq group (pop group-assoc))
-         (insert (format "%s %d %d y\n" (car group) (cdadr group) 
-                         (caadr group))))
-       (unless (file-exists-p (file-name-directory file-name))
-         (make-directory (file-name-directory file-name) t))
-       (nnmail-write-region
-        1 (point-max) (expand-file-name file-name) nil 'nomesg)
-       (kill-buffer (current-buffer))))))
+    (nnheader-temp-write file-name
+      (nnmail-generate-active group-assoc))))
+
+(defun nnmail-generate-active (alist)
+  "Generate an active file from group-alist ALIST."
+  (erase-buffer)
+  (let (group)
+    (while (setq group (pop alist))
+      (insert (format "%s %d %d y\n" (car group) (cdadr group) 
+                     (caadr group))))))
 
 (defun nnmail-get-split-group (file group)
   "Find out whether this FILE is to be split into GROUP only.
index ca70895..2832ccf 100644 (file)
          t)
       (error nil))))
 
-(deffoo nnmh-request-create-group (group &optional server) 
+(deffoo nnmh-request-create-group (group &optional server args
   (nnmail-activate 'nnmh)
   (unless (assoc group nnmh-group-alist)
     (let (active)
index 2646f77..c42ad58 100644 (file)
@@ -217,21 +217,19 @@ all.  This may very well take some time.")
   (setq nnml-article-file-alist nil)
   t)
 
-(deffoo nnml-request-create-group (group &optional server) 
+(deffoo nnml-request-create-group (group &optional server args
   (nnmail-activate 'nnml)
-  (or (assoc group nnml-group-alist)
-      (let (active)
-       (setq nnml-group-alist (cons (list group (setq active (cons 1 0)))
-                                    nnml-group-alist))
-       (nnml-possibly-create-directory group)
-       (nnml-possibly-change-directory group server)
-       (let ((articles 
-              (nnheader-directory-articles nnml-current-directory )))
-         (and articles
-              (progn
-                (setcar active (apply 'min articles))
-                (setcdr active (apply 'max articles)))))
-       (nnmail-save-active nnml-group-alist nnml-active-file)))
+  (unless (assoc group nnml-group-alist)
+    (let (active)
+      (push (list group (setq active (cons 1 0)))
+           nnml-group-alist)
+      (nnml-possibly-create-directory group)
+      (nnml-possibly-change-directory group server)
+      (let ((articles (nnheader-directory-articles nnml-current-directory)))
+       (when articles
+         (setcar active (apply 'min articles))
+         (setcdr active (apply 'max articles))))
+      (nnmail-save-active nnml-group-alist nnml-active-file)))
   t)
 
 (deffoo nnml-request-list (&optional server)
index 6d7576d..40707a3 100644 (file)
@@ -37,6 +37,9 @@
 
 (nnoo-declare nnweb)
 
+(defvoo nnweb-directory (nnheader-concat gnus-directory "nnweb/")
+  "Where nnweb will save its files.")
+
 (defvoo nnweb-type 'dejanews
   "What search engine type is being used.")
 
 (defvoo nnweb-max-hits 100
   "Maximum number of hits to display.")
 
+(defvoo nnweb-ephemeral-p nil
+  "Whether this nnweb server is ephemeral.")
+
 ;;; Internal variables
 
 (defvoo nnweb-articles nil)
 (defvoo nnweb-buffer nil)
+(defvoo nnweb-group-alist nil)
+(defvoo nnweb-group nil)
+(defvoo nnweb-hashtb nil)
 
 ;;; Interface functions
 
 (nnoo-define-basics nnweb)
 
 (deffoo nnweb-retrieve-headers (articles &optional group server fetch-old)
-  (nnweb-possibly-change-server server)
+  (nnweb-possibly-change-server group server)
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
          (nnheader-insert-nov header)))
       'nov)))
 
+(deffoo nnweb-request-scan (&optional group server)
+  (nnweb-possibly-change-server group server)
+  (funcall (nnweb-definition 'map))
+  (unless nnweb-ephemeral-p
+    (nnweb-write-active)
+    (nnweb-write-overview group)))
+
 (deffoo nnweb-request-group (group &optional server dont-check)
-  (nnweb-possibly-change-server server)
-  (when (or (not dont-check)
-           (not nnweb-articles))
-    (funcall (nnweb-definition 'map)))
+  (nnweb-possibly-change-server nil server)
+  (when (and (not (equal group nnweb-group))
+            (not nnweb-ephemeral-p))
+    (let ((info (assoc group nnweb-group-alist)))
+      (setq nnweb-group group)
+      (setq nnweb-type (nth 2 info))
+      (setq nnweb-search (nth 3 info))
+      (unless dont-check
+       (nnweb-read-overview group))))
   (cond
    ((not nnweb-articles)
     (nnheader-report 'nnweb "No matching articles"))
    (t
-    (nnheader-report 'nnweb "Opened group %s" group)
-    (nnheader-insert
-     "211 %d %d %d %s\n" (length nnweb-articles)
-     (caar nnweb-articles) (caar (last nnweb-articles))
-     group))))
+    (let ((active (if nnweb-ephemeral-p
+                     (cons (caar nnweb-articles)
+                           (caar (last nnweb-articles)))
+                   (cadr (assoc group nnweb-group-alist)))))
+      (nnheader-report 'nnweb "Opened group %s" group)
+      (nnheader-insert
+       "211 %d %d %d %s\n" (length nnweb-articles)
+       (car active) (cdr active) group)))))
 
 (deffoo nnweb-close-group (group &optional server)
-  (nnweb-possibly-change-server server)
+  (nnweb-possibly-change-server group server)
   (when (gnus-buffer-live-p nnweb-buffer)
     (save-excursion
       (set-buffer nnweb-buffer)
   t)
 
 (deffoo nnweb-request-article (article &optional group server buffer)
-  (nnweb-possibly-change-server server)
+  (nnweb-possibly-change-server group server)
   (save-excursion
     (set-buffer (or buffer nntp-server-buffer))
     (let ((url (caddr (assq article nnweb-articles))))
       (kill-buffer nnweb-buffer)))
   (nnoo-close-server 'nnweb server))
 
+(deffoo nnweb-request-list (&optional server)
+  (nnweb-possibly-change-server nil server)
+  (save-excursion
+    (set-buffer nntp-server-buffer)
+    (nnmail-generate-active nnweb-group-alist)
+    t))
+
 (deffoo nnweb-request-update-info (group info &optional server)
-  (nnweb-possibly-change-server server)
-  (setcar (cddr info) nil))
+  (nnweb-possibly-change-server group server)
+  ;;(setcar (cddr info) nil)
+  )
 
 (deffoo nnweb-asynchronous-p ()
   t)
 
+(deffoo nnweb-request-create-group (group &optional server args)
+  (nnweb-possibly-change-server nil server)
+  (nnweb-request-delete-group group)
+  (push `(,group ,(cons 1 0) ,@args) nnweb-group-alist)
+  (nnweb-write-active)
+  t)
+
+(deffoo nnweb-request-delete-group (group &optional force server)
+  (nnweb-possibly-change-server group server)
+  (gnus-delete-assoc group nnweb-group-alist)
+  (gnus-delete-file (nnweb-overview-file group))
+  t)
+  
 (nnoo-define-skeleton nnweb)
 
 ;;; Internal functions
 
+(defun nnweb-read-overview (group)
+  "Read the overview of GROUP and build the map."
+  (when (file-exists-p (nnweb-overview-file group))
+    (nnheader-temp-write nil
+      (insert-file-contents (nnweb-overview-file group))
+      (goto-char (point-min))
+      (setq nnweb-hashtb (gnus-make-hashtable
+                         (count-lines (point-min) (point-max))))
+      (let (header)
+       (while (not (eobp))
+         (setq header (nnheader-parse-nov))
+         (forward-line 1)
+         (push (list (mail-header-number header)
+                     header (mail-header-xrefs header))
+               nnweb-articles)
+         (nnweb-set-hashtb header (car nnweb-articles)))))))
+
+(defun nnweb-write-overview (group)
+  "Write the overview file for GROUP."
+  (nnheader-temp-write (nnweb-overview-file group)
+    (let ((articles nnweb-articles))
+      (while articles
+       (nnheader-insert-nov (cadr (pop articles)))))))
+
+(defun nnweb-set-hashtb (header data)
+  (gnus-sethasb (nnweb-identifier (mail-header-xrefs header))
+               data nnweb-hashtb))
+
+(defun nnweb-get-hashtb (url)
+  (gnus-gethash (nnweb-identifier url) nnweb-hashtb))
+
+(defun nnweb-identifier (ident)
+  ident)
+
+(defun nnweb-overview-file (group)
+  "Return the name of the overview file of GROUP."
+  (nnheader-concat nnweb-directory group ".overview"))
+
+(defun nnweb-write-active ()
+  "Save the active file."
+  (nnheader-temp-write (nnheader-concat nnweb-directory "active")
+    (prin1 `(setq nnweb-group-alist ',nnweb-group-alist) (current-buffer))))
+
+(defun nnweb-read-active ()
+  "Read the active file."
+  (load (nnheader-concat nnweb-directory "active") t t t))
+          
 (defun nnweb-definition (type)
   "Return the definition of TYPE."
   (let ((def (cdr (assq type (assq nnweb-type nnweb-type-definition)))))
       (error "Undefined definition %s" type))
     def))
 
-(defun nnweb-possibly-change-server (&optional server)
+(defun nnweb-possibly-change-server (&optional group server)
   (nnweb-init server)
   (when server
     (unless (nnweb-server-opened server)
-      (nnweb-open-server server))))
+      (nnweb-open-server server)))
+  (when group
+    (when (and (not nnweb-ephemeral-p)
+              (not (equal group nnweb-group)))
+      (nnweb-request-group group nil t))))
 
 (defun nnweb-init (server)
   "Initialize buffers and such."
       (let ((i 0)
            (more t)
            (case-fold-search t)
+           (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+                       (cons 1 0)))
            Subject Score Date Newsgroup Author
            map url)
        (while more
            (widen)
            (when (string-match "#[0-9]+/[0-9]+ *$" Subject)
              (setq Subject (substring Subject 0 (match-beginning 0))))
-           (push
-            (list
+           (unless (nnweb-get-hashtb url)
              (incf i)
-             (make-full-mail-header
-              i (concat  "(" Newsgroup ") " Subject) Author Date
-              (concat "<" (message-unique-id) "-" (int-to-string i)
-                      "@dejanews>")
-              nil 0 (string-to-int Score) nil)
-             url)
-            map))
+             (push
+              (list
+               (incf (cdr active))
+               (make-full-mail-header
+                (cdr active) (concat  "(" Newsgroup ") " Subject) Author Date
+                (concat "<" (message-unique-id) "-" (int-to-string i)
+                        "@dejanews>")
+                nil 0 (string-to-int Score) nil)
+               url)
+              map)))
          ;; See whether there is a "Get next 20 hits" button here.
          (if (or (not (re-search-forward
                        "HREF=\"\\([^\"]+\\)\">Get next" nil t))
            (erase-buffer)
            (url-insert-file-contents more)))
        ;; Return the articles in the right order.
-       (setq nnweb-articles (nreverse map))))))
+       (setq nnweb-articles
+             (sort map (lambda (s1 s2) (< (car s1) (car s2)))))))))
 
 (defun nnweb-dejanews-wash-article ()
   (let ((case-fold-search t))
       (let ((i 0)
            (more t)
            (case-fold-search t)
+           (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+                       (cons 1 0)))
            Subject Score Date Newsgroups From Message-ID
            map url)
        (while more
              (set (intern (match-string 1)) (match-string 2)))
            (widen)
            (search-forward "</pre>" nil t)
-           (push
-            (list
+           (unless (nnweb-get-hashtb url)
              (incf i)
-             (make-full-mail-header
-              i (concat  "(" Newsgroups ") " Subject) From Date
-              Message-ID
-              nil 0 (string-to-int Score) nil)
-             url)
-            map))
+             (push
+              (list
+               (incf (cdr active))
+               (make-full-mail-header
+                (cdr active) (concat  "(" Newsgroups ") " Subject) From Date
+                Message-ID
+                nil 0 (string-to-int Score) nil)
+               url)
+              map)))
          (setq more nil))
        ;; Return the articles in the right order.
-       (setq nnweb-articles (nreverse map))))))
+       (setq nnweb-articles
+             (sort map (lambda (s1 s2) (< (car s1) (car s2)))))))))
 
 (defun nnweb-reference-wash-article ()
   (let ((case-fold-search t))
        (let ((i 0)
              (more t)
              (case-fold-search t)
+             (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+                         (cons 1 0)))
              subject date from id group
              map url)
          (while more
                    group (match-string 4)
                    id (concat "<" (match-string 5) ">")
                    from (match-string 6))
-             (push
-              (list
+             (unless (nnweb-get-hashtb url)
                (incf i)
-               (make-full-mail-header
-                i (concat  "(" group ") " subject) from date
-                id nil 0 0 nil)
-               url)
-              map))
+               (push
+                (list
+                 (incf (cdr active))
+                 (make-full-mail-header
+                  (cdr active) (concat  "(" group ") " subject) from date
+                  id nil 0 0 nil)
+                 url)
+                map)))
            ;; See if we want more.
            (when (or (not nnweb-articles)
                      (>= i nnweb-max-hits)
                                    nnweb-search (incf part))))
              (setq more nil)))
          ;; Return the articles in the right order.
-         (setq nnweb-articles (nreverse map)))))))
+         (setq nnweb-articles
+               (sort map (lambda (s1 s2) (< (car s1) (car s2))))))))))
 
 (defun nnweb-altavista-wash-article ()
   (goto-char (point-min))
   (let ((case-fold-search t))
-    (when (re-search-forward "<H1>\\(.*\\)</H1>" nil t)
-      (setq subject (match-string 1)))
     (re-search-forward "^<strong>" nil t)
     (delete-region (point-min) (match-beginning 0))
     (goto-char (point-min))
       (narrow-to-region (point) (progn (forward-line 1) (point)))
       (goto-char (point-min))
       (while (re-search-forward "<A.*\\?id@\\([^\"]+\\)\">[0-9]+</A>" nil t)
-       (replace-match "&lt;\\1&gt; " t))
-      (widen)
-      (nnweb-remove-markup))))
+       (replace-match "&lt;\\1&gt; " t)))
+    (widen)
+    (nnweb-remove-markup)))
 
 (defun nnweb-altavista-search (search &optional part)
   (prog1
diff --git a/texi/Makefile b/texi/Makefile
deleted file mode 100644 (file)
index fa3b7f9..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-TEXI2DVI=texi2dvi
-EMACS=emacs
-MAKEINFO=$(EMACS) -batch -q -no-site-file
-INFOSWI=-l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer
-LATEX=latex
-DVIPS=dvips
-PERL=perl
-
-all: gnus message
-
-most: texi2latexi.elc latex latexps
-
-gnus: gnus.texi
-       $(MAKEINFO) gnus.texi $(INFOSWI)
-
-message: message.texi
-       $(MAKEINFO) message.texi $(INFOSWI)
-
-dvi: gnus.dvi message.dvi
-
-.texi.dvi :
-       $(PERL) -n -e 'print unless (/\@iflatex/ .. /\@end iflatex/)' $< > gnustmp.texi
-       $(TEXI2DVI) gnustmp.texi
-
-refcard.dvi: refcard.tex gnuslogo.refcard gnusref.tex
-       $(LATEX) refcard.tex
-
-sclean:
-       rm -f gnus.*.bak *.ky *.cp *.fn *.cps *.kys *.log *.aux *.dvi *.vr \
-       *.tp *.toc \
-       *.pg gnus.latexi *.aux *.[cgk]idx \
-       gnus.ilg gnus.ind gnus.[cgk]ind gnus.idx \
-       gnus.tmptexi gnus.tmplatexi gnus.tmplatexi1 texput.log *.orig *.rej \
-       gnus.latexi*~*
-
-clean:
-       make sclean 
-       rm -f *.latexi 
-
-makeinfo: 
-       makeinfo -o gnus gnus.texi      
-       makeinfo -o message message.texi        
-
-texi2latexi.elc:
-       $(EMACS) -batch -l bytecomp -f batch-byte-recompile-directory
-
-latex: gnus.texi
-       $(EMACS) -batch -q -no-site-file gnus.texi -l ./texi2latex.elc -f latexi-translate
-
-latexps: 
-       egrep -v "label.*Index|chapter.*Index" gnus.latexi > gnus.tmplatexi1
-       $(LATEX) gnus.tmplatexi1
-       splitindex
-       makeindex -o gnus.kind gnus.kidx
-       makeindex -o gnus.cind gnus.cidx
-       makeindex -o gnus.gind gnus.gidx
-       egrep -v "end{document}" gnus.tmplatexi1 > gnus.tmplatexi
-       cat postamble.tex >> gnus.tmplatexi
-       $(LATEX) gnus.tmplatexi 
-       $(LATEX) gnus.tmplatexi 
-       $(DVIPS) -f gnus.dvi > gnus.ps
-
-pss:   
-       make latex
-       make latexps
-
-psout:
-       make latex
-       make latexboth
-       make out
-
-latexboth: 
-       rm -f gnus-manual-a4.ps.gz gnus-manual-standard.ps.gz 
-       make latexps
-       mv gnus.ps gnus-manual-a4.ps
-       gzip gnus-manual-a4.ps 
-       sed 's/,a4paper//' gnus.latexi > gnus-standard.latexi 
-       make latexps
-       mv gnus.ps gnus-manual-standard.ps 
-       gzip gnus-manual-standard.ps 
-
-out:
-       cp gnus-manual-standard.ps.gz gnus-manual-a4.ps.gz \
-       /local/ftp/pub/emacs/gnus/manual
-       mv gnus-manual-standard.ps.gz gnus-manual-a4.ps.gz \
-       /hom/larsi/www_docs/gnus/manual
-
-veryclean:
-       make clean
-       rm -f gnus.dvi gnus.ps
index b9deed7..fb92975 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Red Gnus 0.42 Manual
+@settitle Red Gnus 0.43 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -64,7 +64,7 @@
 \marginpar[\hspace{2.5cm}\gnushead]{\gnushead}
 }
 
-\newcommand{\gnuscleardoublepage}{\ifodd\count0\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
+\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
 
 \newcommand{\gnuspagechapter}[1]{
 {\mbox{}}
@@ -287,7 +287,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Red Gnus 0.42 Manual
+@title Red Gnus 0.43 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -8379,6 +8379,10 @@ password, you can either set @code{nnmail-pop-password-required} to
 @code{t} and be prompted for the password, or set
 @code{nnmail-pop-password} to the password itself.
 
+Your Emacs has to have been configured with @samp{--use-pop} before
+compilation.  This is the default, but some installations have it
+switched off.
+
 When you use a mail backend, Gnus will slurp all your mail from your
 inbox and plonk it down in your home directory.  Gnus doesn't move any
 mail if you're not using a mail backend---you have to do a lot of magic