cli: move show to the new --exclude= option naming scheme.

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.
This commit is contained in:
Mark Walters 2012-04-07 17:10:06 +01:00 committed by David Bremner
parent fd62a25f91
commit 903327279c
3 changed files with 45 additions and 20 deletions

View file

@ -135,9 +135,21 @@ content.
.RS 4 .RS 4
.TP 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 .RE
A common use of A common use of

View file

@ -99,6 +99,7 @@ typedef struct notmuch_show_format {
typedef struct notmuch_show_params { typedef struct notmuch_show_params {
notmuch_bool_t entire_thread; notmuch_bool_t entire_thread;
notmuch_bool_t omit_excluded;
notmuch_bool_t raw; notmuch_bool_t raw;
int part; int part;
#ifdef GMIME_ATLEAST_26 #ifdef GMIME_ATLEAST_26

View file

@ -866,6 +866,7 @@ show_messages (void *ctx,
{ {
notmuch_message_t *message; notmuch_message_t *message;
notmuch_bool_t match; notmuch_bool_t match;
notmuch_bool_t excluded;
int first_set = 1; int first_set = 1;
int next_indent; int next_indent;
notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS; notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS;
@ -885,10 +886,11 @@ show_messages (void *ctx,
message = notmuch_messages_get (messages); message = notmuch_messages_get (messages);
match = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH); match = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH);
excluded = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED);
next_indent = indent; 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); status = show_message (ctx, format, message, indent, params);
if (status && !res) if (status && !res)
res = status; res = status;
@ -996,6 +998,12 @@ enum {
NOTMUCH_FORMAT_RAW NOTMUCH_FORMAT_RAW
}; };
/* The following is to allow future options to be added more easily */
enum {
EXCLUDE_TRUE,
EXCLUDE_FALSE,
};
int int
notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) 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; char *query_string;
int opt_index, ret; int opt_index, ret;
const notmuch_show_format_t *format = &format_text; 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; int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;
notmuch_bool_t verify = FALSE; notmuch_bool_t verify = FALSE;
notmuch_bool_t no_exclude = FALSE; int exclude = EXCLUDE_TRUE;
notmuch_opt_desc_t options[] = { notmuch_opt_desc_t options[] = {
{ NOTMUCH_OPT_KEYWORD, &format_sel, "format", 'f', { 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 }, { "mbox", NOTMUCH_FORMAT_MBOX },
{ "raw", NOTMUCH_FORMAT_RAW }, { "raw", NOTMUCH_FORMAT_RAW },
{ 0, 0 } } }, { 0, 0 } } },
{ NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x',
(notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
{ "false", EXCLUDE_FALSE },
{ 0, 0 } } },
{ NOTMUCH_OPT_INT, &params.part, "part", 'p', 0 }, { NOTMUCH_OPT_INT, &params.part, "part", 'p', 0 },
{ NOTMUCH_OPT_BOOLEAN, &params.entire_thread, "entire-thread", 't', 0 }, { NOTMUCH_OPT_BOOLEAN, &params.entire_thread, "entire-thread", 't', 0 },
{ NOTMUCH_OPT_BOOLEAN, &params.decrypt, "decrypt", 'd', 0 }, { NOTMUCH_OPT_BOOLEAN, &params.decrypt, "decrypt", 'd', 0 },
{ NOTMUCH_OPT_BOOLEAN, &verify, "verify", 'v', 0 }, { NOTMUCH_OPT_BOOLEAN, &verify, "verify", 'v', 0 },
{ NOTMUCH_OPT_BOOLEAN, &no_exclude, "no-exclude", 'n', 0 },
{ 0, 0, 0, 0, 0 } { 0, 0, 0, 0, 0 }
}; };
@ -1110,29 +1121,30 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
return 1; 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 a single message is requested we do not use search_excludes. */
if (params.part >= 0) if (params.part >= 0)
ret = do_show_single (ctx, query, format, &params); ret = do_show_single (ctx, query, format, &params);
else { else {
if (!no_exclude) { /* We always apply set the exclude flag. The
const char **search_exclude_tags; * exclude=true|false option controls whether or not we return
size_t search_exclude_tags_length; * threads that only match in an excluded message */
unsigned int i; const char **search_exclude_tags;
size_t search_exclude_tags_length;
unsigned int i;
search_exclude_tags = notmuch_config_get_search_exclude_tags search_exclude_tags = notmuch_config_get_search_exclude_tags
(config, &search_exclude_tags_length); (config, &search_exclude_tags_length);
for (i = 0; i < search_exclude_tags_length; i++) for (i = 0; i < search_exclude_tags_length; i++)
notmuch_query_add_tag_exclude (query, search_exclude_tags[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, &params); ret = do_show (ctx, query, format, &params);
} }
notmuch_query_destroy (query); notmuch_query_destroy (query);
notmuch_database_close (notmuch); notmuch_database_close (notmuch);