Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Feb 2004 18:17:39 +0100 (CET)
From:      Udo Schweigert <udo.schweigert@siemens.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/62651: maintainer-update of mail/mutt-devel
Message-ID:  <200402101717.i1AHHdGR039169@alaska.cert.siemens.de>
Resent-Message-ID: <200402101720.i1AHKBME002693@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         62651
>Category:       ports
>Synopsis:       maintainer-update of mail/mutt-devel
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Tue Feb 10 09:20:10 PST 2004
>Closed-Date:
>Last-Modified:
>Originator:     Udo Schweigert
>Release:        FreeBSD 4.9-STABLE i386
>Organization:
>Environment:

>Description:

Maintainer update of mail/mutt-devel:

	- Fix WITH_MUTT_EDIT_THREADS knob.

	- Add SIZEs to distinfo.

Committer: new file (cvs add): files/extra-patch-edit-threads

>How-To-Repeat:
>Fix:

diff -ru  /usr/ports/mail/mutt-devel/Makefile ./Makefile
--- /usr/ports/mail/mutt-devel/Makefile	Tue Feb 10 06:33:05 2004
+++ ./Makefile	Tue Feb 10 14:50:29 2004
@@ -125,9 +125,6 @@
 
 .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 @@
 	@${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 @@
 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 -ru  /usr/ports/mail/mutt-devel/distinfo ./distinfo
--- /usr/ports/mail/mutt-devel/distinfo	Thu Feb  5 06:31:10 2004
+++ ./distinfo	Tue Feb 10 14:50:38 2004
@@ -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 -ru  /usr/ports/mail/mutt-devel/files/extra-patch-edit-threads ./files/extra-patch-edit-threads
--- /usr/ports/mail/mutt-devel/files/extra-patch-edit-threads	Thu Jan  1 01:00:00 1970
+++ ./files/extra-patch-edit-threads	Tue Feb 10 14:53:16 2004
@@ -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;
++}
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200402101717.i1AHHdGR039169>