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))
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);
/* 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)
idata->reopen |= IMAP_EXPUNGE_EXPECTED;
if (imap_exec (idata, "EXPUNGE", 0) != 0) {
imap_error (_("imap_sync_mailbox: EXPUNGE failed"), idata->cmd.buf);
- rc = -1;
+ rc = imap_reconnect (ctx);
goto out;
}
}
+ if (ctx->closing) {
+ if (imap_exec (idata, "CLOSE", 0))
+ mutt_error (_("CLOSE failed"));
+ idata->state = IMAP_AUTHENTICATED;
+ }
+
rc = 0;
out:
if (cmd.data)
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;
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;