+ thread->matched_messages++;
+
+ if (g_hash_table_lookup_extended (thread->message_hash,
+ notmuch_message_get_message_id (message), NULL,
+ (void **) &hashed_message)) {
+ notmuch_message_set_flag (hashed_message,
+ NOTMUCH_MESSAGE_FLAG_MATCH, 1);
+ }
+}
+
+static void
+_resolve_thread_relationships (unused (notmuch_thread_t *thread))
+{
+ notmuch_message_node_t **prev, *node;
+ notmuch_message_t *message, *parent;
+ const char *in_reply_to;
+
+ prev = &thread->message_list->head;
+ while ((node = *prev)) {
+ message = node->message;
+ in_reply_to = _notmuch_message_get_in_reply_to (message);
+ if (in_reply_to && strlen (in_reply_to) &&
+ g_hash_table_lookup_extended (thread->message_hash,
+ in_reply_to, NULL,
+ (void **) &parent))
+ {
+ *prev = node->next;
+ if (thread->message_list->tail == &node->next)
+ thread->message_list->tail = prev;
+ node->next = NULL;
+ _notmuch_message_add_reply (parent, node);
+ } else {
+ prev = &((*prev)->next);
+ }
+ }
+
+ /* 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.)
+ *
+ * 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.
+ */