X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-localdir.el;h=7deaf26dceb5652f88a1fe4bc9ecd531a86195e7;hb=a717271e46f76079d48f9f976807cfaeeb0a3f85;hp=1384a38b962e24d7e515f25189f6a421a2ec12f3;hpb=5360f5573613cbb954db115436ce46d68fdfb6bc;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-localdir.el b/elmo/elmo-localdir.el index 1384a38..7deaf26 100644 --- a/elmo/elmo-localdir.el +++ b/elmo/elmo-localdir.el @@ -1,4 +1,4 @@ -;;; elmo-localdir.el -- Localdir Interface for ELMO. +;;; elmo-localdir.el --- Localdir Interface for ELMO. ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA @@ -28,10 +28,10 @@ ;; ;;; Commentary: -;; +;; ;;; Code: -;; +;; (eval-when-compile (require 'cl)) (require 'elmo-msgdb) @@ -86,17 +86,21 @@ (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-localdir-folder)) - (expand-file-name + (expand-file-name (mapconcat 'identity - (mapcar + (mapcar 'elmo-replace-string-as-filename - (split-string (elmo-localdir-folder-dir-name-internal folder) - "/")) + (split-string + (let ((dir-name (elmo-localdir-folder-dir-name-internal folder))) + (if (file-name-absolute-p dir-name) + (expand-file-name dir-name) + dir-name)) + "/")) "/") (expand-file-name ;;"localdir" (symbol-name (elmo-folder-type-internal folder)) - elmo-msgdb-dir))) + elmo-msgdb-directory))) (luna-define-method elmo-message-file-name ((folder elmo-localdir-folder) @@ -121,10 +125,10 @@ numbers &optional start-number) - (let ((temp-dir (elmo-folder-make-temp-dir folder)) + (let ((temp-dir (elmo-folder-make-temporary-directory folder)) (cur-number (or start-number 0))) (dolist (number numbers) - (elmo-add-name-to-file + (elmo-copy-file (expand-file-name (int-to-string number) (elmo-localdir-folder-directory-internal folder)) @@ -140,15 +144,11 @@ (luna-define-method elmo-folder-msgdb-create ((folder elmo-localdir-folder) numbers - new-mark - already-mark - seen-mark - important-mark - seen-list) + flag-table) (when numbers (let ((dir (elmo-localdir-folder-directory-internal folder)) overview number-alist mark-alist entity message-id - num seen gmark + num gmark (i 0) (len (length numbers))) (message "Creating msgdb...") @@ -163,19 +163,18 @@ (elmo-msgdb-append-element overview 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)) + (setq number-alist + (elmo-msgdb-number-add number-alist + num + message-id)) (if (setq gmark (or (elmo-msgdb-global-mark-get message-id) - (if (elmo-file-cache-exists-p message-id) ; XXX - (if seen - nil - already-mark) - (if seen - nil ;;seen-mark - new-mark)))) + (unless (eq 'read (elmo-flag-table-get + flag-table message-id)) + (elmo-msgdb-mark + (elmo-flag-table-get flag-table message-id) + (elmo-file-cache-status + (elmo-file-cache-get message-id)) + 'new)))) (setq mark-alist (elmo-msgdb-mark-append mark-alist @@ -201,7 +200,7 @@ (defsubst elmo-localdir-list-subr (folder &optional nonsort) (let ((flist (mapcar 'string-to-int - (directory-files + (directory-files (elmo-localdir-folder-directory-internal folder) nil "^[0-9]+$" t))) (killed (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))) @@ -220,26 +219,43 @@ folder (or number (1+ (car (elmo-folder-status folder))))))) - (if (file-writable-p filename) - (write-region-as-binary - (point-min) (point-max) filename nil 'no-msg)) - t)) + (when (file-writable-p filename) + (write-region-as-binary + (point-min) (point-max) filename nil 'no-msg) + t))) -(luna-define-method elmo-folder-append-messages :around ((folder elmo-localdir-folder) - src-folder numbers - unread-marks - &optional same-number) +(luna-define-method elmo-folder-append-messages :around + ((folder elmo-localdir-folder) + src-folder numbers &optional same-number) (if (elmo-folder-message-file-p src-folder) - (let ((dir (elmo-localdir-folder-directory-internal folder)) + (let ((src-msgdb-exists (not (zerop (elmo-folder-length src-folder)))) + (dir (elmo-localdir-folder-directory-internal folder)) + (table (elmo-flag-table-load (elmo-folder-msgdb-path folder))) (succeeds numbers) - (next-num (1+ (car (elmo-folder-status folder))))) + (next-num (1+ (car (elmo-folder-status folder)))) + mark flag id) (while numbers + (setq mark (and src-msgdb-exists + (elmo-message-mark src-folder (car numbers))) + flag (cond + ((null mark) 'read) + ((member mark (elmo-msgdb-answered-marks)) + 'answered) + ;; + ((not (member mark (elmo-msgdb-unread-marks))) + 'read))) (elmo-copy-file (elmo-message-file-name src-folder (car numbers)) (expand-file-name (int-to-string (if same-number (car numbers) next-num)) dir)) + ;; save flag-table only when src folder's msgdb is loaded. + (when (setq id (and src-msgdb-exists + (elmo-message-field src-folder (car numbers) + 'message-id))) + (elmo-flag-table-set table id flag)) + (elmo-progress-notify 'elmo-folder-move-messages) (if (and (setq numbers (cdr numbers)) (not same-number)) (setq next-num @@ -247,6 +263,8 @@ ;; MDA is running. (1+ (car (elmo-folder-status folder))) (1+ next-num))))) + (when (elmo-folder-persistent-p folder) + (elmo-flag-table-save (elmo-folder-msgdb-path folder) table)) succeeds) (luna-call-next-method))) @@ -283,6 +301,9 @@ (luna-define-method elmo-folder-creatable-p ((folder elmo-localdir-folder)) t) +(luna-define-method elmo-folder-writable-p ((folder elmo-localdir-folder)) + t) + (luna-define-method elmo-folder-create ((folder elmo-localdir-folder)) (let ((dir (elmo-localdir-folder-directory-internal folder))) (if (file-directory-p dir) @@ -293,10 +314,18 @@ t))) (luna-define-method elmo-folder-delete ((folder elmo-localdir-folder)) - (let ((dir (elmo-localdir-folder-directory-internal folder))) - (if (not (file-directory-p dir)) - (error "No such directory: %s" dir) - (elmo-delete-directory dir t) + (let ((msgs (and (elmo-folder-exists-p folder) + (elmo-folder-list-messages folder)))) + (when (yes-or-no-p (format "%sDelete msgdb and substance of \"%s\"? " + (if (> (length msgs) 0) + (format "%d msg(s) exists. " (length msgs)) + "") + (elmo-folder-name-internal folder))) + (let ((dir (elmo-localdir-folder-directory-internal folder))) + (if (not (file-directory-p dir)) + (error "No such directory: %s" dir) + (elmo-delete-match-files dir "[0-9]+" t))) + (elmo-msgdb-delete-path folder) t))) (luna-define-method elmo-folder-rename-internal ((folder elmo-localdir-folder) @@ -304,14 +333,14 @@ (let* ((old (elmo-localdir-folder-directory-internal folder)) (new (elmo-localdir-folder-directory-internal new-folder)) (new-dir (directory-file-name (file-name-directory new)))) - (if (not (file-directory-p old)) - (error "No such directory: %s" old) - (if (file-exists-p new) - (error "Already exists directory: %s" new) - (if (not (file-exists-p new-dir)) - (elmo-make-directory new-dir)) - (rename-file old new) - t)))) + (unless (file-directory-p old) + (error "No such directory: %s" old)) + (when (file-exists-p new) + (error "Already exists directory: %s" new)) + (unless (file-directory-p new-dir) + (elmo-make-directory new-dir)) + (rename-file old new) + t)) (defsubst elmo-localdir-field-condition-match (folder condition number number-list) @@ -319,44 +348,6 @@ (expand-file-name (int-to-string number) (elmo-localdir-folder-directory-internal folder)) condition number number-list)) - -(luna-define-method elmo-folder-search ((folder elmo-localdir-folder) - condition &optional numbers) - (let* ((msgs (or numbers (elmo-folder-list-messages folder))) - (num (length msgs)) - (i 0) - last cur number-list case-fold-search ret-val) - (cond - ;; short cut. - ((and (vectorp condition) - (string= (elmo-filter-key condition) "last")) - (nthcdr (max (- (length msgs) - (string-to-int (elmo-filter-value condition))) - 0) - msgs)) - ((and (vectorp condition) - (string= (elmo-filter-key condition) "first")) - (let ((rest (nthcdr (string-to-int (elmo-filter-value condition) ) - msgs))) - (mapcar '(lambda (x) - (delete x msgs)) rest)) - msgs) - (t - (setq number-list msgs) - (while msgs - (if (elmo-localdir-field-condition-match folder condition - (car msgs) number-list) - (setq ret-val (cons (car msgs) ret-val))) - (when (> num elmo-display-progress-threshold) - (setq i (1+ i)) - (setq cur (/ (* i 100) num)) - (unless (eq cur last) - (elmo-display-progress - 'elmo-localdir-search "Searching..." - cur) - (setq last cur))) - (setq msgs (cdr msgs))) - (nreverse ret-val))))) (luna-define-method elmo-folder-pack-numbers ((folder elmo-localdir-folder)) (let* ((dir (elmo-localdir-folder-directory-internal folder)) @@ -377,16 +368,17 @@ (/ (* new-number 100) total))) (setq onum (car flist)) (when (not (eq onum new-number)) ; why \=() is wrong.. - (elmo-bind-directory + (elmo-bind-directory dir ;; xxx nfs,hardlink (rename-file (int-to-string onum) (int-to-string new-number) t)) - ;; update overview - (elmo-msgdb-overview-entity-set-number + ;; update overview + (elmo-msgdb-overview-entity-set-number (elmo-msgdb-overview-get-entity onum msgdb) new-number) ;; update number-alist - (setcar (assq onum onum-alist) new-number)) + (and (assq onum onum-alist) + (setcar (assq onum onum-alist) new-number))) ;; update mark-alist (when (setq mark (cadr (assq onum omark-alist))) (setq new-mark-alist @@ -398,12 +390,10 @@ (message "Packing...done") (elmo-folder-set-msgdb-internal folder - (list (elmo-msgdb-get-overview msgdb) - onum-alist - new-mark-alist - ;; remake hash table - (elmo-msgdb-make-overview-hashtb - (elmo-msgdb-get-overview msgdb)))))) + (elmo-make-msgdb + (elmo-msgdb-get-overview msgdb) + onum-alist + new-mark-alist)))) (luna-define-method elmo-folder-message-file-p ((folder elmo-localdir-folder)) t)