X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=imap%2Fimap.c;h=099be6261173c3a290835118fc2a153d2ee4ad0d;hb=3b919698dd232fc7008c4e14f9dc7e74e6c5d298;hp=110486e430f15d0bcb4d222f9d50b4bd7a6aeb94;hpb=3f3ce3e32da45b2626dfa40a994cb37ca4021e5b;p=apps%2Fmadmutt.git diff --git a/imap/imap.c b/imap/imap.c index 110486e..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); @@ -1017,7 +1016,7 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint) /* if the message has been rethreaded or attachments have been deleted * we delete the message and reupload it. * This works better if we're expunging, of course. */ - if (ctx->hdrs[n]->refs_changed || ctx->hdrs[n]->irt_changed || + if ((ctx->hdrs[n]->env && (ctx->hdrs[n]->env->refs_changed || ctx->hdrs[n]->env->irt_changed)) || ctx->hdrs[n]->attach_del) { debug_print (3, ("Attachments to be deleted, falling back to _mutt_save_message\n")); if (!appendctx) @@ -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;