diff options
author | krion <krion@FreeBSD.org> | 2004-02-10 18:27:50 +0000 |
---|---|---|
committer | krion <krion@FreeBSD.org> | 2004-02-10 18:27:50 +0000 |
commit | f81b381c08b62197fb6b09d4beda431a447c5675 (patch) | |
tree | 493e287076da21d76431b5b82883c2b23131deae /mail/mutt-devel | |
parent | 1fa2386776e42f94bc28892bf361e8fbd531f28d (diff) | |
download | FreeBSD-ports-f81b381c08b62197fb6b09d4beda431a447c5675.zip FreeBSD-ports-f81b381c08b62197fb6b09d4beda431a447c5675.tar.gz |
- Fix WITH_MUTT_EDIT_THREADS knob
- Add SIZEs to distinfo
PR: ports/62651
Submitted by: maintainer
Diffstat (limited to 'mail/mutt-devel')
-rw-r--r-- | mail/mutt-devel/Makefile | 9 | ||||
-rw-r--r-- | mail/mutt-devel/distinfo | 10 | ||||
-rw-r--r-- | mail/mutt-devel/files/extra-patch-edit-threads | 651 |
3 files changed, 665 insertions, 5 deletions
diff --git a/mail/mutt-devel/Makefile b/mail/mutt-devel/Makefile index 8116ea8..92bbf1a 100644 --- a/mail/mutt-devel/Makefile +++ b/mail/mutt-devel/Makefile @@ -125,9 +125,6 @@ SCRIPTS_ENV= WRKDIR="${WRKDIR}" .include <bsd.port.pre.mk> -.if defined(WITH_MUTT_EDIT_THREADS) -BROKEN= "mutt-devel's edit threads patch appears to be broken" -.endif CD_PATCH_VERSION= 1.5.5.1 CD_IFDEF_PATCH_VERSION= 1.5.4 .if !defined(VVV_PATCH_VERSION) @@ -213,6 +210,11 @@ pre-configure:: @${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-pgp-dw .endif +.if defined(WITH_MUTT_EDIT_THREADS) +pre-configure:: + @${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-edit-threads +.endif + .if defined(WITH_MUTT_LOCALES_FIX) CONFIGURE_ARGS+= --enable-locales-fix .endif @@ -247,7 +249,6 @@ PATCHFILES+= patch-${VVV_PATCH_VERSION}.vvv.initials.gz:vvv \ SGML_NEEDED= yes .endif .if defined(WITH_MUTT_EDIT_THREADS) -PATCHFILES+= patch-${CD_PATCH_VERSION}.cd.edit_threads.9.5:cd CONFIGURE_ARGS+= --enable-imap-edit-threads SGML_NEEDED= yes .endif diff --git a/mail/mutt-devel/distinfo b/mail/mutt-devel/distinfo index bf9ab61..1389b92 100644 --- a/mail/mutt-devel/distinfo +++ b/mail/mutt-devel/distinfo @@ -1,10 +1,18 @@ MD5 (mutt/mutt-1.5.6i.tar.gz) = aa1433635d7c86beba1675a3408b0324 +SIZE (mutt/mutt-1.5.6i.tar.gz) = 2910730 MD5 (mutt/patch-1.5.6.vvv.slang.gz) = 11dccb4b178d63d0dbf51afcea3b30c8 +SIZE (mutt/patch-1.5.6.vvv.slang.gz) = 347 MD5 (mutt/patch-1.5.6.rr.compressed.gz) = 0d57a62f17c93eb1d2eff60e070933b3 +SIZE (mutt/patch-1.5.6.rr.compressed.gz) = 10077 MD5 (mutt/patch-1.5.6.vvv.nntp.gz) = b32ef18006ce8a211ad2d1dabc62bfcb +SIZE (mutt/patch-1.5.6.vvv.nntp.gz) = 106691 MD5 (mutt/patch-1.5.6.vvv.initials.gz) = eecaa646227609b52e5267178b3bc462 +SIZE (mutt/patch-1.5.6.vvv.initials.gz) = 667 MD5 (mutt/patch-1.5.6.vvv.quote.gz) = f262968775cf5c37ba49b29248fcf170 -MD5 (mutt/patch-1.5.5.1.cd.edit_threads.9.5) = a8a3a973d8693f8af526cecf7edbd71f +SIZE (mutt/patch-1.5.6.vvv.quote.gz) = 1558 MD5 (mutt/patch-1.5.5.1.cd.signatures_menu.2.1) = 22caeffb4a612f5fa6e1f585b40c51a6 +SIZE (mutt/patch-1.5.5.1.cd.signatures_menu.2.1) = 22637 MD5 (mutt/patch-1.5.4.cd.ifdef.1) = a545036cdb55519154d0b35465f52daa +SIZE (mutt/patch-1.5.4.cd.ifdef.1) = 3545 MD5 (mutt/p0-patch-1.5.6.dw.mbox-hook.1) = 9e29a6778ab07a4de3442691e4573fea +SIZE (mutt/p0-patch-1.5.6.dw.mbox-hook.1) = 6405 diff --git a/mail/mutt-devel/files/extra-patch-edit-threads b/mail/mutt-devel/files/extra-patch-edit-threads new file mode 100644 index 0000000..8e1f85a --- /dev/null +++ b/mail/mutt-devel/files/extra-patch-edit-threads @@ -0,0 +1,651 @@ +diff -ru work.old/mutt-1.5.6/OPS work/mutt-1.5.6/OPS +--- OPS Wed Nov 5 10:41:31 2003 ++++ OPS Tue Feb 10 14:40:41 2004 +@@ -96,6 +96,7 @@ + OP_LIST_REPLY "reply to specified mailing list" + OP_MACRO "execute a macro" + OP_MAIL "compose a new mail message" ++OP_MAIN_BREAK_THREAD "break the thread in two" + OP_MAIN_CHANGE_FOLDER "open a different folder" + OP_MAIN_CHANGE_FOLDER_READONLY "open a different folder in read only mode" + OP_MAIN_CLEAR_FLAG "clear a status flag from a message" +@@ -105,6 +106,7 @@ + OP_MAIN_FIRST_MESSAGE "move to the first message" + OP_MAIN_LAST_MESSAGE "move to the last message" + OP_MAIN_LIMIT "show only messages matching a pattern" ++OP_MAIN_LINK_THREADS "link tagged message to the current one" + OP_MAIN_NEXT_NEW "jump to the next new message" + OP_MAIN_NEXT_NEW_THEN_UNREAD "jump to the next new or unread message" + OP_MAIN_NEXT_SUBTHREAD "jump to the next subthread" +diff -ru work.old/mutt-1.5.6/acconfig.h work/mutt-1.5.6/acconfig.h +--- acconfig.h Tue Jan 21 11:50:49 2003 ++++ acconfig.h Tue Feb 10 14:40:41 2004 +@@ -36,3 +36,7 @@ + * all return values other than (size_t)(-1) as equivalent. */ + #undef ICONV_NONTRANS + ++/* Do you want to use the rethreading functions with IMAP ++ * (--enable-imap-edit-threads) */ ++#undef IMAP_EDIT_THREADS ++ +diff -ru work.old/mutt-1.5.6/config.h.in work/mutt-1.5.6/config.h.in +--- config.h.in Sun Feb 1 18:18:21 2004 ++++ config.h.in Tue Feb 10 14:40:41 2004 +@@ -549,3 +549,7 @@ + * all return values other than (size_t)(-1) as equivalent. */ + #undef ICONV_NONTRANS + ++/* Do you want to use the rethreading functions with IMAP ++ * (--enable-imap-edit-threads) */ ++#undef IMAP_EDIT_THREADS ++ +diff -ru work.old/mutt-1.5.6/configure work/mutt-1.5.6/configure +--- configure Sun Feb 1 19:22:06 2004 ++++ configure Tue Feb 10 14:40:41 2004 +@@ -40,6 +40,8 @@ + ac_help="$ac_help + --with-gss[=PFX] Compile in GSSAPI authentication for IMAP" + ac_help="$ac_help ++ --enable-imap-edit-threads Enable editing threads support for IMAP" ++ac_help="$ac_help + --with-ssl[=PFX] Compile in SSL support for POP/IMAP" + ac_help="$ac_help + --with-nss[=PFX] Compile in SSL support for POP/IMAP via NSS" +@@ -5383,6 +5385,23 @@ + else + USE_GSS_TRUE='#' + USE_GSS_FALSE= ++fi ++ ++ ++# Check whether --enable-imap-edit-threads or --disable-imap-edit-threads was given. ++if test "${enable_imap_edit_threads+set}" = set; then ++ enableval="$enable_imap_edit_threads" ++ ++ if test "$enableval" = "yes"; then ++ if test "$need_imap" = "yes"; then ++ cat >> confdefs.h <<\EOF ++#define IMAP_EDIT_THREADS 1 ++EOF ++ ++ else ++ echo "configure: warning: IMAP support for edit_threads is only useful with IMAP support" 1>&2 ++ fi ++fi + fi + + +diff -ru work.old/mutt-1.5.6/configure.in work/mutt-1.5.6/configure.in +--- configure.in Sun Feb 1 19:22:05 2004 ++++ configure.in Tue Feb 10 14:40:41 2004 +@@ -559,6 +559,16 @@ + + dnl -- end imap dependencies -- + ++AC_ARG_ENABLE(imap-edit-threads, [ --enable-imap-edit-threads Enable editing threads support for IMAP], ++[ ++ if test "$enableval" = "yes"; then ++ if test "$need_imap" = "yes"; then ++ AC_DEFINE(IMAP_EDIT_THREADS) ++ else ++ AC_MSG_WARN([IMAP support for edit_threads is only useful with IMAP support]) ++ fi ++fi]) ++ + AC_ARG_WITH(ssl, [ --with-ssl[=PFX] Compile in SSL support for POP/IMAP], + [ if test "$with_ssl" != "no" + then +diff -ru work.old/mutt-1.5.6/copy.c work/mutt-1.5.6/copy.c +--- copy.c Wed Nov 5 10:41:31 2003 ++++ copy.c Tue Feb 10 14:40:41 2004 +@@ -95,6 +95,12 @@ + (ascii_strncasecmp ("Content-Length:", buf, 15) == 0 || + ascii_strncasecmp ("Lines:", buf, 6) == 0)) + continue; ++ if ((flags & CH_UPDATE_REFS) && ++ ascii_strncasecmp ("References:", buf, 11) == 0) ++ continue; ++ if ((flags & CH_UPDATE_IRT) && ++ ascii_strncasecmp ("In-Reply-To:", buf, 12) == 0) ++ continue; + ignore = 0; + } + +@@ -193,6 +199,12 @@ + ascii_strncasecmp ("type:", buf + 8, 5) == 0)) || + ascii_strncasecmp ("mime-version:", buf, 13) == 0)) + continue; ++ if ((flags & CH_UPDATE_REFS) && ++ ascii_strncasecmp ("References:", buf, 11) == 0) ++ continue; ++ if ((flags & CH_UPDATE_IRT) && ++ ascii_strncasecmp ("In-Reply-To:", buf, 12) == 0) ++ continue; + + /* Find x -- the array entry where this header is to be saved */ + if (flags & CH_REORDER) +@@ -326,6 +338,8 @@ + CH_XMIT ignore Lines: and Content-Length: + CH_WEED do header weeding + CH_NOQFROM ignore ">From " line ++ CH_UPDATE_IRT update the In-Reply-To: header ++ CH_UPDATE_REFS update the References: header + + prefix + string to use if CH_PREFIX is set +@@ -335,6 +349,9 @@ + mutt_copy_header (FILE *in, HEADER *h, FILE *out, int flags, const char *prefix) + { + char buffer[SHORT_STRING]; ++ ++ flags |= (h->irt_changed ? CH_UPDATE_IRT : 0) ++ | (h->refs_changed ? CH_UPDATE_REFS : 0); + + if (mutt_copy_hdr (in, out, h->offset, h->content->offset, flags, prefix) == -1) + return (-1); +@@ -358,7 +375,56 @@ + if (flags & CH_UPDATE) + { + if ((flags & CH_NOSTATUS) == 0) ++#ifdef IMAP_EDIT_THREADS ++#define NEW_ENV new_env ++#else ++#define NEW_ENV env ++#endif + { ++ if (h->irt_changed && h->NEW_ENV->in_reply_to) ++ { ++ LIST *listp = h->NEW_ENV->in_reply_to; ++ ++ if (fputs ("In-Reply-To: ", out) == EOF) ++ return (-1); ++ ++ for (; listp; listp = listp->next) ++ if ((fputs (listp->data, out) == EOF) || (fputc (' ', out) == EOF)) ++ return (-1); ++ ++ if (fputc ('\n', out) == EOF) ++ return (-1); ++ } ++ ++ if (h->refs_changed && h->NEW_ENV->references) ++ { ++ LIST *listp = h->NEW_ENV->references, *refs = NULL, *t; ++ ++ if (fputs ("References: ", out) == EOF) ++ return (-1); ++ ++ /* Mutt stores references in reverse order, thus we create ++ * a reordered refs list that we can put in the headers */ ++ for (; listp; listp = listp->next, refs = t) ++ { ++ t = (LIST *)safe_malloc (sizeof (LIST)); ++ t->data = listp->data; ++ t->next = refs; ++ } ++ ++ for (; refs; refs = refs->next) ++ if ((fputs (refs->data, out) == EOF) || (fputc (' ', out) == EOF)) ++ return (-1); ++ ++ /* clearing refs from memory */ ++ for (t = refs; refs; refs = t->next, t = refs) ++ safe_free ((void **)&refs); ++ ++ if (fputc ('\n', out) == EOF) ++ return (-1); ++ } ++#undef NEW_ENV ++ + if (h->old || h->read) + { + if (fputs ("Status: ", out) == EOF) +diff -ru work.old/mutt-1.5.6/curs_main.c work/mutt-1.5.6/curs_main.c +--- curs_main.c Wed Nov 5 10:41:31 2003 ++++ curs_main.c Tue Feb 10 14:40:41 2004 +@@ -930,6 +930,11 @@ + else + { + mutt_set_flag (Context, CURHDR, M_TAG, !CURHDR->tagged); ++ ++ Context->last_tag = CURHDR->tagged ? CURHDR : ++ ((Context->last_tag == CURHDR && !CURHDR->tagged) ++ ? NULL : Context->last_tag); ++ + menu->redraw = REDRAW_STATUS; + if (option (OPTRESOLVE) && menu->current < Context->vcount - 1) + { +@@ -1162,6 +1167,89 @@ + } + done = 1; + } ++ break; ++ ++ case OP_MAIN_BREAK_THREAD: ++ ++ CHECK_MSGCOUNT; ++ CHECK_VISIBLE; ++ CHECK_READONLY; ++ ++ if ((Sort & SORT_MASK) != SORT_THREADS) ++ mutt_error _("Threading is not enabled."); ++ ++#if defined (USE_IMAP) && ! defined (IMAP_EDIT_THREADS) ++ else if (Context->magic == M_IMAP) ++ mutt_error _("Compile Mutt with --enable-imap-edit-threads for break-thread support"); ++#endif ++ ++ else ++ { ++ { ++ HEADER *oldcur = CURHDR; ++ ++ mutt_break_thread (CURHDR); ++ mutt_sort_headers (Context, 1); ++ menu->current = oldcur->virtual; ++ } ++ ++ Context->changed = 1; ++ mutt_message _("Thread broken"); ++ ++ if (menu->menu == MENU_PAGER) ++ { ++ op = OP_DISPLAY_MESSAGE; ++ continue; ++ } ++ else ++ menu->redraw |= REDRAW_INDEX; ++ } ++ ++ break; ++ ++ case OP_MAIN_LINK_THREADS: ++ ++ CHECK_MSGCOUNT; ++ CHECK_VISIBLE; ++ CHECK_READONLY; ++ ++ if ((Sort & SORT_MASK) != SORT_THREADS) ++ mutt_error _("Threading is not enabled."); ++ ++#if defined (USE_IMAP) && ! defined (IMAP_EDIT_THREADS) ++ else if (Context->magic == M_IMAP) ++ mutt_error _("Compile Mutt with --enable-imap-edit-threads for link-threads support"); ++#endif ++ ++ else if (!CURHDR->env->message_id) ++ mutt_error _("No Message-ID: header available to link thread"); ++ else if (!tag && (!Context->last_tag || !Context->last_tag->tagged)) ++ mutt_error _("First, please tag a message to be linked here"); ++ else ++ { ++ HEADER *oldcur = CURHDR; ++ ++ if (mutt_link_threads (CURHDR, tag ? NULL : Context->last_tag, ++ Context)) ++ { ++ mutt_sort_headers (Context, 1); ++ menu->current = oldcur->virtual; ++ ++ Context->changed = 1; ++ mutt_message _("Threads linked"); ++ } ++ else ++ mutt_error _("No thread linked"); ++ } ++ ++ if (menu->menu == MENU_PAGER) ++ { ++ op = OP_DISPLAY_MESSAGE; ++ continue; ++ } ++ else ++ menu->redraw |= REDRAW_STATUS | REDRAW_INDEX; ++ + break; + + case OP_EDIT_TYPE: +diff -ru work.old/mutt-1.5.6/doc/manual.sgml.head work/mutt-1.5.6/doc/manual.sgml.head +--- doc/manual.sgml.head Sun Feb 1 18:49:53 2004 ++++ doc/manual.sgml.head Tue Feb 10 14:40:41 2004 +@@ -2197,8 +2197,43 @@ + with large volume mailing lists easier because you can easily delete + uninteresting threads and quickly find topics of value. + ++<sect1>Editing threads ++<p> ++Mutt has the ability to dynamically restructure threads that are broken ++either by misconfigured software or bad behaviour from some ++correspondents. This allows to clean your mailboxes formats) from these ++annoyances which make it hard to follow a discussion. ++ ++If you want to use these functions with IMAP, you need to compile Mutt ++with the <em/--enable-imap-edit-threads/ configure flag. ++ ++<sect2>Linking threads ++<p> ++ ++Some mailers tend to "forget" to correctly set the "In-Reply-To:" and ++"References:" headers when replying to a message. This results in broken ++discussions because Mutt has not enough information to guess the correct ++threading. ++You can fix this by tagging the reply, then moving to the parent message ++and using the ``link-threads'' function (bound to & by default). The ++reply will then be connected to this "parent" message. ++ ++You can also connect multiple childs at once, tagging them and using the ++tag-prefix command (';') or the auto_tag option. ++ ++<sect2>Breaking threads ++<p> ++ ++On mailing lists, some people are in the bad habit of starting a new ++discussion by hitting "reply" to any message from the list and changing ++the subject to a totally unrelated one. ++You can fix such threads by using the ``break-thread'' function (bound ++by default to #), which will turn the subthread starting from the ++current message into a whole different thread. ++ + <sect1>Delivery Status Notification (DSN) Support + <p> ++ + RFC1894 defines a set of MIME content types for relaying information + about the status of electronic mail messages. These can be thought of as + ``return receipts.'' Berkeley sendmail 8.8.x currently has some command +diff -ru work.old/mutt-1.5.6/functions.h work/mutt-1.5.6/functions.h +--- functions.h Wed Nov 5 10:41:31 2003 ++++ functions.h Tue Feb 10 14:40:41 2004 +@@ -69,6 +69,7 @@ + struct binding_t OpMain[] = { + { "create-alias", OP_CREATE_ALIAS, "a" }, + { "bounce-message", OP_BOUNCE_MESSAGE, "b" }, ++ { "break-thread", OP_MAIN_BREAK_THREAD, "#" }, + { "change-folder", OP_MAIN_CHANGE_FOLDER, "c" }, + { "change-folder-readonly", OP_MAIN_CHANGE_FOLDER_READONLY, "\033c" }, + { "collapse-thread", OP_MAIN_COLLAPSE_THREAD, "\033v" }, +@@ -95,6 +96,7 @@ + { "next-undeleted", OP_MAIN_NEXT_UNDELETED, "j" }, + { "previous-undeleted", OP_MAIN_PREV_UNDELETED, "k" }, + { "limit", OP_MAIN_LIMIT, "l" }, ++ { "link-threads", OP_MAIN_LINK_THREADS, "&" }, + { "list-reply", OP_LIST_REPLY, "L" }, + { "mail", OP_MAIL, "m" }, + { "toggle-new", OP_TOGGLE_NEW, "N" }, +@@ -153,6 +155,7 @@ + }; + + struct binding_t OpPager[] = { ++ { "break-thread", OP_MAIN_BREAK_THREAD, "#" }, + { "create-alias", OP_CREATE_ALIAS, "a" }, + { "bounce-message", OP_BOUNCE_MESSAGE, "b" }, + { "change-folder", OP_MAIN_CHANGE_FOLDER, "c" }, +@@ -175,6 +178,7 @@ + { "next-entry", OP_NEXT_ENTRY, "J" }, + { "previous-undeleted",OP_MAIN_PREV_UNDELETED, "k" }, + { "previous-entry", OP_PREV_ENTRY, "K" }, ++ { "link-threads", OP_MAIN_LINK_THREADS, "&" }, + { "list-reply", OP_LIST_REPLY, "L" }, + { "redraw-screen", OP_REDRAW, "\014" }, + { "mail", OP_MAIL, "m" }, +diff -ru work.old/mutt-1.5.6/imap/imap.c work/mutt-1.5.6/imap/imap.c +--- imap/imap.c Sun Feb 1 18:10:58 2004 ++++ imap/imap.c Tue Feb 10 14:40:41 2004 +@@ -981,9 +981,11 @@ + mutt_buffer_addstr (&cmd, "UID STORE "); + mutt_buffer_addstr (&cmd, uid); + +- /* if attachments have been deleted we delete the message and reupload +- * it. This works better if we're expunging, of course. */ +- if (ctx->hdrs[n]->attach_del) ++ /* 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 || ++ ctx->hdrs[n]->attach_del) + { + dprint (3, (debugfile, "imap_sync_mailbox: Attachments to be deleted, falling back to _mutt_save_message\n")); + if (!appendctx) +diff -ru work.old/mutt-1.5.6/main.c work/mutt-1.5.6/main.c +--- main.c Tue Mar 4 08:49:48 2003 ++++ main.c Tue Feb 10 14:40:41 2004 +@@ -228,6 +228,12 @@ + "-USE_IMAP " + #endif + ++#ifdef IMAP_EDIT_THREADS ++ "+IMAP_EDIT_THREADS " ++#else ++ "-IMAP_EDIT_THREADS " ++#endif ++ + #ifdef USE_GSS + "+USE_GSS " + #else +diff -ru work.old/mutt-1.5.6/mh.c work/mutt-1.5.6/mh.c +--- mh.c Sun Feb 1 18:10:57 2004 ++++ mh.c Tue Feb 10 14:40:41 2004 +@@ -1220,7 +1220,7 @@ + { + HEADER *h = ctx->hdrs[msgno]; + +- if (h->attach_del) ++ if (h->attach_del || h->refs_changed || h->irt_changed) + if (mh_rewrite_message (ctx, msgno) != 0) + return -1; + +@@ -1231,9 +1231,9 @@ + { + HEADER *h = ctx->hdrs[msgno]; + +- if (h->attach_del) ++ if (h->attach_del || h->refs_changed || h->irt_changed) + { +- /* when doing attachment deletion, fall back to the MH case. */ ++ /* when doing attachment deletion/rethreading, fall back to the MH case. */ + if (mh_rewrite_message (ctx, msgno) != 0) + return (-1); + } +diff -ru work.old/mutt-1.5.6/mutt.h work/mutt-1.5.6/mutt.h +--- mutt.h Sun Feb 1 18:15:17 2004 ++++ mutt.h Tue Feb 10 14:41:33 2004 +@@ -94,6 +94,8 @@ + #define CH_WEED_DELIVERED (1<<13) /* weed eventual Delivered-To headers */ + #define CH_FORCE_FROM (1<<14) /* give CH_FROM precedence over CH_WEED? */ + #define CH_NOQFROM (1<<15) /* give CH_FROM precedence over CH_WEED? */ ++#define CH_UPDATE_IRT (1<<16) /* update In-Reply-To: */ ++#define CH_UPDATE_REFS (1<<17) /* update References: */ + + /* flags for mutt_enter_string() */ + #define M_ALIAS 1 /* do alias "completion" by calling up the alias-menu */ +@@ -518,6 +520,8 @@ + void mutt_free_rx_list (RX_LIST **); + int mutt_matches_ignore (const char *, LIST *); + ++LIST *mutt_copy_list (LIST *); ++ + /* add an element to a list */ + LIST *mutt_add_list (LIST *, const char *); + +@@ -657,6 +661,8 @@ + 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. +@@ -697,6 +703,10 @@ + char *tree; /* character string to print thread tree */ + struct thread *thread; + ++#ifdef IMAP_EDIT_THREADS ++ ENVELOPE *new_env; /* envelope information for rethreading */ ++#endif ++ + #ifdef MIXMASTER + LIST *chain; + #endif +@@ -761,6 +771,7 @@ + char *pattern; /* limit pattern string */ + pattern_t *limit_pattern; /* compiled limit pattern */ + HEADER **hdrs; ++ HEADER *last_tag; /* last tagged msg. used to link threads */ + THREAD *tree; /* top of thread tree */ + HASH *id_hash; /* hash table by msg id */ + HASH *subj_hash; /* hash table by subject */ +diff -ru work.old/mutt-1.5.6/mx.c work/mutt-1.5.6/mx.c +--- mx.c Wed Nov 5 10:41:32 2003 ++++ mx.c Tue Feb 10 14:40:41 2004 +@@ -1161,6 +1161,8 @@ + ctx->deleted = 0; + } + } ++ else if (ctx->last_tag && ctx->last_tag->deleted) ++ ctx->last_tag = NULL; /* reset last tagged msg now useless */ + } + + /* really only for IMAP - imap_sync_mailbox results in a call to +diff -ru work.old/mutt-1.5.6/pager.c work/mutt-1.5.6/pager.c +--- pager.c Sun Feb 1 18:10:57 2004 ++++ pager.c Tue Feb 10 14:40:41 2004 +@@ -2481,6 +2481,11 @@ + case OP_TAG: + CHECK_MODE(IsHeader (extra)); + mutt_set_flag (Context, extra->hdr, M_TAG, !extra->hdr->tagged); ++ ++ Context->last_tag = extra->hdr->tagged ? extra->hdr : ++ ((Context->last_tag == extra->hdr && !extra->hdr->tagged) ++ ? NULL : Context->last_tag); ++ + redraw = REDRAW_STATUS | REDRAW_INDEX; + if (option (OPTRESOLVE)) + { +diff -ru work.old/mutt-1.5.6/protos.h work/mutt-1.5.6/protos.h +--- protos.h Sun Feb 1 18:15:17 2004 ++++ protos.h Tue Feb 10 14:40:41 2004 +@@ -148,6 +148,7 @@ + void mutt_block_signals_system (void); + void mutt_body_handler (BODY *, STATE *); + int mutt_bounce_message (FILE *fp, HEADER *, ADDRESS *); ++void mutt_break_thread (HEADER *); + void mutt_buffy (char *, size_t); + int mutt_buffy_list (void); + void mutt_canonical_charset (char *, size_t, const char *); +@@ -289,6 +290,7 @@ + int mutt_is_subscribed_list (ADDRESS *); + int mutt_is_text_part (BODY *); + int mutt_is_valid_mailbox (const char *); ++int mutt_link_threads (HEADER *, HEADER *, CONTEXT *); + int mutt_lookup_mime_type (BODY *, const char *); + int mutt_match_rx_list (const char *, RX_LIST *); + int mutt_messages_in_thread (CONTEXT *, HEADER *, int); +diff -ru work.old/mutt-1.5.6/thread.c work/mutt-1.5.6/thread.c +--- thread.c Sun Feb 1 18:10:58 2004 ++++ thread.c Tue Feb 10 14:40:41 2004 +@@ -1336,3 +1336,105 @@ + + return hash; + } ++ ++static void clean_references (THREAD *brk, THREAD *cur) ++{ ++ THREAD *p; ++ LIST *ref = NULL; ++ int done = 0; ++ ++ for (; cur; cur = cur->next, done = 0) ++ { ++ /* parse subthread recursively */ ++ clean_references (brk, cur->child); ++ ++ if (!cur->message) ++ break; /* skip pseudo-message */ ++ ++ /* Looking for the first bad reference according to the new threading. ++ * Optimal since Mutt stores the references in reverse order, and the ++ * first loop should match immediatly for mails respecting RFC2822. */ ++ for (p = brk; !done && p; p = p->parent) ++ for (ref = cur->message->env->references; p->message && ref; ref = ref->next) ++ if (!mutt_strcasecmp (ref->data, p->message->env->message_id)) ++ { ++ done = 1; ++ break; ++ } ++ ++ if (done) ++ { ++ HEADER *h = cur->message; ++ ++ /* clearing the References: header from obsolete Message-Id(s) */ ++ mutt_free_list (&ref->next); ++ ++#ifdef IMAP_EDIT_THREADS ++ 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); ++#endif ++ ++ h->refs_changed = h->changed = 1; ++ } ++ } ++} ++ ++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; ++ ++#ifdef IMAP_EDIT_THREADS ++ 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 (); ++#endif ++ ++ clean_references (hdr->thread, hdr->thread->child); ++} ++ ++static int link_threads (HEADER *parent, HEADER *child, CONTEXT *ctx) ++{ ++ if (child == parent) ++ return 0; ++ ++ mutt_break_thread (child); ++ ++ child->env->in_reply_to = mutt_new_list (); ++ child->env->in_reply_to->data = safe_strdup (parent->env->message_id); ++ ++#ifdef IMAP_EDIT_THREADS ++ child->new_env->in_reply_to = mutt_new_list (); ++ child->new_env->in_reply_to->data = safe_strdup (parent->env->message_id); ++#endif ++ ++ mutt_set_flag (ctx, child, M_TAG, 0); ++ ++ child->irt_changed = child->changed = 1; ++ return 1; ++} ++ ++int mutt_link_threads (HEADER *cur, HEADER *last, CONTEXT *ctx) ++{ ++ int i, changed = 0; ++ ++ if (!last) ++ { ++ for (i = 0; i < ctx->vcount; i++) ++ if (ctx->hdrs[Context->v2r[i]]->tagged) ++ changed |= link_threads (cur, ctx->hdrs[Context->v2r[i]], ctx); ++ } ++ else ++ changed = link_threads (cur, last, ctx); ++ ++ return changed; ++} |