From: David Bremner <david@tethera.net>
To: notmuch@notmuchmail.org
Subject: [PATCH 6/9] lib: initial fix for "ghost replyto"
Date: Sat, 21 Jul 2018 08:37:43 +0900 [thread overview]
Message-ID: <20180720233746.2844-7-david@tethera.net> (raw)
In-Reply-To: <20180720233746.2844-1-david@tethera.net>
This fixes the failing test of _resolve_thread_relationships
introduced above, but will probably place messages in-reply-to
ghosts (i.e. in-reply-to missing messages) too far up in the thread
in more complicated examples. In particular it does not follow the
suggestion in the XXX: comment to choose the deepest parent.
---
lib/thread.cc | 53 ++++++++++++++++++++++++++++++++++-----
test/T260-thread-order.sh | 1 -
2 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/lib/thread.cc b/lib/thread.cc
index 93508359..417235ea 100644
--- a/lib/thread.cc
+++ b/lib/thread.cc
@@ -406,22 +406,52 @@ _parent_via_in_reply_to (notmuch_thread_t *thread, notmuch_message_t *message) {
}
}
+static void
+_parent_or_toplevel (notmuch_thread_t *thread, notmuch_message_t *message)
+{
+ bool found = false;
+ notmuch_message_t *parent = NULL;
+ const notmuch_string_list_t *references =
+ _notmuch_message_get_references (message);
+ for (notmuch_string_node_t *ref_node = references->head;
+ ! found && ref_node; ref_node = ref_node->next) {
+ if ((found = g_hash_table_lookup_extended (thread->message_hash,
+ ref_node->string, NULL,
+ (void **) &parent))) {
+ _notmuch_message_add_reply (parent, message);
+ }
+ }
+ if (! found)
+ _notmuch_message_list_add_message (thread->toplevel_list, message);
+}
+
static void
_resolve_thread_relationships (notmuch_thread_t *thread)
{
notmuch_message_node_t *node, *first_node;
notmuch_message_t *message;
+ void *local;
+ notmuch_message_list_t *maybe_toplevel_list;
first_node = thread->message_list->head;
if (! first_node)
return;
+ local = talloc_new (thread);
+ maybe_toplevel_list = _notmuch_message_list_create (local);
+
for (node = first_node->next; node; node = node->next) {
message = node->message;
if (! _parent_via_in_reply_to (thread, message))
- _notmuch_message_list_add_message (thread->toplevel_list, message);
+ _notmuch_message_list_add_message (maybe_toplevel_list, message);
}
+ for (notmuch_messages_t *roots = _notmuch_messages_create (maybe_toplevel_list);
+ notmuch_messages_valid (roots);
+ notmuch_messages_move_to_next (roots)) {
+ notmuch_message_t *message = notmuch_messages_get (roots);
+ _parent_or_toplevel (thread, message);
+ }
/*
* if we reach the end of the list without finding a top-level
* message, that means the thread is a cycle (or set of cycles)
@@ -431,20 +461,31 @@ _resolve_thread_relationships (notmuch_thread_t *thread)
if (first_node) {
message = first_node->message;
if (! thread->toplevel_list->head ||
- ! _parent_via_in_reply_to (thread, message))
- _notmuch_message_list_add_message (thread->toplevel_list, message);
+ ! _parent_via_in_reply_to (thread, message)) {
+ /*
+ * If the oldest message happens to be in-reply-to a
+ * missing message, we only check for references if there
+ * is some other candidate for root message.
+ */
+ if (thread->toplevel_list->head)
+ _parent_or_toplevel (thread, message);
+ else
+ _notmuch_message_list_add_message (thread->toplevel_list, message);
+ }
}
/* XXX: After scanning through the entire list looking for parents
* via "In-Reply-To", we should do a second pass that looks at the
- * list of messages IDs in the "References" header instead. (And
- * for this the parent would be the "deepest" message of all the
- * messages found in the "References" list.)
+ * list of messages IDs in the "References" header instead.
+ * Unlike the current quick fix, the parent should be the
+ * "deepest" message of all the messages found in the "References"
+ * list.
*
* Doing this will allow messages and sub-threads to be positioned
* correctly in the thread even when an intermediate message is
* missing from the thread.
*/
+ talloc_free (local);
}
/* Create a new notmuch_thread_t object by finding the thread
diff --git a/test/T260-thread-order.sh b/test/T260-thread-order.sh
index ce8636b9..9565f296 100755
--- a/test/T260-thread-order.sh
+++ b/test/T260-thread-order.sh
@@ -78,7 +78,6 @@ test_expect_equal "$output" "$expected"
add_email_corpus threading
test_begin_subtest "reply to ghost"
-test_subtest_known_broken
notmuch show --entire-thread=true id:000-real-root@example.org | grep ^Subject: | head -1 > OUTPUT
cat <<EOF > EXPECTED
Subject: root message
--
2.18.0
next prev parent reply other threads:[~2018-07-20 23:38 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-20 23:37 v1: fix for threading of replies to ghost messages David Bremner
2018-07-20 23:37 ` [PATCH 1/9] util: add DEBUG_PRINTF, rename error_util.h -> debug_print.h David Bremner
2018-07-20 23:37 ` [PATCH 2/9] test: start threading test corpus David Bremner
2018-07-20 23:37 ` [PATCH 3/9] test: add known broken tests for "ghost roots" David Bremner
2018-07-20 23:37 ` [PATCH 4/9] lib: read reference terms into message struct David Bremner
2018-07-20 23:37 ` [PATCH 5/9] lib/thread: refactor in-reply-to test David Bremner
2018-07-20 23:37 ` David Bremner [this message]
2018-07-20 23:37 ` [PATCH 7/9] lib: calculate message depth in thread David Bremner
2018-07-20 23:37 ` [PATCH 8/9] lib/thread: rewrite _parent_or_toplevel to use depths David Bremner
2018-07-20 23:37 ` [PATCH 9/9] lib/thread: change _resolve_thread_relationships " David Bremner
2018-07-21 17:35 ` v1: fix for threading of replies to ghost messages Gregor Zattler
2018-07-23 8:41 ` David Bremner
2018-07-23 12:09 ` Gregor Zattler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180720233746.2844-7-david@tethera.net \
--to=david@tethera.net \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).