Rocco Rutte:
authorpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Mon, 25 Jul 2005 19:30:48 +0000 (19:30 +0000)
committerpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Mon, 25 Jul 2005 19:30:48 +0000 (19:30 +0000)
- merge in latest mutt changes (NOTE: this requires a complete rebuild of header caches!)

git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@344 e385b8ad-14ed-0310-8656-cc95a2468c6d

ChangeLog.mutt
copy.c
hcache.c
imap/imap.c
mh.c
mutt.h
muttlib.c
thread.c

index 1c3eecf..b74b40a 100644 (file)
@@ -1,17 +1,18 @@
-2005-07-25 04:37:20  Brendan Cully  <brendan@kublai.com>  (brendan)
+2005-07-25 15:48:36  Thomas Roessler  <roessler@does-not-exist.org>  (roessler)
 
-       * imap/message.c: Minor cosmetic cleanup (fewer #ifdef HCACHE blocks)
+       * copy.c, imap/imap.c, mh.c, mutt.h, muttlib.c, thread.c: Get rid
+       of IMAP-related special casing all over the thread editing code.
 
-2005-07-25 04:31:51  Brendan Cully <brendan@kublai.com>  (brendan)
+2005-07-25 04:56:38  Brendan Cully  <brendan@kublai.com>  (brendan)
 
-       * muttlib.c: Suppress a printf format warning
+       * imap/message.c: Indentation, mostly
+
+       * imap/message.c: Minor cosmetic cleanup (fewer #ifdef HCACHE blocks)
 
-2005-07-24 18:33:31  Brendan Cully  <brendan@kublai.com>  (brendan)
+       * muttlib.c: Suppress a printf format warning
 
        * muttlib.c: Typo in last commit.
 
-2005-07-24 18:28:36  Brendan Cully  <brendan@kublai.com>  (brendan)
-
        * imap/message.c, muttlib.c, protos.h: Merge full envelope from
        message fetch into original sparse envelope, instead of replacing
        it. This should be gentler on the various threading hashes and may
 2005-01-29 19:15:07  Thomas Glanzmann  <sithglan@stud.uni-erlangen.de>  (roessler)
                                  
      * hcache.c: - make hcache.c conform to mutt codingstyle
-     - use $Id: ChangeLog,v 3.444 2005/07/25 04:38:56 brendan Exp $ CVS keyword instead of %K% BitKeeper keyword
+     - use Id CVS keyword instead of %K% BitKeeper keyword
                                  
 2005-01-29 19:15:07  Thomas Glanzmann  <sithglan@stud.uni-erlangen.de>  (roessler)
 
diff --git a/copy.c b/copy.c
index b168014..d9a6fb9 100644 (file)
--- a/copy.c
+++ b/copy.c
@@ -324,8 +324,9 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
 {
   char buffer[SHORT_STRING];
 
-  flags |= (h->irt_changed ? CH_UPDATE_IRT : 0)
-    | (h->refs_changed ? CH_UPDATE_REFS : 0);
+  if (h->env)
+    flags |= (h->env->irt_changed ? CH_UPDATE_IRT : 0) |
+      (h->env->refs_changed ? CH_UPDATE_REFS : 0);
 
   if (mutt_copy_hdr (in, out, h->offset, h->content->offset, flags, prefix) ==
       -1)
@@ -350,8 +351,8 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
 
   if (flags & CH_UPDATE) {
     if ((flags & CH_NOSTATUS) == 0) {
-      if (h->irt_changed && h->new_env->in_reply_to) {
-        LIST *listp = h->new_env->in_reply_to;
+      if (h->env->irt_changed && h->env->in_reply_to) {
+        LIST *listp = h->env->in_reply_to;
 
         if (fputs ("In-Reply-To: ", out) == EOF)
           return (-1);
@@ -364,8 +365,8 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
           return (-1);
       }
 
-      if (h->refs_changed && h->new_env->references) {
-        LIST *listp = h->new_env->references, *refs = NULL, *t;
+      if (h->env->refs_changed && h->env->references) {
+        LIST *listp = h->env->references, *refs = NULL, *t;
 
         if (fputs ("References: ", out) == EOF)
           return (-1);
index f6e0d8d..f64a601 100644 (file)
--- a/hcache.c
+++ b/hcache.c
@@ -387,12 +387,15 @@ static unsigned char *dump_envelope (ENVELOPE * e, unsigned char *d, int *off)
   d = dump_list (e->in_reply_to, d, off);
   d = dump_list (e->userhdrs, d, off);
 
+  d = dump_int (e->irt_changed, d, off);
+  d = dump_int (e->refs_changed, d, off);
+
   return d;
 }
 
 static void restore_envelope (ENVELOPE * e, const unsigned char *d, int *off)
 {
-  int real_subj_off;
+  int tmp = 0;
 
   restore_address (&e->return_path, d, off);
   restore_address (&e->from, d, off);
@@ -404,9 +407,9 @@ static void restore_envelope (ENVELOPE * e, const unsigned char *d, int *off)
   restore_address (&e->mail_followup_to, d, off);
 
   restore_char (&e->subject, d, off);
-  restore_int ((unsigned int *) (&real_subj_off), d, off);
-  if (0 <= real_subj_off) {
-    e->real_subj = e->subject + real_subj_off;
+  restore_int ((unsigned int *) (&tmp), d, off);
+  if (0 <= tmp) {
+    e->real_subj = e->subject + tmp;
   }
   else {
     e->real_subj = NULL;
@@ -426,6 +429,11 @@ static void restore_envelope (ENVELOPE * e, const unsigned char *d, int *off)
   restore_list (&e->references, d, off);
   restore_list (&e->in_reply_to, d, off);
   restore_list (&e->userhdrs, d, off);
+
+  restore_int ((unsigned int *) &tmp, d, off);
+  e->irt_changed = tmp;
+  restore_int ((unsigned int *) &tmp, d, off);
+  e->refs_changed = tmp;
 }
 
 static
index 110486e..76d9f8b 100644 (file)
@@ -1017,7 +1017,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)
diff --git a/mh.c b/mh.c
index 2770b8e..66216dc 100644 (file)
--- a/mh.c
+++ b/mh.c
@@ -1312,7 +1312,8 @@ static int mh_sync_message (CONTEXT * ctx, int msgno)
 {
   HEADER *h = ctx->hdrs[msgno];
 
-  if (h->attach_del || h->refs_changed || h->irt_changed)
+  if (h->attach_del || 
+      (h->env && (h->env->refs_changed || h->env->irt_changed)))
     if (mh_rewrite_message (ctx, msgno) != 0)
       return -1;
 
@@ -1323,7 +1324,8 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno)
 {
   HEADER *h = ctx->hdrs[msgno];
 
-  if (h->attach_del || h->refs_changed || h->irt_changed) {
+  if (h->attach_del || 
+      (h->env && (h->env->refs_changed || h->env->irt_changed))) {
     /* when doing attachment deletion/rethreading, fall back to the MH case. */
     if (mh_rewrite_message (ctx, msgno) != 0)
       return (-1);
diff --git a/mutt.h b/mutt.h
index c74e8fd..f2c5dfa 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -628,6 +628,8 @@ typedef struct envelope {
   LIST *references;             /* message references (in reverse order) */
   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 */
 } ENVELOPE;
 
 typedef struct parameter {
@@ -743,8 +745,6 @@ typedef struct header {
   unsigned int subject_changed:1;       /* used for threading */
   unsigned int threaded:1;      /* used for threading */
   unsigned int display_subject:1;       /* used for threading */
-  unsigned int irt_changed:1;   /* In-Reply-To changed to link/break threads */
-  unsigned int refs_changed:1;  /* References changed to break thread */
   unsigned int recip_valid:1;   /* is_recipient is valid */
   unsigned int active:1;        /* message is not to be removed */
   unsigned int trash:1;         /* message is marked as trashed on disk.
@@ -788,8 +788,6 @@ typedef struct header {
   char *tree;                   /* character string to print thread tree */
   struct thread *thread;
 
-  ENVELOPE *new_env;            /* envelope information for rethreading */
-
 #ifdef MIXMASTER
   LIST *chain;
 #endif
index 9a781dd..7c01770 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -657,8 +657,12 @@ void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra)
   MOVE_ELEM(supersedes);
   MOVE_ELEM(date);
   MOVE_ELEM(x_label);
-  MOVE_ELEM(references);
-  MOVE_ELEM(in_reply_to);
+  if (!base->refs_changed) {
+    MOVE_ELEM(references);
+  }
+  if (!base->irt_changed) {
+    MOVE_ELEM(in_reply_to);
+  }
   /* real_subj is subordinate to subject */
   if (!base->subject) {
     base->subject = (*extra)->subject;
index 0b20076..d07f328 100644 (file)
--- a/thread.c
+++ b/thread.c
@@ -1261,14 +1261,7 @@ static void clean_references (THREAD * brk, THREAD * cur)
       /* clearing the References: header from obsolete Message-Id(s) */
       mutt_free_list (&ref->next);
 
-      if (h->new_env)
-        mutt_free_list (&h->new_env->references);
-      else
-        h->new_env = mutt_new_envelope ();
-
-      h->new_env->references = mutt_copy_list (h->env->references);
-
-      h->refs_changed = h->changed = 1;
+      h->env->refs_changed = h->changed = 1;
     }
   }
 }
@@ -1277,15 +1270,7 @@ void mutt_break_thread (HEADER * hdr)
 {
   mutt_free_list (&hdr->env->in_reply_to);
   mutt_free_list (&hdr->env->references);
-  hdr->irt_changed = hdr->refs_changed = hdr->changed = 1;
-
-  if (hdr->new_env) {
-    mutt_free_list (&hdr->new_env->in_reply_to);
-    mutt_free_list (&hdr->new_env->references);
-  }
-  else
-    hdr->new_env = mutt_new_envelope ();
-
+  hdr->env->irt_changed = hdr->env->refs_changed = 1;
   clean_references (hdr->thread, hdr->thread->child);
 }
 
@@ -1299,12 +1284,9 @@ 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);
 
-  child->new_env->in_reply_to = mutt_new_list ();
-  child->new_env->in_reply_to->data = safe_strdup (parent->env->message_id);
-
   mutt_set_flag (ctx, child, M_TAG, 0);
 
-  child->irt_changed = child->changed = 1;
+  child->env->irt_changed = child->changed = 1;
   return 1;
 }