Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 63096431FC3 for ; Fri, 27 Nov 2009 18:50:34 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WpuLtgmAkKha for ; Fri, 27 Nov 2009 18:50:33 -0800 (PST) Received: from tau.jukie.net (tau.jukie.net [216.239.93.128]) by olra.theworths.org (Postfix) with ESMTP id 25FBE431FAE for ; Fri, 27 Nov 2009 18:50:33 -0800 (PST) Received: from localhost.localdomain (oxygen.jukie.net [10.10.10.8]) by tau.jukie.net (Postfix) with ESMTP id 936BBC008F5; Fri, 27 Nov 2009 21:50:32 -0500 (EST) From: Bart Trojanowski To: notmuch@notmuchmail.org Date: Fri, 27 Nov 2009 21:49:39 -0500 Message-Id: <1259376580-934-1-git-send-email-bart@jukie.net> X-Mailer: git-send-email 1.6.4.4.2.gc2f148 In-Reply-To: <20091128022115.662B62053465E@oxygen.jukie.net> References: <20091128022115.662B62053465E@oxygen.jukie.net> Cc: Bart Trojanowski Subject: [notmuch] [PATCH 1/2] notmuch-show: limit display to only matching messages X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Nov 2009 02:50:34 -0000 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