]> git.llucax.com Git - software/mutt-debian.git/blob - debian/patches/features/imap_fast_trash
Merge commit 'upstream/1.5.21'
[software/mutt-debian.git] / debian / patches / features / imap_fast_trash
1 http://marc.info/?l=mutt-dev&m=128045511126422
2
3 Make "move to trash folder" use IMAP COPY.
4
5 by Paul Miller (jettero)
6
7 diff --git a/imap/imap.c b/imap/imap.c
8 index f08b4ea..47a8035 100644
9 --- a/imap/imap.c
10 +++ b/imap/imap.c
11 @@ -2028,3 +2028,54 @@ int imap_complete(char* dest, size_t dlen, char* path) {
12  
13    return -1;
14  }
15 +
16 +int imap_fast_trash() {
17 +
18 +    if( Context->magic == M_IMAP && mx_is_imap(TrashPath) ) {
19 +        IMAP_MBOX mx;
20 +        IMAP_DATA *idata = (IMAP_DATA *) Context->data;
21 +        char mbox[LONG_STRING];
22 +        char mmbox[LONG_STRING];
23 +        int rc;
24 +        dprint(1, (debugfile, "[itf] trashcan seems to be on imap.\n"));
25 +
26 +        if ( imap_parse_path(TrashPath, &mx) == 0 ) {
27 +            if( mutt_account_match(&(idata->conn->account), &(mx.account)) ) {
28 +                dprint(1, (debugfile, "[itf] trashcan seems to be on the same account.\n"));
29 +
30 +                imap_fix_path (idata, mx.mbox, mbox, sizeof (mbox));
31 +                if (!*mbox)
32 +                    strfcpy (mbox, "INBOX", sizeof (mbox));
33 +                imap_munge_mbox_name (mmbox, sizeof (mmbox), mbox);
34 +
35 +                rc = imap_exec_msgset (idata, "UID COPY", mmbox, M_DELETED, 0, 0);
36 +                if (!rc) {
37 +                    dprint (1, (debugfile, "imap_copy_messages: No messages del-tagged\n"));
38 +                    rc = -1;
39 +                    goto old_way;
40 +
41 +                } else if (rc < 0) {
42 +                    dprint (1, (debugfile, "could not queue copy\n"));
43 +                    goto old_way;
44 +
45 +                } else {
46 +                    mutt_message (_("Copying %d messages to %s..."), rc, mbox);
47 +                    return 0;
48 +                }
49 +
50 +            } else {
51 +                dprint(1, (debugfile, "[itf] trashcan seems to be on a different account.\n"));
52 +            }
53 +
54 +            old_way:
55 +            FREE (&mx.mbox); /* we probably only need to free this when the parse works */
56 +
57 +        } else {
58 +            dprint(1, (debugfile, "[itf] failed to parse TrashPath.\n" ));
59 +        }
60 +
61 +        dprint(1, (debugfile, "[itf] giving up and trying old fasioned way.\n" ));
62 +    }
63 +
64 +    return 1;
65 +}
66 diff --git a/imap/imap.h b/imap/imap.h
67 index 74d7e13..99cd454 100644
68 --- a/imap/imap.h
69 +++ b/imap/imap.h
70 @@ -72,4 +72,7 @@ void imap_keepalive (void);
71  
72  int imap_account_match (const ACCOUNT* a1, const ACCOUNT* a2);
73  
74 +/* trash */
75 +int imap_fast_trash();
76 +
77  #endif
78 diff --git a/mx.c b/mx.c
79 index 78aafcc..38c4e7f 100644
80 --- a/mx.c
81 +++ b/mx.c
82 @@ -828,6 +828,11 @@ static int trash_append (CONTEXT *ctx)
83         && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev)
84        return 0;  /* we are in the trash folder: simple sync */
85  
86 +    #ifdef USE_IMAP
87 +    if( !imap_fast_trash() )
88 +        return 0;
89 +    #endif
90 +
91      if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL)
92      {
93        for (i = 0 ; i < ctx->msgcount ; i++)