flag-table)
(when numbers
(let ((dir (elmo-localdir-folder-directory-internal folder))
- overview number-alist mark-alist entity message-id
- num gmark
+ (new-msgdb (elmo-make-msgdb))
+ entity message-id
+ flags
(i 0)
(len (length numbers)))
(message "Creating msgdb...")
(setq entity
(elmo-localdir-msgdb-create-entity
dir (car numbers)))
- (if (null entity)
- ()
- (setq num (elmo-msgdb-overview-entity-get-number entity))
- (setq overview
- (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))
- (if (setq gmark (or (elmo-msgdb-global-mark-get message-id)
- (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
- num
- gmark))))
+ (when entity
+ (setq message-id (elmo-msgdb-overview-entity-get-id entity)
+ flags (elmo-flag-table-get flag-table message-id))
+ (elmo-global-flags-set flags folder (car numbers) message-id)
+ (elmo-msgdb-append-entity new-msgdb entity flags))
(when (> len elmo-display-progress-threshold)
(setq i (1+ i))
(elmo-display-progress
(/ (* i 100) len)))
(setq numbers (cdr numbers)))
(message "Creating msgdb...done")
- (list overview number-alist mark-alist))))
+ new-msgdb)))
(luna-define-method elmo-folder-list-subfolders ((folder elmo-localdir-folder)
&optional one-level)
((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))))
- mark flag id)
+ flags id)
(while numbers
- (setq mark (elmo-message-mark src-folder (car numbers))
- flag (cond
- ((null mark) nil)
- ((member mark (elmo-msgdb-answered-marks))
- 'answered)
- ;;
- ((not (member mark (elmo-msgdb-unread-marks)))
- 'read)))
+ (setq flags (elmo-message-flags src-folder (car numbers)))
(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))
- ;; src folder's msgdb is loaded.
- (when (setq id (elmo-message-field src-folder (car numbers)
- 'message-id))
- (elmo-flag-table-set table id flag))
+ ;; 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 flags))
(elmo-progress-notify 'elmo-folder-move-messages)
(if (and (setq numbers (cdr numbers))
(not same-number))
(luna-define-method elmo-folder-pack-numbers ((folder elmo-localdir-folder))
(let* ((dir (elmo-localdir-folder-directory-internal folder))
(msgdb (elmo-folder-msgdb folder))
- (onum-alist (elmo-msgdb-get-number-alist msgdb))
- (omark-alist (elmo-msgdb-get-mark-alist msgdb))
- (new-number 1) ; first ordinal position in localdir
- flist onum mark new-mark-alist total)
- (setq flist
- (if elmo-pack-number-check-strict
- (elmo-folder-list-messages folder) ; allow localnews
- (mapcar 'car onum-alist)))
- (setq total (length flist))
- (while flist
- (when (> total elmo-display-progress-threshold)
- (elmo-display-progress
- 'elmo-folder-pack-numbers "Packing..."
- (/ (* new-number 100) total)))
- (setq onum (car flist))
- (when (not (eq onum new-number)) ; why \=() is wrong..
- (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
- (elmo-msgdb-overview-get-entity onum msgdb)
- new-number)
- ;; update number-alist
- (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
- (elmo-msgdb-mark-append
- new-mark-alist
- new-number mark)))
- (setq new-number (1+ new-number))
- (setq flist (cdr flist)))
+ (new-msgdb (elmo-make-msgdb (elmo-folder-msgdb-path folder)))
+ (numbers (sort (elmo-folder-list-messages
+ folder
+ nil
+ (not elmo-pack-number-check-strict))
+ '<))
+ (new-number 1) ; first ordinal position in localdir
+ total entity)
+ (setq total (length numbers))
+ (elmo-with-progress-display (> total elmo-display-progress-threshold)
+ (elmo-folder-pack-numbers total "Packing...")
+ (dolist (old-number numbers)
+ (setq entity (elmo-msgdb-message-entity msgdb old-number))
+ (when (not (eq old-number new-number)) ; why \=() is wrong..
+ (elmo-bind-directory
+ dir
+ ;; xxx nfs,hardlink
+ (rename-file (int-to-string old-number)
+ (int-to-string new-number) t))
+ (elmo-msgdb-overview-entity-set-number entity new-number))
+ (elmo-msgdb-append-entity new-msgdb entity
+ (elmo-msgdb-flags msgdb old-number))
+ (setq new-number (1+ new-number))))
(message "Packing...done")
- (elmo-folder-set-msgdb-internal
- folder
- (elmo-make-msgdb
- (elmo-msgdb-get-overview msgdb)
- onum-alist
- new-mark-alist))))
+ (elmo-folder-set-msgdb-internal folder new-msgdb)))
(luna-define-method elmo-folder-message-file-p ((folder elmo-localdir-folder))
t)
(throw 'found t))
(setq lock (cdr lock)))))))
+(autoload 'elmo-global-flags-set "elmo-flag")
+
(require 'product)
(product-provide (provide 'elmo-localdir) (require 'elmo-version))