[notmuch] [PATCH 1/2] notmuch-show: limit display to only matching messages

2009-12-02 Thread Carl Worth
On Fri, 27 Nov 2009 21:49:39 -0500, Bart Trojanowski  wrote:
> 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.

Thanks Bart.

I've now applied this as well as your following patch to make vim call
"notmuch show" with the --entire-thread option. I also added support to
the emacs client to do the same, and I updated the notmuch man page to
document the option.

Finally, I noticed that not passing the --entire-thread option caused
"notmuch show" to lose all nesting and thread-ordering characteristics,
(even if display the entire thread incidentally). This came from calling
notmuch_query_search_messages (which doesn't do any threading) rather
than notmuch_query_search_threads. So I committed the patch below which
causes it to once again call search_threads and simply not display any
messages that don't match the search when called without
--entire-thread.

I'll be glad if you have any comments to share.

-Carl

commit e1cb6126cc7f66cf71df8880c798f4d0f9d2e411
Author: Carl Worth 
Date:   Wed Dec 2 16:05:23 2009 -0800

notmuch show: Preserve thread-ordering and nesting without --entire-thread

When "notmuch show" was recently modified to not show an entire thread
by default, it also lost all capability to properly order the messages
in a thread and to print their proper depth. For example, the command:

notmuch show thread:6d5e3e276461188c5778c9f219f63782

had dramatically different output than:

notmuch show --entire-thread thread:6d5e3e276461188c5778c9f219f63782

even though both commands were selecting and displaying the same set
of messages. The first command would diplay them "flat", (all with
depth:0), and in strict date order; while the second command would
display them "nested" (with depth based on threading), and in thread
order.

We now fix "notmuch show" without the --entire-thread option to also
display nested and thread-ordered messages.

If some messages in the thread are not included in the displayed
results, then they are not counted when computing depth values.

diff --git a/notmuch-show.c b/notmuch-show.c
index 60339d0..376aacd 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -184,9 +184,12 @@ show_message (void *ctx, notmuch_message_t *message, int 
indent)


 static void
-show_messages (void *ctx, notmuch_messages_t *messages, int indent)
+show_messages (void *ctx, notmuch_messages_t *messages, int indent,
+  notmuch_bool_t entire_thread)
 {
 notmuch_message_t *message;
+notmuch_bool_t match;
+int next_indent;

 for (;
 notmuch_messages_has_more (messages);
@@ -194,9 +197,17 @@ show_messages (void *ctx, notmuch_messages_t *messages, 
int indent)
 {
message = notmuch_messages_get (messages);

-   show_message (ctx, message, indent);
+   match = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH);

-   show_messages (ctx, notmuch_message_get_replies (message), indent + 1);
+   next_indent = indent;
+
+   if (match || entire_thread) {
+   show_message (ctx, message, indent);
+   next_indent = indent + 1;
+   }
+
+   show_messages (ctx, notmuch_message_get_replies (message),
+  next_indent, entire_thread);

notmuch_message_destroy (message);
 }
@@ -257,29 +268,21 @@ notmuch_show_command (void *ctx, unused (int argc), 
unused (char *argv[]))
return 1;
 }

-if (!entire_thread) {
-   messages = notmuch_query_search_messages (query);
-   if (messages == NULL)
-   INTERNAL_ERROR ("No messages.\n");
-   show_messages (ctx, messages, 0);
-
-} else {
-   for (threads = notmuch_query_search_threads (query);
-   notmuch_threads_has_more (threads);
-   notmuch_threads_advance (threads))
-   {
-   thread = notmuch_threads_get (threads);
+for (threads = notmuch_query_search_threads (query);
+notmuch_threads_has_more (threads);
+notmuch_threads_advance (threads))
+{
+   thread = notmuch_threads_get (threads);

-   messages = notmuch_thread_get_toplevel_messages (thread);
+   messages = notmuch_thread_get_toplevel_messages (thread);

-   if (messages == NULL)
-   INTERNAL_ERROR ("Thread %s has no toplevel messages.\n",
-   notmuch_thread_get_thread_id (thread));
+   if (messages == NULL)
+   INTERNAL_ERROR ("Thread %s has no toplevel messages.\n",
+   notmuch_thread_get_thread_id (thread));

-   show_messages (ctx, messages, 

[notmuch] [PATCH 1/2] notmuch-show: limit display to only matching messages

2009-11-27 Thread Bart Trojanowski
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 --only-matching-messages 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 
---
 notmuch-show.c |   48 +---
 notmuch.c  |8 
 2 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/notmuch-show.c b/notmuch-show.c
index 13c91e4..60339d0 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -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);
diff --git a/notmuch.c b/notmuch.c
index 5b0284c..ea67b4f 100644
--- 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"
-- 
1.6.4.4.2.gc2f148