]> git.notmuchmail.org Git - notmuch/blobdiff - lib/thread.cc
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / lib / thread.cc
index 6073e45c0572a262f83b67d68da7acc89a41d191..60e9a666ec1b348c7b2f413c6da94d4655188831 100644 (file)
@@ -25,7 +25,8 @@
 #include <glib.h>                                       /* GHashTable */
 
 #ifdef DEBUG_THREADING
-#define THREAD_DEBUG(format, ...) fprintf (stderr, format " (%s).\n", ##__VA_ARGS__, __location__)
+#define THREAD_DEBUG(format, ...) fprintf (stderr, "DT: " format " (%s).\n", ##__VA_ARGS__, \
+                                          __location__)
 #else
 #define THREAD_DEBUG(format, ...) do {} while (0)       /* ignored */
 #endif
@@ -351,14 +352,16 @@ _thread_set_subject_from_message (notmuch_thread_t *thread,
 /* Add a message to this thread which is known to match the original
  * search specification. The 'sort' parameter controls whether the
  * oldest or newest matching subject is applied to the thread as a
- * whole. */
-static void
+ * whole. Returns 0 on success.
+ */
+static int
 _thread_add_matched_message (notmuch_thread_t *thread,
                             notmuch_message_t *message,
                             notmuch_sort_t sort)
 {
     time_t date;
     notmuch_message_t *hashed_message;
+    notmuch_bool_t is_set;
 
     date = notmuch_message_get_date (message);
 
@@ -375,7 +378,9 @@ _thread_add_matched_message (notmuch_thread_t *thread,
            _thread_set_subject_from_message (thread, message);
     }
 
-    if (! notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED))
+    if (notmuch_message_get_flag_st (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED, &is_set))
+       return -1;
+    if (! is_set)
        thread->matched_messages++;
 
     if (g_hash_table_lookup_extended (thread->message_hash,
@@ -386,6 +391,7 @@ _thread_add_matched_message (notmuch_thread_t *thread,
     }
 
     _thread_add_matched_author (thread, _notmuch_message_get_author (hashed_message));
+    return 0;
 }
 
 static bool
@@ -395,7 +401,7 @@ _parent_via_in_reply_to (notmuch_thread_t *thread, notmuch_message_t *message)
     const char *in_reply_to;
 
     in_reply_to = _notmuch_message_get_in_reply_to (message);
-    THREAD_DEBUG ("checking message = %s in_reply_to=%s\n",
+    THREAD_DEBUG ("checking message = %s in_reply_to=%s",
                  notmuch_message_get_message_id (message), in_reply_to);
 
     if (in_reply_to && (! EMPTY_STRING (in_reply_to)) &&
@@ -418,31 +424,31 @@ _parent_or_toplevel (notmuch_thread_t *thread, notmuch_message_t *message)
     const notmuch_string_list_t *references =
        _notmuch_message_get_references (message);
 
-    THREAD_DEBUG ("trying to reparent via references: %s\n",
+    THREAD_DEBUG ("trying to reparent via references: %s",
                  notmuch_message_get_message_id (message));
 
     for (notmuch_string_node_t *ref_node = references->head;
         ref_node; ref_node = ref_node->next) {
-       THREAD_DEBUG ("checking reference=%s\n", ref_node->string);
+       THREAD_DEBUG ("checking reference=%s", ref_node->string);
        if ((g_hash_table_lookup_extended (thread->message_hash,
                                           ref_node->string, NULL,
                                           (void **) &new_parent))) {
            size_t new_depth = _notmuch_message_get_thread_depth (new_parent);
-           THREAD_DEBUG ("got depth %lu\n", new_depth);
+           THREAD_DEBUG ("got depth %lu", new_depth);
            if (new_depth > max_depth || ! parent) {
-               THREAD_DEBUG ("adding at depth %lu parent=%s\n", new_depth, ref_node->string);
+               THREAD_DEBUG ("adding at depth %lu parent=%s", new_depth, ref_node->string);
                max_depth = new_depth;
                parent = new_parent;
            }
        }
     }
     if (parent) {
-       THREAD_DEBUG ("adding reply %s to parent=%s\n",
+       THREAD_DEBUG ("adding reply %s to parent=%s",
                      notmuch_message_get_message_id (message),
                      notmuch_message_get_message_id (parent));
        _notmuch_message_add_reply (parent, message);
     } else {
-       THREAD_DEBUG ("adding as toplevel %s\n",
+       THREAD_DEBUG ("adding as toplevel %s",
                      notmuch_message_get_message_id (message));
        _notmuch_message_list_add_message (thread->toplevel_list, message);
     }
@@ -477,13 +483,13 @@ _resolve_thread_relationships (notmuch_thread_t *thread)
      */
     if (first_node) {
        message = first_node->message;
-       THREAD_DEBUG ("checking first message  %s\n",
+       THREAD_DEBUG ("checking first message  %s",
                      notmuch_message_get_message_id (message));
 
        if (_notmuch_message_list_empty (maybe_toplevel_list) ||
            ! _parent_via_in_reply_to (thread, message)) {
 
-           THREAD_DEBUG ("adding first message as toplevel = %s\n",
+           THREAD_DEBUG ("adding first message as toplevel = %s",
                          notmuch_message_get_message_id (message));
            _notmuch_message_list_add_message (maybe_toplevel_list, message);
        }
@@ -500,7 +506,8 @@ _resolve_thread_relationships (notmuch_thread_t *thread)
         notmuch_messages_valid (roots);
         notmuch_messages_move_to_next (roots)) {
        notmuch_message_t *message = notmuch_messages_get (roots);
-       if (_notmuch_messages_has_next (roots) || ! _notmuch_message_list_empty (thread->toplevel_list))
+       if (_notmuch_messages_has_next (roots) || ! _notmuch_message_list_empty (
+               thread->toplevel_list))
            _parent_or_toplevel (thread, message);
        else
            _notmuch_message_list_add_message (thread->toplevel_list, message);
@@ -625,7 +632,10 @@ _notmuch_thread_create (void *ctx,
 
        if ( _notmuch_doc_id_set_contains (match_set, doc_id)) {
            _notmuch_doc_id_set_remove (match_set, doc_id);
-           _thread_add_matched_message (thread, message, sort);
+           if (_thread_add_matched_message (thread, message, sort)) {
+               thread = NULL;
+               goto DONE;
+           }
        }
 
        _notmuch_message_close (message);