X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-show.c;h=3b6667c4bdbd5d411fc35dabbe40bce8bc74d19b;hp=0bf5e219c86d7a79823400a5ef8bbeacb40a1be7;hb=6f7469f54744656f90ce215f365d5731e16acd3c;hpb=ea4fd50f45b0bc0888070125c632ea2326eb18f7 diff --git a/notmuch-show.c b/notmuch-show.c index 0bf5e219..3b6667c4 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -26,10 +26,7 @@ format_part_text (const void *ctx, mime_node_t *node, int indent, const notmuch_show_params_t *params); static const notmuch_show_format_t format_text = { - .message_set_start = "", .part = format_part_text, - .message_set_sep = "", - .message_set_end = "" }; static notmuch_status_t @@ -48,10 +45,7 @@ format_part_mbox (const void *ctx, mime_node_t *node, int indent, const notmuch_show_params_t *params); static const notmuch_show_format_t format_mbox = { - .message_set_start = "", .part = format_part_mbox, - .message_set_sep = "", - .message_set_end = "" }; static notmuch_status_t @@ -60,10 +54,7 @@ format_part_raw (unused (const void *ctx), mime_node_t *node, unused (const notmuch_show_params_t *params)); static const notmuch_show_format_t format_raw = { - .message_set_start = "", .part = format_part_raw, - .message_set_sep = "", - .message_set_end = "" }; static const char * @@ -815,46 +806,20 @@ show_message (void *ctx, int indent, notmuch_show_params_t *params) { - if (format->part) { - void *local = talloc_new (ctx); - mime_node_t *root, *part; - notmuch_status_t status; - - status = mime_node_open (local, message, params->cryptoctx, - params->decrypt, &root); - if (status) - goto DONE; - part = mime_node_seek_dfs (root, (params->part < 0 ? 0 : params->part)); - if (part) - status = format->part (local, part, indent, params); - DONE: - talloc_free (local); - return status; - } - - if (params->part <= 0) { - fputs (format->message_start, stdout); - if (format->message) - format->message(ctx, message, indent); - - fputs (format->header_start, stdout); - if (format->header) - format->header(ctx, message); - fputs (format->header_end, stdout); - - fputs (format->body_start, stdout); - } - - if (format->part_content) - show_message_body (message, format, params); - - if (params->part <= 0) { - fputs (format->body_end, stdout); - - fputs (format->message_end, stdout); - } + void *local = talloc_new (ctx); + mime_node_t *root, *part; + notmuch_status_t status; - return NOTMUCH_STATUS_SUCCESS; + status = mime_node_open (local, message, params->cryptoctx, + params->decrypt, &root); + if (status) + goto DONE; + part = mime_node_seek_dfs (root, (params->part < 0 ? 0 : params->part)); + if (part) + status = format->part (local, part, indent, params); + DONE: + talloc_free (local); + return status; } static notmuch_status_t @@ -866,35 +831,39 @@ 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; - fputs (format->message_set_start, stdout); + if (format->message_set_start) + fputs (format->message_set_start, stdout); for (; notmuch_messages_valid (messages); notmuch_messages_move_to_next (messages)) { - if (!first_set) + if (!first_set && format->message_set_sep) fputs (format->message_set_sep, stdout); first_set = 0; - fputs (format->message_set_start, stdout); + if (format->message_set_start) + fputs (format->message_set_start, stdout); 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; next_indent = indent + 1; - if (!status) + if (!status && format->message_set_sep) fputs (format->message_set_sep, stdout); } @@ -908,10 +877,12 @@ show_messages (void *ctx, notmuch_message_destroy (message); - fputs (format->message_set_end, stdout); + if (format->message_set_end) + fputs (format->message_set_end, stdout); } - fputs (format->message_set_end, stdout); + if (format->message_set_end) + fputs (format->message_set_end, stdout); return res; } @@ -957,7 +928,8 @@ do_show (void *ctx, int first_toplevel = 1; notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS; - fputs (format->message_set_start, stdout); + if (format->message_set_start) + fputs (format->message_set_start, stdout); for (threads = notmuch_query_search_threads (query); notmuch_threads_valid (threads); @@ -971,7 +943,7 @@ do_show (void *ctx, INTERNAL_ERROR ("Thread %s has no toplevel messages.\n", notmuch_thread_get_thread_id (thread)); - if (!first_toplevel) + if (!first_toplevel && format->message_set_sep) fputs (format->message_set_sep, stdout); first_toplevel = 0; @@ -983,7 +955,8 @@ do_show (void *ctx, } - fputs (format->message_set_end, stdout); + if (format->message_set_end) + fputs (format->message_set_end, stdout); return res != NOTMUCH_STATUS_SUCCESS; } @@ -996,6 +969,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 +984,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 +996,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,31 +1092,32 @@ 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); + notmuch_database_destroy (notmuch); if (params.cryptoctx) g_object_unref(params.cryptoctx);