X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-localdir.el;h=33dc9ee094f1e126334d75167ccf4dd4ad0d1426;hb=e64882498d21cef2b964ddc18d41421ab36bd19b;hp=a1ea8c816b6bc4b52ed866ef161a258c6862b051;hpb=be8d7b821412989340e00791d88ba789fa044e7e;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-localdir.el b/elmo/elmo-localdir.el index a1ea8c8..33dc9ee 100644 --- a/elmo/elmo-localdir.el +++ b/elmo/elmo-localdir.el @@ -68,8 +68,8 @@ (when (file-exists-p file) ;; Read until header separator is found. (while (and (eq elmo-localdir-header-chop-length - (nth 1 - (as-binary-input-file + (nth 1 + (as-binary-input-file (insert-file-contents file nil beg (incf beg elmo-localdir-header-chop-length))))) @@ -97,7 +97,7 @@ (elmo-localdir-insert-header file) (error (throw 'done nil))) (goto-char (point-min)) - (setq header-end + (setq header-end (if (re-search-forward "\\(^--.*$\\)\\|\\(\n\n\\)" nil t) (point) (point-max))) @@ -111,53 +111,52 @@ (elmo-localdir-msgdb-create-overview-entity-from-file number (expand-file-name (int-to-string number) dir))) -(defun elmo-localdir-msgdb-create-as-numlist (spec numlist new-mark - already-mark seen-mark +(defun elmo-localdir-msgdb-create-as-numlist (spec numlist new-mark + already-mark seen-mark important-mark seen-list) (when numlist (let ((dir (elmo-localdir-get-folder-directory spec)) overview number-alist mark-alist entity message-id - i percent len num seen gmark) - (setq len (length numlist)) - (setq i 0) + num seen gmark + (i 0) + (len (length numlist))) (message "Creating msgdb...") (while numlist (setq entity - (elmo-localdir-msgdb-create-entity + (elmo-localdir-msgdb-create-entity dir (car numlist))) (if (null entity) () (setq num (elmo-msgdb-overview-entity-get-number entity)) - (setq overview + (setq overview (elmo-msgdb-append-element overview entity)) - (setq number-alist - (elmo-msgdb-number-add number-alist - num - (elmo-msgdb-overview-entity-get-id - entity))) (setq message-id (elmo-msgdb-overview-entity-get-id entity)) + (setq number-alist + (elmo-msgdb-number-add number-alist + num + message-id)) (setq seen (member message-id seen-list)) (if (setq gmark (or (elmo-msgdb-global-mark-get message-id) (if (elmo-cache-exists-p message-id) ; XXX - (if seen + (if seen nil already-mark) - (if seen + (if seen nil ;;seen-mark new-mark)))) (setq mark-alist - (elmo-msgdb-mark-append - mark-alist + (elmo-msgdb-mark-append + mark-alist num gmark)))) - (setq i (1+ i)) - (setq percent (/ (* i 100) len)) - (elmo-display-progress - 'elmo-localdir-msgdb-create-as-numlist "Creating msgdb..." - percent) + (when (> len elmo-display-progress-threshold) + (setq i (1+ i)) + (elmo-display-progress + 'elmo-localdir-msgdb-create-as-numlist "Creating msgdb..." + (/ (* i 100) len))) (setq numlist (cdr numlist))) - (message "Creating msgdb...done.") + (message "Creating msgdb...done") (list overview number-alist mark-alist)))) (defalias 'elmo-localdir-msgdb-create 'elmo-localdir-msgdb-create-as-numlist) @@ -171,6 +170,7 @@ (defun elmo-localdir-list-folders-subr (folder &optional hierarchy) (let ((case-fold-search t) + (w32-get-true-file-link-count t) ; for Meadow folders curdir dirent relpath abspath attr subprefix subfolder) (condition-case () @@ -190,7 +190,7 @@ (setq dirent (cdr dirent)) (setq abspath (expand-file-name relpath curdir)) (and - (not (string-match + (not (string-match elmo-localdir-list-folders-filter-regexp relpath)) (eq (nth 0 (setq attr (file-attributes abspath))) t) @@ -219,16 +219,25 @@ (defsubst elmo-localdir-list-folder-subr (spec &optional nonsort) (let* ((dir (elmo-localdir-get-folder-directory spec)) (flist (mapcar 'string-to-int - (directory-files dir nil "^[0-9]+$" t)))) + (directory-files dir nil "^[0-9]+$" t))) + (killed (and elmo-use-killed-list + (elmo-msgdb-killed-list-load + (elmo-msgdb-expand-path spec)))) + numbers) (if nonsort - (cons (or (elmo-max-of-list flist) 0) (length flist)) - (sort flist '<)))) + (cons (or (elmo-max-of-list flist) 0) + (if killed + (- (length flist) + (elmo-msgdb-killed-list-length killed)) + (length flist))) + (setq numbers (sort flist '<)) + (elmo-living-messages numbers killed)))) (defun elmo-localdir-append-msg (spec string &optional msg no-see) (let ((dir (elmo-localdir-get-folder-directory spec)) (tmp-buffer (get-buffer-create " *ELMO Temp buffer*")) (next-num (or msg - (1+ (car (elmo-localdir-list-folder-subr spec t))))) + (1+ (car (elmo-localdir-max-of-folder spec))))) filename) (save-excursion (set-buffer tmp-buffer) @@ -254,7 +263,7 @@ (setq file (expand-file-name number dir)) (if (and (string-match "[0-9]+" number) ; for safety. (file-exists-p file) - (file-writable-p file) + (file-writable-p file) (not (file-directory-p file))) (progn (delete-file file) t)))) @@ -283,7 +292,7 @@ (defun elmo-localdir-check-validity (spec validity-file) (let* ((dir (elmo-localdir-get-folder-directory spec)) (cur-val (nth 5 (file-attributes dir))) - (file-val (read + (file-val (read (or (elmo-get-file-string validity-file) "nil")))) (cond @@ -303,7 +312,7 @@ (prin1 (nth 5 (file-attributes dir)) tmp-buffer) (princ "\n" tmp-buffer) (if (file-writable-p validity-file) - (write-region (point-min) (point-max) + (write-region (point-min) (point-max) validity-file nil 'no-msg) (message (format "%s is not writable." number-file))) (kill-buffer tmp-buffer)))) @@ -328,7 +337,7 @@ (defun elmo-localdir-delete-folder (spec) (let* ((dir (elmo-localdir-get-folder-directory spec))) (if (not (file-directory-p dir)) - (error "no such directory: %s" dir) + (error "No such directory: %s" dir) (elmo-delete-directory dir t) t))) @@ -337,32 +346,37 @@ (new (elmo-localdir-get-folder-directory new-spec)) (new-dir (directory-file-name (file-name-directory new)))) (if (not (file-directory-p old)) - (error "no such directory: %s" old) + (error "No such directory: %s" old) (if (file-exists-p new) - (error "already exists directory: %s" new) + (error "Already exists directory: %s" new) (if (not (file-exists-p new-dir)) (elmo-make-directory new-dir)) (rename-file old new) t)))) -(defsubst elmo-localdir-field-condition-match (spec number condition) - (elmo-file-field-condition-match +(defsubst elmo-localdir-field-condition-match (spec condition + number number-list) + (elmo-file-field-condition-match (expand-file-name (int-to-string number) (elmo-localdir-get-folder-directory spec)) - condition)) + condition + number number-list)) (defun elmo-localdir-search (spec condition &optional from-msgs) (let* ((msgs (or from-msgs (elmo-localdir-list-folder spec))) (num (length msgs)) - (i 0) case-fold-search ret-val) + (i 0) + number-list case-fold-search ret-val) + (setq number-list msgs) (while msgs - (if (elmo-localdir-field-condition-match spec (car msgs) - condition) + (if (elmo-localdir-field-condition-match spec condition + (car msgs) number-list) (setq ret-val (cons (car msgs) ret-val))) - (setq i (1+ i)) - (elmo-display-progress - 'elmo-localdir-search "Searching..." - (/ (* i 100) num)) + (when (> num elmo-display-progress-threshold) + (setq i (1+ i)) + (elmo-display-progress + 'elmo-localdir-search "Searching..." + (/ (* i 100) num))) (setq msgs (cdr msgs))) (nreverse ret-val))) @@ -371,7 +385,7 @@ &optional loc-alist same-number) (let ((dst-dir (elmo-localdir-get-folder-directory dst-spec)) - (next-num (1+ (car (elmo-localdir-list-folder-subr dst-spec t))))) + (next-num (1+ (car (elmo-localdir-max-of-folder dst-spec))))) (while msgs (elmo-copy-file ;; src file @@ -386,7 +400,7 @@ (if (and (eq (car dst-spec) 'localdir) (elmo-localdir-locked-p)) ;; MDA is running. - (1+ (car (elmo-localdir-list-folder-subr dst-spec t))) + (1+ (car (elmo-localdir-max-of-folder dst-spec))) (1+ next-num))))) t)) @@ -394,7 +408,6 @@ (let ((dir (elmo-localdir-get-folder-directory spec)) (onum-alist (elmo-msgdb-get-number-alist msgdb)) (omark-alist (elmo-msgdb-get-mark-alist msgdb)) - (oov (elmo-msgdb-get-overview msgdb)) (new-number 1) ; first ordinal position in localdir flist onum mark new-mark-alist total) (setq flist @@ -403,9 +416,10 @@ (mapcar 'car onum-alist))) (setq total (length flist)) (while flist - (elmo-display-progress - 'elmo-localdir-pack-number "Packing..." - (/ (* new-number 100) total)) + (when (> total elmo-display-progress-threshold) + (elmo-display-progress + 'elmo-localdir-pack-number "Packing..." + (/ (* new-number 100) total))) (setq onum (car flist)) (when (not (eq onum new-number)) ; why \=() is wrong.. (elmo-bind-directory @@ -414,8 +428,8 @@ (rename-file (int-to-string onum) (int-to-string new-number) t)) ;; update overview (elmo-msgdb-overview-entity-set-number - (elmo-msgdb-overview-get-entity-by-number - oov onum) new-number) + (elmo-msgdb-overview-get-entity onum msgdb) + new-number) ;; update number-alist (setcar (assq onum onum-alist) new-number)) ;; update mark-alist @@ -426,11 +440,13 @@ new-number mark))) (setq new-number (1+ new-number)) (setq flist (cdr flist))) - (message "Packing...done.") + (message "Packing...done") (list (elmo-msgdb-get-overview msgdb) onum-alist new-mark-alist - (elmo-msgdb-get-location msgdb)))) + (elmo-msgdb-get-location msgdb) + ;; remake hash table + (elmo-msgdb-make-overview-hashtb (elmo-msgdb-get-overview msgdb))))) (defun elmo-localdir-use-cache-p (spec number) nil) @@ -439,7 +455,7 @@ t) (defun elmo-localdir-get-msg-filename (spec number &optional loc-alist) - (expand-file-name + (expand-file-name (int-to-string number) (elmo-localdir-get-folder-directory spec))) @@ -452,14 +468,16 @@ (throw 'found t)) (setq lock (cdr lock))))))) -(defalias 'elmo-localdir-sync-number-alist +(defalias 'elmo-localdir-sync-number-alist 'elmo-generic-sync-number-alist) -(defalias 'elmo-localdir-list-folder-unread +(defalias 'elmo-localdir-list-folder-unread 'elmo-generic-list-folder-unread) (defalias 'elmo-localdir-list-folder-important 'elmo-generic-list-folder-important) (defalias 'elmo-localdir-commit 'elmo-generic-commit) +(defalias 'elmo-localdir-folder-diff 'elmo-generic-folder-diff) -(provide 'elmo-localdir) +(require 'product) +(product-provide (provide 'elmo-localdir) (require 'elmo-version)) ;;; elmo-localdir.el ends here