*** empty log message ***
[gnus] / lisp / nnmh.el
index 608f540..900eede 100644 (file)
@@ -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.
   (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)
+  (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
-        (or dir (file-truename (file-name-as-directory nnmh-directory)))))
+  (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))
   t)
   (let ((dirs (and (file-readable-p dir)
                   (> (nth 1 (file-attributes (file-chase-links dir))) 2)
                   (directory-files dir t nil t)))
-       dir)
+       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 (not (member (file-name-nondirectory rdir) '("." "..")))
+                (file-directory-p rdir)
+                (file-readable-p rdir)
+                (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)) ?/ ?.))
+              (gnus-decode-coding-string (substring dir (match-end 0))
+                                         nnmail-pathname-coding-system)
+              ?/ ?.))
            (apply 'max files)
            (apply 'min files)))))))
   t)
       (if (stringp group)
          (and
           (nnmail-activate 'nnmh)
-          (car (nnmh-save-mail
-                (list (cons group (nnmh-active-number group)))
-                noinsert)))
+          (if noinsert
+              (nnmh-active-number group)
+            (car (nnmh-save-mail
+                  (list (cons group (nnmh-active-number group)))
+                  noinsert))))
        (and
         (nnmail-activate 'nnmh)
         (let ((res (nnmail-article-group 'nnmh-active-number)))
             (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.
   (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)