summarylogtreecommitdiffstats
path: root/imap_fast_trash.patch
diff options
context:
space:
mode:
authorOscar Morante2015-06-11 14:34:58 +0300
committerOscar Morante2015-06-11 14:35:29 +0300
commite6384b51f68c57d993111a2a0faf8a2bdd69bb32 (patch)
tree30ecb81ba7e885e11deb6ba536bf6893bacc0c5f /imap_fast_trash.patch
downloadaur-e6384b51f68c57d993111a2a0faf8a2bdd69bb32.tar.gz
initial import
Diffstat (limited to 'imap_fast_trash.patch')
-rw-r--r--imap_fast_trash.patch114
1 files changed, 114 insertions, 0 deletions
diff --git a/imap_fast_trash.patch b/imap_fast_trash.patch
new file mode 100644
index 000000000000..f8f97b3b93a7
--- /dev/null
+++ b/imap_fast_trash.patch
@@ -0,0 +1,114 @@
+From: Antonio Radici <antonio@debian.org>
+Date: Thu, 27 Feb 2014 14:29:03 +0100
+Subject: imap_fast_trash
+
+Make "move to trash folder" use IMAP COPY.
+By Paul Miller
+
+Gbp-Pq: Topic features
+---
+ imap/imap.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ imap/imap.h | 3 +++
+ mx.c | 5 +++++
+ 3 files changed, 65 insertions(+)
+
+diff --git a/imap/imap.c b/imap/imap.c
+index 93dc06a..393d4ec 100644
+--- a/imap/imap.c
++++ b/imap/imap.c
+@@ -886,6 +886,12 @@ static int imap_make_msg_set (IMAP_DATA* idata, BUFFER* buf, int flag,
+ 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 && !hdrs[n]->appended);
++ break;
+ case M_FLAG:
+ if (hdrs[n]->flagged != HEADER_DATA(hdrs[n])->flagged)
+ match = invert ^ hdrs[n]->flagged;
+@@ -2017,3 +2023,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_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;
++}
+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 89b9431..cc60517 100644
+--- 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++)