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 5E095431FD7 for ; Sat, 7 Apr 2012 09:10:45 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0.201 X-Spam-Level: X-Spam-Status: No, score=0.201 tagged_above=-999 required=5 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_ENVFROM_END_DIGIT=1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled 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 My8LXezaSLSu for ; Sat, 7 Apr 2012 09:10:43 -0700 (PDT) Received: from mail-we0-f181.google.com (mail-we0-f181.google.com [74.125.82.181]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id C077F431FAF for ; Sat, 7 Apr 2012 09:10:42 -0700 (PDT) Received: by mail-we0-f181.google.com with SMTP id m13so2289308wer.26 for ; Sat, 07 Apr 2012 09:10:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=sJInaK4MPwl719u/pQeaJN1jaTkMGa+HjYOfWYMFtaA=; b=S/WuNHC6npo6KbTzRorDv0l0Bn5BDBlADzTq/6os0qBIpNLRkRLWDk3+tya8ExS2UG Y8DVGNHKD7apt5iDebDBuL8MpSIZAZ5B/J3HMbY2xDp17P1tM5bMgxqw+e3nVI077/Tq 8h2cEsMxeWJxuNjdAHjcFNSvnZmVqUjQnAum8+8PtgpqeIwLfFXxCaMIhgHLzcukk8Dj 99Ox4cKj4efqlBXmHTbok7M0Lr0JCt4/QDQUgW81XT6Lp87q7X/AwcBhwj0LpgKvtY1V 57iWpm6xg/lqhLn3U9tVI2yM9x5sNh7wWyvxx491gnTbHixuDzcEIf5xOtGedyTNzcbp 3XAg== Received: by 10.180.95.197 with SMTP id dm5mr4027110wib.20.1333815042429; Sat, 07 Apr 2012 09:10:42 -0700 (PDT) Received: from localhost (94.197.17.51.threembb.co.uk. [94.197.17.51]) by mx.google.com with ESMTPS id fl2sm20624016wib.2.2012.04.07.09.10.40 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 07 Apr 2012 09:10:41 -0700 (PDT) From: Mark Walters To: notmuch@notmuchmail.org Subject: [PATCH v4 4/6] cli: move show to the new --exclude= option naming scheme. Date: Sat, 7 Apr 2012 17:10:06 +0100 Message-Id: <1333815008-24668-5-git-send-email-markwalters1009@gmail.com> X-Mailer: git-send-email 1.7.9.1 In-Reply-To: <1333815008-24668-1-git-send-email-markwalters1009@gmail.com> References: <1333815008-24668-1-git-send-email-markwalters1009@gmail.com> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 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, 07 Apr 2012 16:10:45 -0000 This moves notmuch show to the --exclude=(true|false) naming scheme. When exclude=false show returns all threads that match including those that only match in an excluded message. The excluded messages are flagged. When exclude=true the behaviour depends on whether --entire-thread is set. If it is not set then show only returns the messages which match and are not excluded. If it is set then show returns all messages in the threads that match in a non-excluded message, flagging the excluded messages in these threads. The rationale is that it is awkward to use a thread with some missing messages. --- man/man1/notmuch-show.1 | 16 +++++++++++++- notmuch-client.h | 1 + notmuch-show.c | 50 +++++++++++++++++++++++++++++----------------- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/man/man1/notmuch-show.1 b/man/man1/notmuch-show.1 index b81cce6..83cc575 100644 --- a/man/man1/notmuch-show.1 +++ b/man/man1/notmuch-show.1 @@ -135,9 +135,21 @@ content. .RS 4 .TP 4 -.B \-\-no-exclude +.BR \-\-exclude=(true|false) + +Specify whether to omit threads only matching search.tag_exclude from +the search results (the default) or not. In either case the excluded +message will be marked with the exclude flag (except when output=mbox +when there is nowhere to put the flag). + +If --entire-thread is specified then complete threads are returned +regardless (with the excluded flag being set when appropriate) but +threads that only match in an excluded message are not returned when +.B --exclude=true. + +The default is +.B --exclude=true. -Do not exclude the messages matching search.exclude_tags in the config file. .RE A common use of diff --git a/notmuch-client.h b/notmuch-client.h index 203ac49..880b153 100644 --- a/notmuch-client.h +++ b/notmuch-client.h @@ -99,6 +99,7 @@ typedef struct notmuch_show_format { typedef struct notmuch_show_params { notmuch_bool_t entire_thread; + notmuch_bool_t omit_excluded; notmuch_bool_t raw; int part; #ifdef GMIME_ATLEAST_26 diff --git a/notmuch-show.c b/notmuch-show.c index 0bf5e21..7af8e64 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -866,6 +866,7 @@ show_messages (void *ctx, { notmuch_message_t *message; notmuch_bool_t match; + notmuch_bool_t excluded; int first_set = 1; int next_indent; notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS; @@ -885,10 +886,11 @@ show_messages (void *ctx, message = notmuch_messages_get (messages); match = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH); + excluded = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED); next_indent = indent; - if (match || params->entire_thread) { + if ((match && (!excluded || !params->omit_excluded)) || params->entire_thread) { status = show_message (ctx, format, message, indent, params); if (status && !res) res = status; @@ -996,6 +998,12 @@ enum { NOTMUCH_FORMAT_RAW }; +/* The following is to allow future options to be added more easily */ +enum { + EXCLUDE_TRUE, + EXCLUDE_FALSE, +}; + int notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) { @@ -1005,10 +1013,10 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) char *query_string; int opt_index, ret; const notmuch_show_format_t *format = &format_text; - notmuch_show_params_t params = { .part = -1 }; + notmuch_show_params_t params = { .part = -1, .omit_excluded = TRUE }; int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED; notmuch_bool_t verify = FALSE; - notmuch_bool_t no_exclude = FALSE; + int exclude = EXCLUDE_TRUE; notmuch_opt_desc_t options[] = { { NOTMUCH_OPT_KEYWORD, &format_sel, "format", 'f', @@ -1017,11 +1025,14 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) { "mbox", NOTMUCH_FORMAT_MBOX }, { "raw", NOTMUCH_FORMAT_RAW }, { 0, 0 } } }, + { NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x', + (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE }, + { "false", EXCLUDE_FALSE }, + { 0, 0 } } }, { NOTMUCH_OPT_INT, ¶ms.part, "part", 'p', 0 }, { NOTMUCH_OPT_BOOLEAN, ¶ms.entire_thread, "entire-thread", 't', 0 }, { NOTMUCH_OPT_BOOLEAN, ¶ms.decrypt, "decrypt", 'd', 0 }, { NOTMUCH_OPT_BOOLEAN, &verify, "verify", 'v', 0 }, - { NOTMUCH_OPT_BOOLEAN, &no_exclude, "no-exclude", 'n', 0 }, { 0, 0, 0, 0, 0 } }; @@ -1110,29 +1121,30 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) return 1; } - /* if format=mbox then we can not output excluded messages as - * there is no way to make the exclude flag available */ - if (format_sel == NOTMUCH_FORMAT_MBOX) - notmuch_query_set_omit_excluded_messages (query, TRUE); - /* If a single message is requested we do not use search_excludes. */ if (params.part >= 0) ret = do_show_single (ctx, query, format, ¶ms); else { - if (!no_exclude) { - const char **search_exclude_tags; - size_t search_exclude_tags_length; - unsigned int i; - - search_exclude_tags = notmuch_config_get_search_exclude_tags - (config, &search_exclude_tags_length); - for (i = 0; i < search_exclude_tags_length; i++) - notmuch_query_add_tag_exclude (query, search_exclude_tags[i]); + /* We always apply set the exclude flag. The + * exclude=true|false option controls whether or not we return + * threads that only match in an excluded message */ + const char **search_exclude_tags; + size_t search_exclude_tags_length; + unsigned int i; + + search_exclude_tags = notmuch_config_get_search_exclude_tags + (config, &search_exclude_tags_length); + for (i = 0; i < search_exclude_tags_length; i++) + notmuch_query_add_tag_exclude (query, search_exclude_tags[i]); + + if (exclude == EXCLUDE_FALSE) { + notmuch_query_set_omit_excluded (query, FALSE); + params.omit_excluded = FALSE; } + ret = do_show (ctx, query, format, ¶ms); } - notmuch_query_destroy (query); notmuch_database_close (notmuch); -- 1.7.9.1