From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 3215E6DE031B for ; Mon, 30 Jul 2018 15:47:09 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: 0.001 X-Spam-Level: X-Spam-Status: No, score=0.001 tagged_above=-999 required=5 tests=[AWL=0.012, SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kFDBIAQdPL0r for ; Mon, 30 Jul 2018 15:47:08 -0700 (PDT) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by arlo.cworth.org (Postfix) with ESMTPS id CD3996DE0AD0 for ; Mon, 30 Jul 2018 15:46:53 -0700 (PDT) Received: from remotemail by fethera.tethera.net with local (Exim 4.89) (envelope-from ) id 1fkGwH-0002EP-1h; Mon, 30 Jul 2018 18:46:53 -0400 Received: (nullmailer pid 28737 invoked by uid 1000); Mon, 30 Jul 2018 22:45:56 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH 09/15] lib/thread: change _resolve_thread_relationships to use depths Date: Tue, 31 Jul 2018 06:45:49 +0800 Message-Id: <20180730224555.26047-10-david@tethera.net> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180730224555.26047-1-david@tethera.net> References: <20180730224555.26047-1-david@tethera.net> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Jul 2018 22:47:09 -0000 We (finally) implement the XXX comment. It requires a bit of care not to reparent all of the possible toplevel messages. There is some slightly naughty low level access to the list structures here that can be cleaned up in a later commit. --- lib/thread.cc | 53 ++++++++++++++++++------------------- test/T510-thread-replies.sh | 1 - 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/lib/thread.cc b/lib/thread.cc index 3fc35f22..a5047103 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -467,12 +467,6 @@ _resolve_thread_relationships (notmuch_thread_t *thread) _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) @@ -481,31 +475,36 @@ _resolve_thread_relationships (notmuch_thread_t *thread) */ if (first_node) { message = first_node->message; - if (! thread->toplevel_list->head || + DEBUG_PRINTF("checking first message %s\n", + notmuch_message_get_message_id (message)); + + if (! maybe_toplevel_list->head || ! _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); + DEBUG_PRINTF("adding first message as toplevel = %s\n", + notmuch_message_get_message_id (message)); + _notmuch_message_list_add_message (maybe_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. - * 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. - */ + for (notmuch_messages_t *messages = _notmuch_messages_create (maybe_toplevel_list); + notmuch_messages_valid (messages); + notmuch_messages_move_to_next (messages)) + { + notmuch_message_t *message = notmuch_messages_get (messages); + _notmuch_message_label_depths (message, 0); + } + + 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); + /* XXX add _notmuch_messages_count */ + if (roots->iterator->next || thread->toplevel_list->head) + _parent_or_toplevel (thread, message); + else + _notmuch_message_list_add_message (thread->toplevel_list, message); + } + for (notmuch_messages_t *messages = _notmuch_messages_create (thread->toplevel_list); notmuch_messages_valid (messages); notmuch_messages_move_to_next (messages)) diff --git a/test/T510-thread-replies.sh b/test/T510-thread-replies.sh index 3ee2ee78..84a3e6e8 100755 --- a/test/T510-thread-replies.sh +++ b/test/T510-thread-replies.sh @@ -174,7 +174,6 @@ EOF test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "reply to ghost (tree view)" -test_subtest_known_broken test_emacs '(notmuch-tree "id:000-real-root@example.org") (notmuch-test-wait) (test-output) -- 2.18.0