aboutsummaryrefslogtreecommitdiff
path: root/notmuch-search.c
diff options
context:
space:
mode:
authorMichal Sojka <sojkam1@fel.cvut.cz>2014-11-05 01:25:55 +0100
committerDavid Bremner <david@tethera.net>2014-11-05 23:19:12 +0100
commit5c27136e64dab2f90995de0bfa37c54186a2fae1 (patch)
treeef2c628927a1498a5a7c0954985edc4fcaf5ad31 /notmuch-search.c
parent4387112de00d27e6957ca2b6a268242f0bb5c756 (diff)
cli: Introduce "notmuch address" command
This moves address-related functionality from search command to the new address command. The implementation shares almost all code and some command line options. Options --offset and --limit were intentionally not included in the address command, because they refer to messages numbers, which users do not see in the output. This could confuse users because, for example, they could see more addresses in the output that what was specified with --limit. This functionality can be correctly reimplemented for address subcommand later. Also useless values of --exclude flag were not included in the address command. This was inspired by a patch from Jani Nikula.
Diffstat (limited to 'notmuch-search.c')
-rw-r--r--notmuch-search.c93
1 files changed, 67 insertions, 26 deletions
diff --git a/notmuch-search.c b/notmuch-search.c
index f1153594..69938d67 100644
--- a/notmuch-search.c
+++ b/notmuch-search.c
@@ -23,17 +23,18 @@
#include "string-util.h"
typedef enum {
+ /* Search command */
OUTPUT_SUMMARY = 1 << 0,
OUTPUT_THREADS = 1 << 1,
OUTPUT_MESSAGES = 1 << 2,
OUTPUT_FILES = 1 << 3,
OUTPUT_TAGS = 1 << 4,
+
+ /* Address command */
OUTPUT_SENDER = 1 << 5,
OUTPUT_RECIPIENTS = 1 << 6,
} output_t;
-#define OUTPUT_ADDRESS_FLAGS (OUTPUT_SENDER | OUTPUT_RECIPIENTS)
-
typedef enum {
NOTMUCH_FORMAT_JSON,
NOTMUCH_FORMAT_TEXT,
@@ -554,39 +555,42 @@ _notmuch_search_cleanup (search_context_t *ctx)
talloc_free (ctx->format);
}
+static search_context_t search_context = {
+ .format_sel = NOTMUCH_FORMAT_TEXT,
+ .exclude = NOTMUCH_EXCLUDE_TRUE,
+ .sort = NOTMUCH_SORT_NEWEST_FIRST,
+ .output = 0,
+ .offset = 0,
+ .limit = -1, /* unlimited */
+ .dupe = -1,
+};
+
+static const notmuch_opt_desc_t common_options[] = {
+ { NOTMUCH_OPT_KEYWORD, &search_context.sort, "sort", 's',
+ (notmuch_keyword_t []){ { "oldest-first", NOTMUCH_SORT_OLDEST_FIRST },
+ { "newest-first", NOTMUCH_SORT_NEWEST_FIRST },
+ { 0, 0 } } },
+ { NOTMUCH_OPT_KEYWORD, &search_context.format_sel, "format", 'f',
+ (notmuch_keyword_t []){ { "json", NOTMUCH_FORMAT_JSON },
+ { "sexp", NOTMUCH_FORMAT_SEXP },
+ { "text", NOTMUCH_FORMAT_TEXT },
+ { "text0", NOTMUCH_FORMAT_TEXT0 },
+ { 0, 0 } } },
+ { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 0, 0 },
+ { 0, 0, 0, 0, 0 }
+};
+
int
notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
{
- search_context_t search_context = {
- .format_sel = NOTMUCH_FORMAT_TEXT,
- .exclude = NOTMUCH_EXCLUDE_TRUE,
- .sort = NOTMUCH_SORT_NEWEST_FIRST,
- .output = 0,
- .offset = 0,
- .limit = -1, /* unlimited */
- .dupe = -1,
- };
search_context_t *ctx = &search_context;
int opt_index, ret;
notmuch_opt_desc_t options[] = {
- { NOTMUCH_OPT_KEYWORD, &ctx->sort, "sort", 's',
- (notmuch_keyword_t []){ { "oldest-first", NOTMUCH_SORT_OLDEST_FIRST },
- { "newest-first", NOTMUCH_SORT_NEWEST_FIRST },
- { 0, 0 } } },
- { NOTMUCH_OPT_KEYWORD, &ctx->format_sel, "format", 'f',
- (notmuch_keyword_t []){ { "json", NOTMUCH_FORMAT_JSON },
- { "sexp", NOTMUCH_FORMAT_SEXP },
- { "text", NOTMUCH_FORMAT_TEXT },
- { "text0", NOTMUCH_FORMAT_TEXT0 },
- { 0, 0 } } },
- { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 0, 0 },
{ NOTMUCH_OPT_KEYWORD_FLAGS, &ctx->output, "output", 'o',
(notmuch_keyword_t []){ { "summary", OUTPUT_SUMMARY },
{ "threads", OUTPUT_THREADS },
{ "messages", OUTPUT_MESSAGES },
- { "sender", OUTPUT_SENDER },
- { "recipients", OUTPUT_RECIPIENTS },
{ "files", OUTPUT_FILES },
{ "tags", OUTPUT_TAGS },
{ 0, 0 } } },
@@ -599,6 +603,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
{ NOTMUCH_OPT_INT, &ctx->offset, "offset", 'O', 0 },
{ NOTMUCH_OPT_INT, &ctx->limit, "limit", 'L', 0 },
{ NOTMUCH_OPT_INT, &ctx->dupe, "duplicate", 'D', 0 },
+ { NOTMUCH_OPT_INHERIT, &common_options, NULL, 0, 0 },
{ 0, 0, 0, 0, 0 }
};
@@ -623,8 +628,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
ctx->output == OUTPUT_THREADS)
ret = do_search_threads (ctx);
else if (ctx->output == OUTPUT_MESSAGES ||
- ctx->output == OUTPUT_FILES ||
- (ctx->output & OUTPUT_ADDRESS_FLAGS && !(ctx->output & ~OUTPUT_ADDRESS_FLAGS)))
+ ctx->output == OUTPUT_FILES)
ret = do_search_messages (ctx);
else if (ctx->output == OUTPUT_TAGS)
ret = do_search_tags (ctx);
@@ -637,3 +641,40 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
return ret ? EXIT_FAILURE : EXIT_SUCCESS;
}
+
+int
+notmuch_address_command (notmuch_config_t *config, int argc, char *argv[])
+{
+ search_context_t *ctx = &search_context;
+ int opt_index, ret;
+
+ notmuch_opt_desc_t options[] = {
+ { NOTMUCH_OPT_KEYWORD_FLAGS, &ctx->output, "output", 'o',
+ (notmuch_keyword_t []){ { "sender", OUTPUT_SENDER },
+ { "recipients", OUTPUT_RECIPIENTS },
+ { 0, 0 } } },
+ { NOTMUCH_OPT_KEYWORD, &ctx->exclude, "exclude", 'x',
+ (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
+ { "false", NOTMUCH_EXCLUDE_FALSE },
+ { 0, 0 } } },
+ { NOTMUCH_OPT_INHERIT, &common_options, NULL, 0, 0 },
+ { 0, 0, 0, 0, 0 }
+ };
+
+ opt_index = parse_arguments (argc, argv, options, 1);
+ if (opt_index < 0)
+ return EXIT_FAILURE;
+
+ if (! ctx->output)
+ ctx->output = OUTPUT_SENDER | OUTPUT_RECIPIENTS;
+
+ if (_notmuch_search_prepare (ctx, config,
+ argc - opt_index, argv + opt_index))
+ return EXIT_FAILURE;
+
+ ret = do_search_messages (ctx);
+
+ _notmuch_search_cleanup (ctx);
+
+ return ret ? EXIT_FAILURE : EXIT_SUCCESS;
+}