Checkdoc.
[elisp/wanderlust.git] / elmo / elmo-maildir.el
index 23f0a11..049c38f 100644 (file)
@@ -52,7 +52,7 @@ This variable should not be used in elsewhere.")
   (expand-file-name
    (let ((file (file-name-completion (symbol-name location)
                                     (expand-file-name "cur" dir))))
-     (if (eq file t) location file))
+     (if (eq file t) (symbol-name location) file))
    (expand-file-name "cur" dir)))
 
 (defsubst elmo-maildir-list-location (dir &optional child-dir)
@@ -105,7 +105,7 @@ This variable should not be used in elsewhere.")
                             "^[^.].*$" t))))
 
 (defun elmo-maildir-update-current (spec)
-  "Move all new msgs to cur in the maildir"
+  "Move all new msgs to cur in the maildir."
   (let* ((maildir (elmo-maildir-get-folder-directory spec))
         (news (directory-files (expand-file-name "new"
                                                  maildir)
@@ -114,26 +114,29 @@ This variable should not be used in elsewhere.")
     ;; cleanup tmp directory.
     (elmo-maildir-cleanup-temporal maildir)
     ;; move new msgs to cur directory.
-    (mapcar (lambda (x)
-             (rename-file
-              (expand-file-name x (expand-file-name "new" maildir))
-              (expand-file-name (concat x ":2,")
-                                (expand-file-name "cur" maildir))))
-           news)))
+    (while news
+      (rename-file
+       (expand-file-name (car news) (expand-file-name "new" maildir))
+       (expand-file-name (concat (car news) ":2,")
+                        (expand-file-name "cur" maildir)))
+      (setq news (cdr news)))))
 
 (defun elmo-maildir-set-mark (filename mark)
-  "Mark the file in the maildir. MARK is a character."
-  (if (string-match "^\\([^:]+:2,\\)\\(.*\\)$" filename)
+  "Mark the FILENAME file in the maildir.  MARK is a character."
+  (if (string-match "^\\([^:]+:[12],\\)\\(.*\\)$" filename)
       (let ((flaglist (string-to-char-list (elmo-match-string
                                            2 filename))))
        (unless (memq mark flaglist)
          (setq flaglist (sort (cons mark flaglist) '<))
          (rename-file filename
                       (concat (elmo-match-string 1 filename)
-                              (char-list-to-string flaglist)))))))
+                              (char-list-to-string flaglist)))))
+    ;; Rescue no info file in maildir.
+    (rename-file filename
+                (concat filename ":2," (char-to-string mark)))))
 
 (defun elmo-maildir-delete-mark (filename mark)
-  "Mark the file in the maildir. MARK is a character."
+  "Mark the FILENAME file in the maildir.  MARK is a character."
   (if (string-match "^\\([^:]+:2,\\)\\(.*\\)$" filename)
       (let ((flaglist (string-to-char-list (elmo-match-string
                                            2 filename))))
@@ -148,7 +151,7 @@ This variable should not be used in elsewhere.")
   (let ((dir (elmo-maildir-get-folder-directory spec))
        (locs (if msgdb
                  (elmo-msgdb-get-location msgdb)
-               (elmo-msgdb-location-load (elmo-msgdb-expand-path nil spec))))
+               (elmo-msgdb-location-load (elmo-msgdb-expand-path spec))))
        file)
     (while msgs
       (if (setq file (elmo-maildir-number-to-filename dir (car msgs) locs))
@@ -159,7 +162,7 @@ This variable should not be used in elsewhere.")
   (let ((dir (elmo-maildir-get-folder-directory spec))
        (locs (if msgdb
                  (elmo-msgdb-get-location msgdb)
-               (elmo-msgdb-location-load (elmo-msgdb-expand-path nil spec))))
+               (elmo-msgdb-location-load (elmo-msgdb-expand-path spec))))
        file)
     (while msgs
       (if (setq file (elmo-maildir-number-to-filename dir (car msgs) locs))
@@ -187,7 +190,7 @@ This variable should not be used in elsewhere.")
     (let* ((dir (elmo-maildir-get-folder-directory spec))
           (loc-alist (if msgdb (elmo-msgdb-get-location msgdb)
                        (elmo-msgdb-location-load (elmo-msgdb-expand-path
-                                                  nil spec))))
+                                                  spec))))
           (loc-seen (elmo-maildir-list-location dir))
           (loc-list  (car loc-seen))
           (seen-list (cdr loc-seen))
@@ -222,13 +225,14 @@ This variable should not be used in elsewhere.")
                        (elmo-msgdb-overview-entity-get-id
                         entity))
                       new-mark)))))
-       (setq i (1+ i))
-       (setq percent (/ (* i 100) num))
-       (elmo-display-progress
-        'elmo-maildir-msgdb-create "Creating msgdb..."
-        percent)
+       (when (> num elmo-display-progress-threshold)
+         (setq i (1+ i))
+         (setq percent (/ (* i 100) num))
+         (elmo-display-progress
+          'elmo-maildir-msgdb-create "Creating msgdb..."
+          percent))
        (setq numlist (cdr numlist)))
-      (message "Creating msgdb...done.")
+      (message "Creating msgdb...done")
       (elmo-msgdb-sort-by-date
        (list overview number-alist mark-alist loc-alist)))))
 
