*** empty log message ***
[gnus] / lisp / nnmh.el
index f91bed5..6dcdb5d 100644 (file)
@@ -1,7 +1,7 @@
 ;;; nnmh.el --- mhspool access for Gnus
-;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc.
 
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;;     Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;; Keywords: news, mail
 
@@ -60,6 +60,7 @@
 
 (defvoo nnmh-status-string "")
 (defvoo nnmh-group-alist nil)
+(defvoo nnmh-allow-delete-final nil)
 
 \f
 
@@ -76,8 +77,6 @@
           (large (and (numberp nnmail-large-newsgroup)
                       (> number nnmail-large-newsgroup)))
           (count 0)
-          ;; 1997/8/12 by MORIOKA Tomohiko
-          ;;   for XEmacs/mule.
           (pathname-coding-system 'binary)
           beg article)
       (nnmh-possibly-change-directory newsgroup server)
 
          (and large
               (zerop (% count 20))
-              (message "nnmh: Receiving headers... %d%%"
+              (nnheader-message 5 "nnmh: Receiving headers... %d%%"
                        (/ (* count 100) number))))
 
        (when large
-         (message "nnmh: Receiving headers...done"))
+         (nnheader-message 5 "nnmh: Receiving headers...done"))
 
        (nnheader-fold-continuation-lines)
        'headers))))
   (let ((file (if (stringp id)
                  nil
                (concat nnmh-current-directory (int-to-string id))))
-       ;; 1997/8/12 by MORIOKA Tomohiko
-       ;;      for XEmacs/mule.
        (pathname-coding-system 'binary)
        (nntp-server-buffer (or buffer nntp-server-buffer)))
     (and (stringp file)
         (string-to-int (file-name-nondirectory file)))))
 
 (deffoo nnmh-request-group (group &optional server dont-check)
+  (nnheader-init-server-buffer)
+  (nnmh-possibly-change-directory group server)
   (let ((pathname (nnmail-group-pathname group nnmh-directory))
-       ;; 1997/8/12 by MORIOKA Tomohiko
-       ;;      for XEmacs/mule.
        (pathname-coding-system 'binary)
        dir)
     (cond
 
 (deffoo nnmh-request-list (&optional server dir)
   (nnheader-insert "")
+  (nnmh-possibly-change-directory nil server)
   (let ((pathname-coding-system 'binary)
        (nnmh-toplev
         (file-truename (or dir (file-name-as-directory nnmh-directory)))))
   ;; Recurse down all directories.
   (let ((dirs (and (file-readable-p dir)
                   (> (nth 1 (file-attributes (file-chase-links dir))) 2)
-                  (directory-files dir t nil t)))
-       dir)
+                  (nnheader-directory-files dir t nil t)))
+       rdir)
     ;; Recurse down directories.
-    (while (setq dir (pop dirs))
-      (when (and (not (member (file-name-nondirectory dir) '("." "..")))
-                (file-directory-p dir)
-                (file-readable-p dir))
-       (nnmh-request-list-1 dir))))
+    (while (setq rdir (pop dirs))
+      (when (and (file-directory-p rdir)
+                (file-readable-p rdir)
+                (not (equal (file-truename rdir)
+                            (file-truename dir))))
+       (nnmh-request-list-1 rdir))))
   ;; For each directory, generate an active file line.
   (unless (string= (expand-file-name nnmh-toplev) dir)
     (let ((files (mapcar
                                (expand-file-name nnmh-toplev))))
               dir)
              (nnheader-replace-chars-in-string
-              (gnus-decode-coding-string (substring dir (match-end 0))
-                                         nnmail-pathname-coding-system)
+              (decode-coding-string (substring dir (match-end 0))
+                                    nnmail-pathname-coding-system)
               ?/ ?.))
            (apply 'max files)
            (apply 'min files)))))))
 (deffoo nnmh-request-expire-articles (articles newsgroup
                                               &optional server force)
   (nnmh-possibly-change-directory newsgroup server)
-  (let* ((active-articles
-         (mapcar
-          (function
-           (lambda (name)
-             (string-to-int name)))
-          (directory-files nnmh-current-directory nil "^[0-9]+$" t)))
-        (is-old t)
+  (let* ((is-old t)
         article rest mod-time)
-    (nnmail-activate 'nnmh)
+    (nnheader-init-server-buffer)
 
     (while (and articles is-old)
       (setq article (concat nnmh-current-directory
                 (push (car articles) rest))))
          (push (car articles) rest)))
       (setq articles (cdr articles)))
-    (message "")
+    (nnheader-message 5 "")
     (nconc rest articles)))
 
 (deffoo nnmh-close-group (group &optional server)
   (nnmail-check-syntax)
   (when nnmail-cache-accepted-message-ids
     (nnmail-cache-insert (nnmail-fetch-field "message-id")))
+  (nnheader-init-server-buffer)
   (prog1
       (if (stringp group)
-         (and
-          (nnmail-activate 'nnmh)
-          (car (nnmh-save-mail
-                (list (cons group (nnmh-active-number group)))
-                noinsert)))
-       (and
-        (nnmail-activate 'nnmh)
-        (let ((res (nnmail-article-group 'nnmh-active-number)))
-          (if (and (null res)
-                   (yes-or-no-p "Moved to `junk' group; delete article? "))
-              'junk
-            (car (nnmh-save-mail res noinsert))))))
+         (if noinsert
+             (nnmh-active-number group)
+           (car (nnmh-save-mail
+                 (list (cons group (nnmh-active-number group)))
+                 noinsert)))
+       (let ((res (nnmail-article-group 'nnmh-active-number)))
+         (if (and (null res)
+                  (yes-or-no-p "Moved to `junk' group; delete article? "))
+             'junk
+           (car (nnmh-save-mail res noinsert)))))
     (when (and last nnmail-cache-accepted-message-ids)
       (nnmail-cache-close))))
 
       t)))
 
 (deffoo nnmh-request-create-group (group &optional server args)
-  (nnmail-activate 'nnmh)
+  (nnheader-init-server-buffer)
   (unless (assoc group nnmh-group-alist)
     (let (active)
       (push (list group (setq active (cons 1 0)))
     (nnmh-open-server server))
   (when newsgroup
     (let ((pathname (nnmail-group-pathname newsgroup nnmh-directory))
-         ;; 1997/8/12 by MORIOKA Tomohiko
-         ;;    for XEmacs/mule.
          (pathname-coding-system 'binary))
       (if (file-directory-p pathname)
          (setq nnmh-current-directory pathname)
   "Compute the next article number in GROUP."
   (let ((active (cadr (assoc group nnmh-group-alist)))
        (dir (nnmail-group-pathname group nnmh-directory))
-       ;; 1997/8/14 by MORIOKA Tomohiko
-       ;;      for XEmacs/mule.
        (pathname-coding-system 'binary))
     (unless active
       ;; The group wasn't known to nnmh, so we just create an active
       (setq active (cons 1 0))
       (push (list group active) nnmh-group-alist)
       (unless (file-exists-p dir)
-       (make-directory dir))
+       (gnus-make-directory dir))
       ;; Find the highest number in the group.
       (let ((files (sort
                    (mapcar
     (setq articles (sort articles (lambda (art1 art2)
                                    (> (car art1) (car art2)))))
     ;; Finally write this list back to the .nnmh-articles file.
-    (nnheader-temp-write nnmh-file
+    (with-temp-file nnmh-file
       (insert ";; Gnus article active file for " group "\n\n")
       (insert "(setq nnmh-newsgroup-articles '")
       (gnus-prin1 articles)
   (let ((path (concat nnmh-current-directory (int-to-string article))))
     ;; Writable.
     (and (file-writable-p path)
-        ;; We can never delete the last article in the group.
-        (not (eq (cdr (nth 1 (assoc group nnmh-group-alist)))
-                 article)))))
+        (or
+         ;; We can never delete the last article in the group.
+         (not (eq (cdr (nth 1 (assoc group nnmh-group-alist)))
+                  article))
+         ;; Well, we can.
+         nnmh-allow-delete-final))))
 
 (provide 'nnmh)