<<< Date Index >>>     <<< Thread Index >>>

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++)