1 diff --git a/src/folder.c b/src/folder.c
2 index 2a8d862..c080f8c 100644
5 @@ -969,7 +969,7 @@ void folder_scan_tree(Folder *folder, gboolean rebuild)
6 FolderItem *folder_create_folder(FolderItem *parent, const gchar *name)
11 cm_return_val_if_fail(parent != NULL, NULL);
13 new_item = parent->folder->klass->create_folder(parent->folder, parent, name);
14 diff --git a/src/imap.c b/src/imap.c
15 index 8870719..9086635 100644
18 @@ -290,6 +290,12 @@ static FolderItem *imap_create_special_folder
19 static gint imap_do_copy_msgs (Folder *folder,
22 + GHashTable *relation,
23 + gboolean same_dest_ok);
25 +static gint imap_do_remove_msgs (Folder *folder,
27 + MsgInfoList *msglist,
28 GHashTable *relation);
30 static void imap_delete_all_cached_messages (FolderItem *item);
31 @@ -1810,7 +1816,8 @@ static GSList *flatten_mailimap_set(struct mailimap_set * set)
34 static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
35 - MsgInfoList *msglist, GHashTable *relation)
36 + MsgInfoList *msglist, GHashTable *relation,
37 + gboolean same_dest_ok)
41 @@ -1834,7 +1841,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
43 msginfo = (MsgInfo *)msglist->data;
44 src = msginfo->folder;
46 + if (!same_dest_ok && src == dest) {
47 g_warning("the src folder is identical to the dest.\n");
50 @@ -2018,10 +2025,32 @@ static gint imap_copy_msgs(Folder *folder, FolderItem *dest,
51 msginfo = (MsgInfo *)msglist->data;
52 g_return_val_if_fail(msginfo->folder != NULL, -1);
54 - ret = imap_do_copy_msgs(folder, dest, msglist, relation);
55 + ret = imap_do_copy_msgs(folder, dest, msglist, relation, FALSE);
59 +static gboolean imap_renumber_msg(MsgInfo *info)
64 + g_return_val_if_fail(info != NULL, -1);
66 + msglist.data = info;
67 + msglist.next = NULL;
69 + ret = imap_do_copy_msgs(info->folder->folder, info->folder, &msglist,
72 + ret = imap_do_remove_msgs(info->folder->folder, info->folder,
76 + ret = folder_item_scan_full(info->folder, FALSE);
81 static gboolean imap_matcher_type_is_local(gint matchertype)
83 switch (matchertype) {
84 @@ -3069,6 +3098,17 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
85 g_return_val_if_fail(parent != NULL, NULL);
86 g_return_val_if_fail(name != NULL, NULL);
88 + if (to_number(name) > 0) {
89 + MsgInfo *info = folder_item_get_msginfo(parent, to_number(name));
91 + gboolean ok = imap_renumber_msg(info);
92 + procmsg_msginfo_free(info);
99 debug_print("getting session...\n");
100 session = imap_session_get(folder);
102 diff --git a/src/mh.c b/src/mh.c
103 index e7b9888..b3fbc9c 100644
107 #include "statusbar.h"
108 #include "gtkutils.h"
110 +#include "msgcache.h"
112 /* Define possible missing constants for Windows. */
114 @@ -368,6 +369,11 @@ static gchar *mh_get_new_msg_filename(FolderItem *dest)
115 destpath = folder_item_get_path(dest);
116 cm_return_val_if_fail(destpath != NULL, NULL);
118 + if (dest->last_num < 0) {
119 + mh_get_last_num(dest->folder, dest);
120 + if (dest->last_num < 0) return NULL;
123 if (!is_dir_exist(destpath))
124 make_dir_hier(destpath);
126 @@ -867,6 +873,30 @@ static gchar *mh_item_get_path(Folder *folder, FolderItem *item)
130 +static gboolean mh_renumber_msg(MsgInfo *info)
133 + gboolean result = FALSE;
135 + cm_return_val_if_fail(info != NULL, FALSE);
137 + src = folder_item_fetch_msg(info->folder, info->msgnum);
138 + dest = mh_get_new_msg_filename(info->folder);
139 + num = info->folder->last_num + 1;
141 + if (move_file(src, dest, FALSE) == 0) {
142 + msgcache_remove_msg(info->folder->cache, info->msgnum);
143 + info->msgnum = num;
144 + msgcache_add_msg(info->folder->cache, info);
154 static FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
157 @@ -884,12 +914,24 @@ static FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
158 if (!is_dir_exist(path))
159 if (make_dir_hier(path) != 0)
163 real_name = mh_filename_from_utf8(name);
164 fullpath = g_strconcat(path, G_DIR_SEPARATOR_S, real_name, NULL);
168 + if (to_number(name) > 0) {
169 + MsgInfo *info = folder_item_get_msginfo(parent, to_number(name));
170 + if (info != NULL) {
171 + gboolean ok = mh_renumber_msg(info);
172 + procmsg_msginfo_free(info);
180 if (make_dir(fullpath) < 0) {