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.
This commit is contained in:
Jani Nikula 2015-09-03 22:39:59 +03:00 committed by David Bremner
parent 19ea288679
commit e5a0335429

View file

@ -36,6 +36,11 @@ typedef enum {
OUTPUT_COUNT = 1 << 7, OUTPUT_COUNT = 1 << 7,
} output_t; } output_t;
typedef enum {
DEDUP_NONE,
DEDUP_MAILBOX,
} dedup_t;
typedef enum { typedef enum {
NOTMUCH_FORMAT_JSON, NOTMUCH_FORMAT_JSON,
NOTMUCH_FORMAT_TEXT, NOTMUCH_FORMAT_TEXT,
@ -55,6 +60,7 @@ typedef struct {
int limit; int limit;
int dupe; int dupe;
GHashTable *addresses; GHashTable *addresses;
dedup_t dedup;
} search_context_t; } search_context_t;
typedef struct { typedef struct {
@ -356,7 +362,9 @@ process_address_list (const search_context_t *ctx,
.count = 0, .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; continue;
if (ctx->output & OUTPUT_COUNT) if (ctx->output & OUTPUT_COUNT)
@ -659,6 +667,7 @@ static search_context_t search_context = {
.offset = 0, .offset = 0,
.limit = -1, /* unlimited */ .limit = -1, /* unlimited */
.dupe = -1, .dupe = -1,
.dedup = DEDUP_MAILBOX,
}; };
static const notmuch_opt_desc_t common_options[] = { 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 }, (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
{ "false", NOTMUCH_EXCLUDE_FALSE }, { "false", NOTMUCH_EXCLUDE_FALSE },
{ 0, 0 } } }, { 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 *) &common_options, NULL, 0, 0 },
{ NOTMUCH_OPT_INHERIT, (void *) &notmuch_shared_options, NULL, 0, 0 }, { NOTMUCH_OPT_INHERIT, (void *) &notmuch_shared_options, NULL, 0, 0 },
{ 0, 0, 0, 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))) if (! (ctx->output & (OUTPUT_SENDER | OUTPUT_RECIPIENTS)))
ctx->output |= OUTPUT_SENDER; 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, if (_notmuch_search_prepare (ctx, config,
argc - opt_index, argv + opt_index)) argc - opt_index, argv + opt_index))
return EXIT_FAILURE; return EXIT_FAILURE;