- Fix WITH_MUTT_EDIT_THREADS knob
- Add SIZEs to distinfo PR: ports/62651 Submitted by: maintainer
This commit is contained in:
parent
3978423fca
commit
d1df982bea
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=100583
@ -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
|
||||
|
@ -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
|
||||
|
651
mail/mutt-devel/files/extra-patch-edit-threads
Normal file
651
mail/mutt-devel/files/extra-patch-edit-threads
Normal file
@ -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;
|
||||
+}
|
Loading…
Reference in New Issue
Block a user