http://marc.info/?l=mutt-dev&m=128045511126422 Make "move to trash folder" use IMAP COPY. by Paul Miller (jettero) --- a/imap/imap.c +++ b/imap/imap.c @@ -893,6 +893,12 @@ static int imap_make_msg_set (IMAP_DATA* if (hdrs[n]->deleted != HEADER_DATA(hdrs[n])->deleted) match = invert ^ hdrs[n]->deleted; break; + case M_EXPIRED: /* imap_fast_trash version of M_DELETED */ + if (hdrs[n]->purged) + break; + if (hdrs[n]->deleted != HEADER_DATA(hdrs[n])->deleted) + match = invert ^ hdrs[n]->deleted; + break; case M_FLAG: if (hdrs[n]->flagged != HEADER_DATA(hdrs[n])->flagged) match = invert ^ hdrs[n]->flagged; @@ -2028,3 +2034,54 @@ int imap_complete(char* dest, size_t dle return -1; } + +int imap_fast_trash() { + + if( Context->magic == M_IMAP && mx_is_imap(TrashPath) ) { + IMAP_MBOX mx; + IMAP_DATA *idata = (IMAP_DATA *) Context->data; + char mbox[LONG_STRING]; + char mmbox[LONG_STRING]; + int rc; + dprint(1, (debugfile, "[itf] trashcan seems to be on imap.\n")); + + if ( imap_parse_path(TrashPath, &mx) == 0 ) { + if( mutt_account_match(&(idata->conn->account), &(mx.account)) ) { + dprint(1, (debugfile, "[itf] trashcan seems to be on the same account.\n")); + + imap_fix_path (idata, mx.mbox, mbox, sizeof (mbox)); + if (!*mbox) + strfcpy (mbox, "INBOX", sizeof (mbox)); + imap_munge_mbox_name (idata, mmbox, sizeof (mmbox), mbox); + + rc = imap_exec_msgset (idata, "UID COPY", mmbox, M_EXPIRED, 0, 0); + if (!rc) { + dprint (1, (debugfile, "imap_copy_messages: No messages del-tagged\n")); + rc = -1; + goto old_way; + + } else if (rc < 0) { + dprint (1, (debugfile, "could not queue copy\n")); + goto old_way; + + } else { + mutt_message (_("Copying %d messages to %s..."), rc, mbox); + return 0; + } + + } else { + dprint(1, (debugfile, "[itf] trashcan seems to be on a different account.\n")); + } + + old_way: + FREE (&mx.mbox); /* we probably only need to free this when the parse works */ + + } else { + dprint(1, (debugfile, "[itf] failed to parse TrashPath.\n" )); + } + + dprint(1, (debugfile, "[itf] giving up and trying old fasioned way.\n" )); + } + + return 1; +} --- a/imap/imap.h +++ b/imap/imap.h @@ -72,4 +72,7 @@ void imap_keepalive (void); int imap_account_match (const ACCOUNT* a1, const ACCOUNT* a2); +/* trash */ +int imap_fast_trash(); + #endif --- a/mx.c +++ b/mx.c @@ -802,6 +802,11 @@ static int trash_append (CONTEXT *ctx) && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev) return 0; /* we are in the trash folder: simple sync */ + #ifdef USE_IMAP + if( !imap_fast_trash() ) + return 0; + #endif + if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL) { for (i = 0 ; i < ctx->msgcount ; i++)