From e5a03354294fb9d2ddcc8c03459fc2e347bd0ec1 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Thu, 3 Sep 2015 22:39:59 +0300 Subject: [PATCH] cli: add support for not deduplicating notmuch address results Make it possible to use notmuch address as part of a | sort | uniq -c pipe instead of forcing --output=count. This is useful for combining results from multiple notmuch address queries. --- notmuch-search.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/notmuch-search.c b/notmuch-search.c index 3c455bfe..966c310f 100644 --- a/notmuch-search.c +++ b/notmuch-search.c @@ -36,6 +36,11 @@ typedef enum { OUTPUT_COUNT = 1 << 7, } output_t; +typedef enum { + DEDUP_NONE, + DEDUP_MAILBOX, +} dedup_t; + typedef enum { NOTMUCH_FORMAT_JSON, NOTMUCH_FORMAT_TEXT, @@ -55,6 +60,7 @@ typedef struct { int limit; int dupe; GHashTable *addresses; + dedup_t dedup; } search_context_t; typedef struct { @@ -356,7 +362,9 @@ process_address_list (const search_context_t *ctx, .count = 0, }; - if (is_duplicate (ctx, mbx.name, mbx.addr)) + /* OUTPUT_COUNT only works with deduplication */ + if (ctx->dedup != DEDUP_NONE && + is_duplicate (ctx, mbx.name, mbx.addr)) continue; if (ctx->output & OUTPUT_COUNT) @@ -659,6 +667,7 @@ static search_context_t search_context = { .offset = 0, .limit = -1, /* unlimited */ .dupe = -1, + .dedup = DEDUP_MAILBOX, }; static const notmuch_opt_desc_t common_options[] = { @@ -758,6 +767,10 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[]) (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE }, { "false", NOTMUCH_EXCLUDE_FALSE }, { 0, 0 } } }, + { NOTMUCH_OPT_KEYWORD, &ctx->dedup, "deduplicate", 'D', + (notmuch_keyword_t []){ { "no", DEDUP_NONE }, + { "mailbox", DEDUP_MAILBOX }, + { 0, 0 } } }, { NOTMUCH_OPT_INHERIT, (void *) &common_options, NULL, 0, 0 }, { NOTMUCH_OPT_INHERIT, (void *) ¬much_shared_options, NULL, 0, 0 }, { 0, 0, 0, 0, 0 } @@ -772,6 +785,11 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[]) if (! (ctx->output & (OUTPUT_SENDER | OUTPUT_RECIPIENTS))) ctx->output |= OUTPUT_SENDER; + if (ctx->output & OUTPUT_COUNT && ctx->dedup == DEDUP_NONE) { + fprintf (stderr, "--output=count is not applicable with --deduplicate=no\n"); + return EXIT_FAILURE; + } + if (_notmuch_search_prepare (ctx, config, argc - opt_index, argv + opt_index)) return EXIT_FAILURE;