2001-07-24 09:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
[gnus] / lisp / nnml.el
index 1d078e8..080dd76 100644 (file)
@@ -35,8 +35,6 @@
 (require 'nnmail)
 (require 'nnoo)
 (eval-when-compile (require 'cl))
-(eval-and-compile
-  (autoload 'gnus-sorted-intersection "gnus-range"))
 
 (nnoo-declare nnml)
 
@@ -88,6 +86,9 @@ all.  This may very well take some time.")
 (defvoo nnml-generate-active-function 'nnml-generate-active-info)
 
 (defvar nnml-nov-buffer-file-name nil)
+(defvar nnml-check-directory-twice t
+  "If t, to make sure nothing went wrong when reading over NFS --
+check twice.")
 
 (defvoo nnml-file-coding-system nnmail-file-coding-system)
 
@@ -102,11 +103,16 @@ all.  This may very well take some time.")
     (save-excursion
       (set-buffer nntp-server-buffer)
       (erase-buffer)
-      (let ((file nil)
-           (number (length sequence))
-           (count 0)
-           (file-name-coding-system nnmail-pathname-coding-system)
-           beg article)
+      (let* ((file nil)
+             (number (length sequence))
+             (count 0)
+             (file-name-coding-system nnmail-pathname-coding-system)
+             beg article
+             (nnml-check-directory-twice 
+              (and nnml-check-directory-twice 
+                   ;; To speed up, disable it in some case.
+                   (or (not (numberp nnmail-large-newsgroup))
+                       (<= number nnmail-large-newsgroup)))))
        (if (stringp (car sequence))
            'headers
          (if (nnml-retrieve-headers-with-nov sequence fetch-old)
@@ -158,9 +164,9 @@ all.  This may very well take some time.")
                     server nnml-directory)
     t)))
 
-(defun nnml-request-regenerate (server)
+(deffoo nnml-request-regenerate (server)
   (nnml-possibly-change-directory nil server)
-  (nnml-generate-nov-databases)
+  (nnml-generate-nov-databases server)
   t)
 
 (deffoo nnml-request-article (id &optional group server buffer)
@@ -371,6 +377,9 @@ all.  This may very well take some time.")
         (nnml-save-nov))))
     result))
 
+(deffoo nnml-request-post (&optional server)
+  (nnmail-do-request-post 'nnml-request-accept-article server))
+
 (deffoo nnml-request-replace-article (article group buffer)
   (nnml-possibly-change-directory group)
   (save-excursion
@@ -489,13 +498,14 @@ all.  This may very well take some time.")
   (let (file)
     (if (setq file (cdr (assq article nnml-article-file-alist)))
        (expand-file-name file nnml-current-directory)
-      ;; Just to make sure nothing went wrong when reading over NFS --
-      ;; check once more.
-      (when (file-exists-p
-            (setq file (expand-file-name (number-to-string article)
-                                         nnml-current-directory)))
-       (nnml-update-file-alist t)
-       file))))
+      (if nnml-check-directory-twice
+          ;; Just to make sure nothing went wrong when reading over NFS --
+          ;; check once more.
+          (when (file-exists-p
+                 (setq file (expand-file-name (number-to-string article)
+                                              nnml-current-directory)))
+            (nnml-update-file-alist t)
+            file)))))
 
 (defun nnml-deletable-article-p (group article)
   "Say whether ARTICLE in GROUP can be deleted."
@@ -709,13 +719,14 @@ all.  This may very well take some time.")
       (setq nnml-nov-buffer-alist (cdr nnml-nov-buffer-alist)))))
 
 ;;;###autoload
-(defun nnml-generate-nov-databases ()
+(defun nnml-generate-nov-databases (&optional server)
   "Generate NOV databases in all nnml directories."
-  (interactive)
+  (interactive (list (or (nnoo-current-server 'nnml) "")))
   ;; Read the active file to make sure we don't re-use articles
   ;; numbers in empty groups.
   (nnmail-activate 'nnml)
-  (nnml-open-server (or (nnoo-current-server 'nnml) ""))
+  (unless (nnml-server-opened server)
+    (nnml-open-server server))
   (setq nnml-directory (expand-file-name nnml-directory))
   ;; Recurse down the directories.
   (nnml-generate-nov-databases-1 nnml-directory nil t)
@@ -754,15 +765,18 @@ all.  This may very well take some time.")
 (eval-when-compile (defvar files))
 (defun nnml-generate-active-info (dir)
   ;; Update the active info for this group.
-  (let ((group (nnheader-file-to-group
-               (directory-file-name dir) nnml-directory)))
-    (setq nnml-group-alist
-         (delq (assoc group nnml-group-alist) nnml-group-alist))
+  (let* ((group (nnheader-file-to-group
+                (directory-file-name dir) nnml-directory))
+        (entry (assoc group nnml-group-alist))
+        (last (or (caadr entry) 0)))
+    (setq nnml-group-alist (delq entry nnml-group-alist))
     (push (list group
-               (cons (caar files)
-                     (let ((f files))
-                       (while (cdr f) (setq f (cdr f)))
-                       (caar f))))
+               (cons (or (caar files) (1+ last))
+                     (max last
+                          (or (let ((f files))
+                                (while (cdr f) (setq f (cdr f)))
+                                (caar f))
+                              0))))
          nnml-group-alist)))
 
 (defun nnml-generate-nov-file (dir files)