Re: fast IMAP trash patch [gmail!]
On Thu, Jul 29, 2010 at 09:51:52PM -0400, Paul Miller wrote:
> Because of this, I pulled a copy of the 1.5.20 Debian package,
> quilted it and wrote the patch attached to this message. ...
Also, I actually attached the patch to this message.
Hehe.
--
If riding in an airplane is flying, then riding in a boat is swimming.
116 jumps, 48.6 minutes of freefall, 92.9 freefall miles.
diff --git a/imap/imap.c b/imap/imap.c
index f08b4ea..47a8035 100644
--- a/imap/imap.c
+++ b/imap/imap.c
@@ -2028,3 +2028,54 @@ int imap_complete(char* dest, size_t dlen, char* path) {
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 (mmbox, sizeof (mmbox), mbox);
+
+ rc = imap_exec_msgset (idata, "UID COPY", mmbox, M_DELETED, 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;
+}
diff --git a/imap/imap.h b/imap/imap.h
index 74d7e13..99cd454 100644
--- 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
diff --git a/mx.c b/mx.c
index 78aafcc..38c4e7f 100644
--- a/mx.c
+++ b/mx.c
@@ -828,6 +828,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++)