@@ -289,7 +293,8 @@ file name for maildir directories."
     (unless (file-exists-p (file-name-directory filename))
       (make-directory (file-name-directory filename)))
     (while (file-exists-p filename)
-      ;; (sleep-for 2) ; I don't want to wait.
+;;; I don't want to wait.
+;;;   (sleep-for 2)
       (setq filename
            (expand-file-name
             (concat "tmp/" (elmo-maildir-make-unique-string))
@@ -328,7 +333,7 @@ file name for maildir directories."
   (save-excursion
     (let* ((loc-alist (if msgdb (elmo-msgdb-get-location msgdb)
                        (elmo-msgdb-location-load (elmo-msgdb-expand-path
-                                                  nil spec))))
+                                                  spec))))
           (dir (elmo-maildir-get-folder-directory spec))
           (file (elmo-maildir-number-to-filename dir number loc-alist)))
       (set-buffer outbuf)
@@ -340,7 +345,7 @@ file name for maildir directories."
 (defun elmo-maildir-delete-msgs (spec msgs &optional msgdb)
   (let ((loc-alist (if msgdb (elmo-msgdb-get-location msgdb)
                     (elmo-msgdb-location-load (elmo-msgdb-expand-path
-                                               nil spec)))))
+                                               spec)))))
     (mapcar '(lambda (msg) (elmo-maildir-delete-msg spec msg
                                                    loc-alist))
            msgs)))
@@ -350,11 +355,20 @@ file name for maildir directories."
         (flist (elmo-list-folder-by-location
                 spec
                 (car (elmo-maildir-list-location dir))))
-        (news (car (elmo-maildir-list-location dir "new"))))
+        (killed (and elmo-use-killed-list
+                     (elmo-msgdb-killed-list-load
+                      (elmo-msgdb-expand-path spec))))
+        (news (car (elmo-maildir-list-location dir "new")))
+        numbers)
     (if nonsort
        (cons (+ (or (elmo-max-of-list flist) 0) (length news))
-             (+ (length flist) (length news)))
-      (sort flist '<))))
+             (+ (length news)
+                (if killed
+                    (- (length flist)
+                       (elmo-msgdb-killed-list-length killed))
+                  (length flist))))
+      (setq numbers (sort flist '<))
+      (elmo-living-messages numbers killed))))
 
 (defun elmo-maildir-list-folder (spec)
   (elmo-maildir-update-current spec)
@@ -403,30 +417,31 @@ file name for maildir directories."
            (lambda (dir)
              (setq dir (expand-file-name dir basedir))
              (if (not (file-directory-p dir))
-                 (error)
+                 (error nil)
                (elmo-delete-directory dir t))))
           '("new" "cur" "tmp" "."))
          t)
-      (error))))
+      (error nil))))
 
 (defun elmo-maildir-search (spec condition &optional from-msgs msgdb)
   (save-excursion
     (let* ((msgs (or from-msgs (elmo-maildir-list-folder spec)))
           (loc-alist (if msgdb (elmo-msgdb-get-location msgdb)
                        (elmo-msgdb-location-load (elmo-msgdb-expand-path
-                                                  nil spec))))
+                                                  spec))))
           (dir (elmo-maildir-get-folder-directory spec))
           (i 0)
           case-fold-search ret-val
           percent num
           (num (length msgs))
-          msg-num)
+          number-list msg-num)
+      (setq number-list msgs)
       (while msgs
        (setq msg-num (car msgs))
        (if (elmo-file-field-condition-match
             (elmo-maildir-number-to-filename
              dir (car msgs) loc-alist)
-            condition)
+            condition (car msgs) number-list)
            (setq ret-val (append ret-val (list msg-num))))
        (setq i (1+ i))
        (setq percent (/ (* i 100) num))
@@ -464,7 +479,39 @@ file name for maildir directories."
    (elmo-maildir-get-folder-directory spec)
    number (or loc-alist (elmo-msgdb-location-load
                         (elmo-msgdb-expand-path
-                         nil spec)))))
+                         spec)))))
+
+(defun elmo-maildir-pack-number (spec msgdb arg)
+  (let ((old-number-alist (elmo-msgdb-get-number-alist msgdb))
+       (old-overview (elmo-msgdb-get-overview msgdb))
+       (old-mark-alist (elmo-msgdb-get-mark-alist msgdb))
+       (old-location (elmo-msgdb-get-location msgdb))
+       old-number overview number-alist mark-alist location
+       mark (number 1))
+    (setq overview old-overview)
+    (while old-overview
+      (setq old-number
+           (elmo-msgdb-overview-entity-get-number (car old-overview)))
+      (elmo-msgdb-overview-entity-set-number (car old-overview) number)
+      (setq number-alist
+           (cons (cons number (cdr (assq old-number old-number-alist)))
+                 number-alist))
+      (when (setq mark (cadr (assq old-number old-mark-alist)))
+       (setq mark-alist
+             (elmo-msgdb-mark-append
+              mark-alist number mark)))
+      (setq location
+           (cons (cons number (cdr (assq old-number old-location)))
+                 location))
+      (setq number (1+ number))
+      (setq old-overview (cdr old-overview)))
+    ;; XXX Should consider when folder is not persistent.
+    (elmo-msgdb-location-save (elmo-msgdb-expand-path spec) location)
+    (list overview
+         (nreverse number-alist)
+         (nreverse mark-alist)
+         (nreverse location)
+         (elmo-msgdb-make-overview-hashtb overview))))
 
 (defalias 'elmo-maildir-sync-number-alist
   'elmo-generic-sync-number-alist)
@@ -472,7 +519,10 @@ file name for maildir directories."
   'elmo-generic-list-folder-unread)
 (defalias 'elmo-maildir-list-folder-important
   'elmo-generic-list-folder-important)
+(defalias 'elmo-maildir-commit 'elmo-generic-commit)
+(defalias 'elmo-maildir-folder-diff 'elmo-generic-folder-diff)
 
-(provide 'elmo-maildir)
+(require 'product)
+(product-provide (provide 'elmo-maildir) (require 'elmo-version))
 
 ;;; elmo-maildir.el ends here