On Fri, 27 Nov 2009 21:49:39 -0500, Bart Trojanowski <bart@jukie.net> 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 <cworth@cworth.org> 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, 0); + show_messages (ctx, messages, 0, entire_thread); - notmuch_thread_destroy (thread); - } + notmuch_thread_destroy (thread); } notmuch_query_destroy (query);