On Thu, Aug 02, 2001 at 08:39:57AM +0200, Bonhote Andre <[EMAIL PROTECTED]> wrote: > I am subscribed to some so-called sysadmin lists. Unfortunately, the > list users don't seem to know much about E-Mail: They just hit Outlurks > "Reply"-button, erase the subject and start another thread. The result > is a completely messed-up mailfolder, following threads is just a pain > in the a. They completely ignore threads, perhaps because they're > program doesn't use the Message-ID and References fields but the > subject for threading. > > Can I do something like this in mutt? I don't mind if I need an external > program to pipe my boxfile through, if it helps. Attached is a patch that I use. If the subject line changes (besides "RE:", etc.), mutt will not put the message in the same thread, irregardles of the "In-reply-to" or "References" fields. Works quite well for me. Note that you'll also have to turn on the subj_breaks_thread option. -- Bob Bell <[EMAIL PROTECTED]> ------------------------------------------------------------------------- "UNIX *is* user friendly. It's just selective about who its friends are." -- Author unknown
diff -ru -x CVS mutt-cvs/commands.c mutt/commands.c --- mutt-cvs/commands.c Tue Jun 5 03:55:55 2001 +++ mutt/commands.c Wed Jun 20 12:09:14 2001 @@ -529,6 +529,7 @@ char buffer[LONG_STRING], errbuf[SHORT_STRING]; int r; int old_strictthreads = option (OPTSTRICTTHREADS); + int old_subjnothread = option (OPTSUBJNOTHREAD); int old_sortre = option (OPTSORTRE); buffer[0] = 0; @@ -550,6 +551,7 @@ mutt_error ("%s", errbuf); } if (option (OPTSTRICTTHREADS) != old_strictthreads || + option (OPTSUBJNOTHREAD) != old_subjnothread || option (OPTSORTRE) != old_sortre) set_option (OPTNEEDRESORT); } diff -ru -x CVS mutt-cvs/init.h mutt/init.h --- mutt-cvs/init.h Mon Jun 18 11:56:46 2001 +++ mutt/init.h Wed Jun 20 12:09:14 2001 @@ -2109,6 +2109,16 @@ ** personal mailbox where you might have several unrelated messages with ** the subject ``hi'' which will get grouped together. */ + { "subj_breaks_thread", DT_BOOL, R_RESORT|R_INDEX, OPTSUBJNOTHREAD, 0 }, + /* + ** .pp + ** If set, a message that would normally be a member of a thread will + ** not be a member of that thread if the subject has changed. This is + ** useful when a message reply updates the ``References'' and/or + ** ``In-Reply-To'' fields, but the sender changes the subject line + ** with the intent to indicate that the subject of discussion has + ** changed. + */ { "suspend", DT_BOOL, R_NONE, OPTSUSPEND, 1 }, /* ** .pp diff -ru -x CVS mutt-cvs/mutt.h mutt/mutt.h --- mutt-cvs/mutt.h Mon Jun 18 11:56:46 2001 +++ mutt/mutt.h Wed Jun 20 12:09:14 2001 @@ -380,6 +380,7 @@ OPTSORTRE, OPTSTATUSONTOP, OPTSTRICTTHREADS, + OPTSUBJNOTHREAD, OPTSUSPEND, OPTTEXTFLOWED, OPTTHOROUGHSRC, @@ -614,6 +615,7 @@ unsigned int display_subject : 1; /* used for threading */ unsigned int fake_thread : 1; /* no ref matched, but subject did */ unsigned int threaded : 1; /* message has been threaded */ + unsigned int subj_broke_thread : 1; /* not with thread due to subject change */ unsigned int recip_valid : 1; /* is_recipient is valid */ unsigned int active : 1; /* message is not to be removed */ diff -ru -x CVS mutt-cvs/thread.c mutt/thread.c --- mutt-cvs/thread.c Wed Apr 25 18:08:41 2001 +++ mutt/thread.c Wed Jun 20 12:09:14 2001 @@ -529,6 +529,7 @@ ctx->hdrs[i]->child = NULL; ctx->hdrs[i]->threaded = 0; ctx->hdrs[i]->fake_thread = 0; + ctx->hdrs[i]->subj_broke_thread = 0; } ctx->tree = NULL; } @@ -582,15 +583,37 @@ CUR->parent = NULL; insert_message (&ctx->tree, CUR, usefunc); } - else if (!CUR->threaded) + /* Check if (1) message is not yet threaded, or (2) a change in + * subject broke the thread but that option has been turned off, + * or (3) if the message is a candidate to break from the thread + * and the option is currently set + */ + else if (!CUR->threaded || + (CUR->subj_broke_thread && !option (OPTSUBJNOTHREAD)) || + (!CUR->subj_broke_thread && option (OPTSUBJNOTHREAD) && + CUR->subject_changed && CUR->parent != NULL)) { + if (CUR->threaded) + { + unlink_message (&CUR->parent->child, CUR); + CUR->parent = NULL; + } if ((tmp = find_reference (CUR, ctx)) != NULL) { - CUR->parent = tmp; if (CUR->env->real_subj && tmp->env->real_subj) CUR->subject_changed = mutt_strcmp (tmp->env->real_subj, CUR->env->real_subj) ? 1 : 0; else CUR->subject_changed = (CUR->env->real_subj || tmp->env->real_subj) ? 1 : 0; + if (CUR->subject_changed && option (OPTSUBJNOTHREAD)) + { + CUR->subj_broke_thread = 1; + tmp = NULL; + } + else + { + CUR->subj_broke_thread = 0; + CUR->parent = tmp; + } } else CUR->subject_changed = 1;