X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=imap%2Fimap.c;h=099be6261173c3a290835118fc2a153d2ee4ad0d;hb=3b919698dd232fc7008c4e14f9dc7e74e6c5d298;hp=76d9f8b1a4e35996cdef5ad2f36a3220dfcf9f5b;hpb=debd2491451020d9fd5f0440bb2dada0b9eac6e7;p=apps%2Fmadmutt.git diff --git a/imap/imap.c b/imap/imap.c index 76d9f8b..099be62 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -716,6 +716,12 @@ int imap_open_mailbox_append (CONTEXT * ctx) imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox)); + /* We may be appending to the same folder we've selected. */ + if (!ascii_strcmp(idata->mailbox, mx.mbox)) { + FREE (&mx.mbox); + return 0; + } + imap_munge_mbox_name (mbox, sizeof (mbox), mailbox); if (mutt_bit_isset (idata->capabilities, IMAP4REV1)) @@ -968,13 +974,6 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint) return -1; } - /* CLOSE purges deleted messages. If we don't want to purge them, we must - * tell imap_close_mailbox not to issue the CLOSE command */ - if (expunge) - idata->noclose = 0; - else - idata->noclose = 1; - /* This function is only called when the calling code expects the context * to be changed. */ imap_allow_reopen (ctx); @@ -1051,6 +1050,12 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint) } } + if (ctx->closing) { + if (imap_exec (idata, "CLOSE", 0)) + mutt_error (_("CLOSE failed")); + idata->state = IMAP_AUTHENTICATED; + } + rc = 0; out: if (cmd.data) @@ -1062,7 +1067,7 @@ out: return rc; } -/* imap_close_mailbox: issue close command if neccessary, reset IMAP_DATA */ +/* imap_close_mailbox: clean up IMAP data in CONTEXT */ void imap_close_mailbox (CONTEXT * ctx) { IMAP_DATA *idata; @@ -1073,13 +1078,17 @@ void imap_close_mailbox (CONTEXT * ctx) if (!idata) return; - if ((idata->status != IMAP_FATAL) && - (idata->state == IMAP_SELECTED) && (ctx == idata->ctx)) { - if (!(idata->noclose) && imap_exec (idata, "CLOSE", 0)) + if (ctx == idata->ctx) { + if (idata->state == IMAP_SELECTED) { + /* mx_close_mailbox won't sync if there are no deleted messages + * and the mailbox is unchanged, so we may have to close here */ + if (idata->status != IMAP_FATAL && !ctx->deleted && + imap_exec (idata, "CLOSE", 0)) mutt_error (_("CLOSE failed")); + idata->state = IMAP_AUTHENTICATED; + } idata->reopen &= IMAP_REOPEN_ALLOW; - idata->state = IMAP_AUTHENTICATED; FREE (&(idata->mailbox)); mutt_free_list (&idata->flags); idata->ctx = NULL;