* wl-vars.el (wl-folder-sync-range-alist): Set default range for
[elisp/wanderlust.git] / elmo / elmo-localdir.el
index 7ebcf1c..06d0d06 100644 (file)
   (when numbers
     (let ((dir (elmo-localdir-folder-directory-internal folder))
          (new-msgdb (elmo-make-msgdb))
-         entity message-id gmark
+         entity message-id
+         flags
          (i 0)
          (len (length numbers)))
       (message "Creating msgdb...")
              (elmo-localdir-msgdb-create-entity
               dir (car numbers)))
        (when entity
-         (setq message-id (elmo-msgdb-overview-entity-get-id entity))
-         (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))))
-         (elmo-msgdb-append-entity new-msgdb entity gmark))
+         (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
            (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 (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)))
+         (setq flags (elmo-message-flags src-folder (car numbers)))
          (elmo-copy-file
           (elmo-message-file-name src-folder (car numbers))
           (expand-file-name
          (when (setq id (and src-msgdb-exists
                              (elmo-message-field src-folder (car numbers)
                                                  'message-id)))
-           (elmo-flag-table-set table id flag))
+           (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))