From debd2491451020d9fd5f0440bb2dada0b9eac6e7 Mon Sep 17 00:00:00 2001 From: pdmef Date: Mon, 25 Jul 2005 19:30:48 +0000 Subject: [PATCH] Rocco Rutte: - 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 | 17 +++++++++-------- copy.c | 13 +++++++------ hcache.c | 16 ++++++++++++---- imap/imap.c | 2 +- mh.c | 6 ++++-- mutt.h | 6 ++---- muttlib.c | 8 ++++++-- thread.c | 24 +++--------------------- 8 files changed, 44 insertions(+), 48 deletions(-) diff --git a/ChangeLog.mutt b/ChangeLog.mutt index 1c3eecf..b74b40a 100644 --- a/ChangeLog.mutt +++ b/ChangeLog.mutt @@ -1,17 +1,18 @@ -2005-07-25 04:37:20 Brendan Cully (brendan) +2005-07-25 15:48:36 Thomas Roessler (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) +2005-07-25 04:56:38 Brendan Cully (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) + * muttlib.c: Suppress a printf format warning * muttlib.c: Typo in last commit. -2005-07-24 18:28:36 Brendan Cully (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 @@ -525,7 +526,7 @@ 2005-01-29 19:15:07 Thomas Glanzmann (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 (roessler) diff --git a/copy.c b/copy.c index b168014..d9a6fb9 100644 --- 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); diff --git a/hcache.c b/hcache.c index f6e0d8d..f64a601 100644 --- 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 diff --git a/imap/imap.c b/imap/imap.c index 110486e..76d9f8b 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -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 --- 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 --- 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 diff --git a/muttlib.c b/muttlib.c index 9a781dd..7c01770 100644 --- 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; diff --git a/thread.c b/thread.c index 0b20076..d07f328 100644 --- 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; } -- 2.20.1