]> granicus.if.org Git - mutt/commitdiff
Create envelope->changed to mark all field changes.
authorKevin McCarthy <kevin@8t8.us>
Wed, 26 Dec 2018 03:24:08 +0000 (19:24 -0800)
committerKevin McCarthy <kevin@8t8.us>
Sat, 29 Dec 2018 22:11:57 +0000 (14:11 -0800)
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.

copy.c
imap/imap.c
mh.c
mutt.h
muttlib.c
mx.c
thread.c

diff --git a/copy.c b/copy.c
index 585997312907b6192ce49cc750e8101208b5e708..b120ff0add039953275343086c412cdd8c508182 100644 (file)
--- 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;
 
index c7ff117a12664dc005a7f3f3376adda82027615e..736e399e5c5512c8770813b7bb7409af8474f0c5 100644 (file)
@@ -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 1dc10893def0b4761b717eb0a06f0fe545b1398a..8f6255d0e19a2a5cf7e048aadc36262ffbf14bb0 100644 (file)
--- 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 14e0f44e775961371c890594d5712b62b8a691d7..84b662f60640ca22234366c1545b1fff90516184 100644 (file)
--- 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
index 2ae92ee75a135a9fa818b39ba83c4f7e9e9f7132..bafbe93e9a2143b0b0e543be68e98cc302631575 100644 (file)
--- 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 ff3a1a335f0036fbe1802e4efff35e3805d8cd94..d7743e789c3117c150f32e6dc4bba9a6e04d8f64 100644 (file)
--- 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;
       
index 308f2b4d957d80ff527454b2808a7a1630452880..3e41b7dc979758a75cbb331a95dfdbd957642dbd 100644 (file)
--- 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;
 }