]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-show.c
notmuch-show.c: add an option for messages to be returned unthreaded
[notmuch] / notmuch-show.c
index 9779cfa5cd4f14be0d599fa753a97077b328c6db..ab1cd1446e6f89a4d87cc7fe1c207561afe5f48e 100644 (file)
@@ -492,7 +492,7 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
     /* The disposition and content-type metadata are associated with
      * the envelope for message parts */
     GMimeObject *meta = node->envelope_part ? (
-       GMIME_OBJECT (node->envelope_part) ) : node->part ;
+       GMIME_OBJECT (node->envelope_part) ) : node->part;
     GMimeContentType *content_type = g_mime_object_get_content_type (meta);
     const bool leaf = GMIME_IS_PART (node->part);
     GMimeStream *stream = params->out_stream;
@@ -515,7 +515,7 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
        const char *disposition = _get_disposition (meta);
        const char *cid = g_mime_object_get_content_id (meta);
        const char *filename = leaf ? (
-           g_mime_part_get_filename (GMIME_PART (node->part)) ) : NULL ;
+           g_mime_part_get_filename (GMIME_PART (node->part)) ) : NULL;
 
        if (disposition &&
            strcasecmp (disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
@@ -688,7 +688,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
     /* The disposition and content-type metadata are associated with
      * the envelope for message parts */
     GMimeObject *meta = node->envelope_part ? (
-       GMIME_OBJECT (node->envelope_part) ): node->part;
+       GMIME_OBJECT (node->envelope_part) ) : node->part;
     GMimeContentType *content_type = g_mime_object_get_content_type (meta);
     char *content_string;
     const char *disposition = _get_disposition (meta);
@@ -965,7 +965,7 @@ show_message (void *ctx,
            }
        }
     }
-    DONE :
+  DONE:
     talloc_free (local);
     return status;
 }
@@ -1066,11 +1066,11 @@ do_show_single (void *ctx,
 
 /* Formatted output of threads */
 static int
-do_show (void *ctx,
-        notmuch_query_t *query,
-        const notmuch_show_format_t *format,
-        sprinter_t *sp,
-        notmuch_show_params_t *params)
+do_show_threaded (void *ctx,
+                 notmuch_query_t *query,
+                 const notmuch_show_format_t *format,
+                 sprinter_t *sp,
+                 notmuch_show_params_t *params)
 {
     notmuch_threads_t *threads;
     notmuch_thread_t *thread;
@@ -1107,6 +1107,50 @@ do_show (void *ctx,
     return res != NOTMUCH_STATUS_SUCCESS;
 }
 
+static int
+do_show_unthreaded (void *ctx,
+                   notmuch_query_t *query,
+                   const notmuch_show_format_t *format,
+                   sprinter_t *sp,
+                   notmuch_show_params_t *params)
+{
+    notmuch_messages_t *messages;
+    notmuch_message_t *message;
+    notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS;
+    notmuch_bool_t excluded;
+
+    status = notmuch_query_search_messages (query, &messages);
+    if (print_status_query ("notmuch show", query, status))
+       return 1;
+
+    sp->begin_list (sp);
+
+    for (;
+        notmuch_messages_valid (messages);
+        notmuch_messages_move_to_next (messages)) {
+       sp->begin_list (sp);
+       sp->begin_list (sp);
+
+       message = notmuch_messages_get (messages);
+
+       notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH, TRUE);
+       excluded = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED);
+
+       if (!excluded || !params->omit_excluded) {
+           status = show_message (ctx, format, sp, message, 0, params);
+           if (status && !res)
+               res = status;
+       } else {
+           sp->null (sp);
+       }
+       notmuch_message_destroy (message);
+       sp->end (sp);
+       sp->end (sp);
+    }
+    sp->end (sp);
+    return res;
+}
+
 enum {
     NOTMUCH_FORMAT_NOT_SPECIFIED,
     NOTMUCH_FORMAT_JSON,
@@ -1168,6 +1212,7 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
     bool exclude = true;
     bool entire_thread_set = false;
     bool single_message;
+    bool unthreaded = FALSE;
 
     notmuch_opt_desc_t options[] = {
        { .opt_keyword = &format, .name = "format", .keywords =
@@ -1181,6 +1226,7 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
        { .opt_bool = &exclude, .name = "exclude" },
        { .opt_bool = &params.entire_thread, .name = "entire-thread",
          .present = &entire_thread_set },
+       { .opt_bool = &unthreaded, .name = "unthreaded" },
        { .opt_int = &params.part, .name = "part" },
        { .opt_keyword = (int *) (&params.crypto.decrypt), .name = "decrypt",
          .keyword_no_arg_value = "true", .keywords =
@@ -1317,10 +1363,13 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
            params.omit_excluded = false;
        }
 
-       ret = do_show (config, query, formatter, sprinter, &params);
+       if (unthreaded)
+           ret = do_show_unthreaded (config, query, formatter, sprinter, &params);
+       else
+           ret = do_show_threaded (config, query, formatter, sprinter, &params);
     }
 
-    DONE :
+  DONE:
     g_mime_stream_flush (params.out_stream);
     g_object_unref (params.out_stream);