From: Kevin McCarthy Date: Wed, 26 Dec 2018 03:24:08 +0000 (-0800) Subject: Create envelope->changed to mark all field changes. X-Git-Tag: mutt-1-12-rel~154 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7f603dd66a28d0c02c09bbd6636fc659e69b480d;p=mutt Create envelope->changed to mark all field changes. In subsequent commits, we're going to add the x-label and subject headers changed flags into the envelope. To avoid the list of checks exploding everywhere, just use a single field to check and reset those values. Several places in the code are checking for a null header->env. I wasn't aware this was possible, so I've added todo notes to track down when this occurs. --- diff --git a/copy.c b/copy.c index 58599731..b120ff0a 100644 --- a/copy.c +++ b/copy.c @@ -354,9 +354,9 @@ mutt_copy_header (FILE *in, HEADER *h, FILE *out, int flags, const char *prefix) char *temp_hdr = NULL; if (h->env) - flags |= (h->env->irt_changed ? CH_UPDATE_IRT : 0) - | (h->env->refs_changed ? CH_UPDATE_REFS : 0); - + flags |= ((h->env->changed & MUTT_ENV_CHANGED_IRT) ? CH_UPDATE_IRT : 0) + | ((h->env->changed & MUTT_ENV_CHANGED_REFS) ? CH_UPDATE_REFS : 0); + if (mutt_copy_hdr (in, out, h->offset, h->content->offset, flags, prefix) == -1) return -1; diff --git a/imap/imap.c b/imap/imap.c index c7ff117a..736e399e 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -1321,7 +1321,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 ((h->env && (h->env->refs_changed || h->env->irt_changed)) || + if ((h->env && h->env->changed) || h->attach_del || h->xlabel_changed) { /* NOTE and TODO: @@ -1356,6 +1356,9 @@ int imap_sync_mailbox (CONTEXT* ctx, int expunge, int* index_hint) dprint (1, (debugfile, "imap_sync_mailbox: Error opening mailbox in append mode\n")); else _mutt_save_message (h, appendctx, 1, 0, 0); + /* TODO: why the check for h->env? Is this possible? */ + if (h->env) + h->env->changed = 0; h->xlabel_changed = 0; #if USE_HCACHE idata->hcache = imap_hcache_open (idata, NULL); diff --git a/mh.c b/mh.c index 1dc10893..8f6255d0 100644 --- a/mh.c +++ b/mh.c @@ -1878,10 +1878,16 @@ static int mh_sync_message (CONTEXT * ctx, int msgno) { HEADER *h = ctx->hdrs[msgno]; + /* TODO: why the h->env check? */ if (h->attach_del || h->xlabel_changed || - (h->env && (h->env->refs_changed || h->env->irt_changed))) + (h->env && h->env->changed)) + { if (mh_rewrite_message (ctx, msgno) != 0) return -1; + /* TODO: why the env check? */ + if (h->env) + h->env->changed = 0; + } return 0; } @@ -1897,12 +1903,16 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) char *p; int rc = 0; + /* TODO: why the h->env check? */ if (h->attach_del || h->xlabel_changed || - (h->env && (h->env->refs_changed || h->env->irt_changed))) + (h->env && h->env->changed)) { /* when doing attachment deletion/rethreading, fall back to the MH case. */ if (mh_rewrite_message (ctx, msgno) != 0) return (-1); + /* TODO: why the env check? */ + if (h->env) + h->env->changed = 0; } else { diff --git a/mutt.h b/mutt.h index 14e0f44e..84b662f6 100644 --- a/mutt.h +++ b/mutt.h @@ -656,6 +656,9 @@ typedef struct alias short num; } ALIAS; +#define MUTT_ENV_CHANGED_IRT (1<<0) /* In-Reply-To changed to link/break threads */ +#define MUTT_ENV_CHANGED_REFS (1<<1) /* References changed to break thread */ + typedef struct envelope { ADDRESS *return_path; @@ -679,8 +682,8 @@ typedef struct envelope LIST *in_reply_to; /* in-reply-to header content */ LIST *userhdrs; /* user defined headers */ - unsigned int irt_changed : 1; /* In-Reply-To changed to link/break threads */ - unsigned int refs_changed : 1; /* References changed to break thread */ + unsigned char changed; /* The MUTT_ENV_CHANGED_* flags specify which + * fields are modified */ } ENVELOPE; typedef struct parameter diff --git a/muttlib.c b/muttlib.c index 2ae92ee7..bafbe93e 100644 --- a/muttlib.c +++ b/muttlib.c @@ -801,11 +801,11 @@ void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra) MOVE_ELEM(supersedes); MOVE_ELEM(date); MOVE_ELEM(x_label); - if (!base->refs_changed) + if (!(base->changed & MUTT_ENV_CHANGED_REFS)) { MOVE_ELEM(references); } - if (!base->irt_changed) + if (!(base->changed & MUTT_ENV_CHANGED_IRT)) { MOVE_ELEM(in_reply_to); } diff --git a/mx.c b/mx.c index ff3a1a33..d7743e78 100644 --- a/mx.c +++ b/mx.c @@ -1088,7 +1088,10 @@ void mx_update_tables(CONTEXT *ctx, int committing) } if (committing) + { ctx->hdrs[j]->changed = 0; + ctx->hdrs[j]->env->changed = 0; + } else if (ctx->hdrs[j]->changed) ctx->changed = 1; diff --git a/thread.c b/thread.c index 308f2b4d..3e41b7dc 100644 --- a/thread.c +++ b/thread.c @@ -1396,7 +1396,8 @@ static void clean_references (THREAD *brk, THREAD *cur) /* clearing the References: header from obsolete Message-ID(s) */ mutt_free_list (&ref->next); - h->env->refs_changed = h->changed = 1; + h->changed = 1; + h->env->changed |= MUTT_ENV_CHANGED_REFS; } } } @@ -1405,7 +1406,8 @@ void mutt_break_thread (HEADER *hdr) { mutt_free_list (&hdr->env->in_reply_to); mutt_free_list (&hdr->env->references); - hdr->env->irt_changed = hdr->env->refs_changed = hdr->changed = 1; + hdr->changed = 1; + hdr->env->changed |= (MUTT_ENV_CHANGED_IRT | MUTT_ENV_CHANGED_REFS); clean_references (hdr->thread, hdr->thread->child); } @@ -1419,10 +1421,11 @@ static int link_threads (HEADER *parent, HEADER *child, CONTEXT *ctx) child->env->in_reply_to = mutt_new_list (); child->env->in_reply_to->data = safe_strdup (parent->env->message_id); - + mutt_set_flag (ctx, child, MUTT_TAG, 0); - - child->env->irt_changed = child->changed = 1; + + child->changed = 1; + child->env->changed |= MUTT_ENV_CHANGED_IRT; return 1; }