notmuch show: limit display to only matching messages
authorBart Trojanowski <bart@jukie.net>
Sat, 28 Nov 2009 02:49:39 +0000 (21:49 -0500)
committerCarl Worth <cworth@cworth.org>
Wed, 2 Dec 2009 22:32:14 +0000 (14:32 -0800)
This patch changes the default behaviour of notmuch show to display only
messages that match the search expression.  However, --entire-thread
option is provided to display all messages in threads that matched the
search expression.

It is deemed that will be more useful for human users on the command line.
Scripts can be modified to include the --entire-thread option so that they
can display all messages once more.

Example:

$ notmuch search subject:git AND thread:23d99d0f364f93e90e15df8b42eddb5b
thread:23d99d0f364f93e90e15df8b42eddb5b      July 31 [4/12] Johan Herland; [RFCv2 00/12] Foreign VCS helper program for CVS repositories (inbox unread)

Note that in this thread 4 out of 12 messages matched.  The default show
behaviour is to show only those messages that match:

$ notmuch show subject:git AND thread:23d99d0f364f93e90e15df8b42eddb5b | grep 'message{' | wc -l
4

With the --entire-thread option the output will contain all dozen
messages:

$ notmuch show --entire-thread subject:git AND thread:23d99d0f364f93e90e15df8b42eddb5b | grep 'message{' | wc -l
12

Signed-off-by: Bart Trojanowski <bart@jukie.net>
notmuch-show.c
notmuch.c

index 13c91e47f17cee399d881af125ad2907916c5d56..60339d088642323f8a15a581803c3fcbc2a714a3 100644 (file)
@@ -212,6 +212,24 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
     notmuch_thread_t *thread;
     notmuch_messages_t *messages;
     char *query_string;
+    int entire_thread = 0;
+    int i;
+
+    for (i = 0; i < argc && argv[i][0] == '-'; i++) {
+       if (strcmp (argv[i], "--") == 0) {
+           i++;
+           break;
+       }
+        if (strcmp(argv[i], "--entire-thread") == 0) {
+           entire_thread = 1;
+       } else {
+           fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
+           return 1;
+       }
+    }
+
+    argc -= i;
+    argv += i;
 
     config = notmuch_config_open (ctx, NULL, NULL);
     if (config == NULL)
@@ -239,21 +257,29 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
        return 1;
     }
 
-    for (threads = notmuch_query_search_threads (query);
-        notmuch_threads_has_more (threads);
-        notmuch_threads_advance (threads))
-    {
-       thread = notmuch_threads_get (threads);
+    if (!entire_thread) {
+       messages = notmuch_query_search_messages (query);
+       if (messages == NULL)
+           INTERNAL_ERROR ("No messages.\n");
+       show_messages (ctx, messages, 0);
 
-       messages = notmuch_thread_get_toplevel_messages (thread);
+    } else {
+       for (threads = notmuch_query_search_threads (query);
+               notmuch_threads_has_more (threads);
+               notmuch_threads_advance (threads))
+       {
+           thread = notmuch_threads_get (threads);
 
-       if (messages == NULL)
-           INTERNAL_ERROR ("Thread %s has no toplevel messages.\n",
-                           notmuch_thread_get_thread_id (thread));
+           messages = notmuch_thread_get_toplevel_messages (thread);
 
-       show_messages (ctx, messages, 0);
+           if (messages == NULL)
+               INTERNAL_ERROR ("Thread %s has no toplevel messages.\n",
+                       notmuch_thread_get_thread_id (thread));
+
+           show_messages (ctx, messages, 0);
 
-       notmuch_thread_destroy (thread);
+           notmuch_thread_destroy (thread);
+       }
     }
 
     notmuch_query_destroy (query);
index d9846ce791c1d6e5d4ae8bec8c9a51b928662f50..06b55f9d0ae6229332c74cb238d8a590b54a90f9 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -177,6 +177,14 @@ command_t commands[] = {
       "\t\t(all replies to a particular message appear immediately\n"
       "\t\tafter that message in date order).\n"
       "\n"
+      "\t\tSupported options for show include:\n"
+      "\n"
+      "\t\t--entire-thread\n"
+      "\n"
+      "\t\t\tBy default only messages strictly matching the\n"
+      "\t\t\tsearch expression will be displayed.  With this\n"
+      "\t\t\toption all messages in matching threads are shown.\n"
+      "\n"
       "\t\tThe output format is plain-text, with all text-content\n"
       "\t\tMIME parts decoded. Various components in the output,\n"
       "\t\t('message', 'header', 'body', 'attachment', and MIME 'part')\n"