*** empty log message ***
[gnus] / lisp / nnmh.el
index 1e7ce81..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
 
@@ -34,7 +34,7 @@
 (require 'nnmail)
 (require 'gnus-start)
 (require 'nnoo)
-(require 'cl)
+(eval-when-compile (require 'cl))
 
 (nnoo-declare nnmh)
 
@@ -60,6 +60,7 @@
 
 (defvoo nnmh-status-string "")
 (defvoo nnmh-group-alist nil)
+(defvoo nnmh-allow-delete-final nil)
 
 \f
 
@@ -76,6 +77,7 @@
           (large (and (numberp nnmail-large-newsgroup)
                       (> number nnmail-large-newsgroup)))
           (count 0)
+          (pathname-coding-system 'binary)
           beg article)
       (nnmh-possibly-change-directory newsgroup server)
       ;; We don't support fetching by Message-ID.
 
          (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))))
+       (pathname-coding-system 'binary)
        (nntp-server-buffer (or buffer nntp-server-buffer)))
     (and (stringp file)
         (file-exists-p 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))
+       (pathname-coding-system 'binary)
        dir)
     (cond
      ((not (file-directory-p pathname))
 
 (deffoo nnmh-request-list (&optional server dir)
   (nnheader-insert "")
-  (let ((nnmh-toplev
+  (nnmh-possibly-change-directory nil server)
+  (let ((pathname-coding-system 'binary)
+       (nnmh-toplev
         (file-truename (or dir (file-name-as-directory nnmh-directory)))))
     (nnmh-request-list-1 nnmh-toplev))
   (setq nnmh-group-alist (nnmail-get-active))
   ;; 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
-              (substring dir (match-end 0)) ?/ ?.))
+              (decode-coding-string (substring dir (match-end 0))
+                                    nnmail-pathname-coding-system)
+              ?/ ?.))
            (apply 'max files)
            (apply 'min files)))))))
   t)
 (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)))
             (not (nnmh-server-opened server)))
     (nnmh-open-server server))
   (when newsgroup
-    (let ((pathname (nnmail-group-pathname newsgroup nnmh-directory)))
+    (let ((pathname (nnmail-group-pathname newsgroup nnmh-directory))
+         (pathname-coding-system 'binary))
       (if (file-directory-p pathname)
          (setq nnmh-current-directory pathname)
        (error "No such newsgroup: %s" newsgroup)))))
 (defun nnmh-active-number (group)
   "Compute the next article number in GROUP."
   (let ((active (cadr (assoc group nnmh-group-alist)))
-       (dir (nnmail-group-pathname group nnmh-directory)))
+       (dir (nnmail-group-pathname group nnmh-directory))
+       (pathname-coding-system 'binary))
     (unless active
       ;; The group wasn't known to nnmh, so we just create an active
       ;; entry for it.
       (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)