From: Michal Sojka Date: Wed, 5 Nov 2014 00:25:53 +0000 (+0100) Subject: cli: search: Split notmuch_search_command to smaller functions X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=f0dfceaf902681e7d5fd56a3c272a17a71996141;p=notmuch.git cli: search: Split notmuch_search_command to smaller functions In a subsequent commit, these functions will be used to share some functionality between search and address commands. --- diff --git a/notmuch-search.c b/notmuch-search.c index 6765a166..f1153594 100644 --- a/notmuch-search.c +++ b/notmuch-search.c @@ -471,69 +471,12 @@ do_search_tags (const search_context_t *ctx) return 0; } -int -notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) +static int +_notmuch_search_prepare (search_context_t *ctx, 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; char *query_str; - int opt_index, ret; unsigned int i; - 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, ¬much_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 } } }, - { NOTMUCH_OPT_KEYWORD, &ctx->exclude, "exclude", 'x', - (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE }, - { "false", NOTMUCH_EXCLUDE_FALSE }, - { "flag", NOTMUCH_EXCLUDE_FLAG }, - { "all", NOTMUCH_EXCLUDE_ALL }, - { 0, 0 } } }, - { NOTMUCH_OPT_INT, &ctx->offset, "offset", 'O', 0 }, - { NOTMUCH_OPT_INT, &ctx->limit, "limit", 'L', 0 }, - { NOTMUCH_OPT_INT, &ctx->dupe, "duplicate", 'D', 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_SUMMARY; - - if (ctx->output != OUTPUT_FILES && ctx->output != OUTPUT_MESSAGES && - ctx->dupe != -1) { - fprintf (stderr, "Error: --duplicate=N is only supported with --output=files and --output=messages.\n"); - return EXIT_FAILURE; - } - switch (ctx->format_sel) { case NOTMUCH_FORMAT_TEXT: ctx->format = sprinter_text_create (config, stdout); @@ -562,7 +505,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) NOTMUCH_DATABASE_MODE_READ_ONLY, &ctx->notmuch)) return EXIT_FAILURE; - query_str = query_string_from_args (ctx->notmuch, argc-opt_index, argv+opt_index); + query_str = query_string_from_args (ctx->notmuch, argc, argv); if (query_str == NULL) { fprintf (stderr, "Out of memory.\n"); return EXIT_FAILURE; @@ -599,6 +542,83 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) notmuch_query_set_omit_excluded (ctx->query, ctx->exclude); } + return 0; +} + +static void +_notmuch_search_cleanup (search_context_t *ctx) +{ + notmuch_query_destroy (ctx->query); + notmuch_database_destroy (ctx->notmuch); + + talloc_free (ctx->format); +} + +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, ¬much_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 } } }, + { NOTMUCH_OPT_KEYWORD, &ctx->exclude, "exclude", 'x', + (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE }, + { "false", NOTMUCH_EXCLUDE_FALSE }, + { "flag", NOTMUCH_EXCLUDE_FLAG }, + { "all", NOTMUCH_EXCLUDE_ALL }, + { 0, 0 } } }, + { NOTMUCH_OPT_INT, &ctx->offset, "offset", 'O', 0 }, + { NOTMUCH_OPT_INT, &ctx->limit, "limit", 'L', 0 }, + { NOTMUCH_OPT_INT, &ctx->dupe, "duplicate", 'D', 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_SUMMARY; + + if (ctx->output != OUTPUT_FILES && ctx->output != OUTPUT_MESSAGES && + ctx->dupe != -1) { + fprintf (stderr, "Error: --duplicate=N is only supported with --output=files and --output=messages.\n"); + return EXIT_FAILURE; + } + + if (_notmuch_search_prepare (ctx, config, + argc - opt_index, argv + opt_index)) + return EXIT_FAILURE; + if (ctx->output == OUTPUT_SUMMARY || ctx->output == OUTPUT_THREADS) ret = do_search_threads (ctx); @@ -613,10 +633,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) ret = 1; } - notmuch_query_destroy (ctx->query); - notmuch_database_destroy (ctx->notmuch); - - talloc_free (ctx->format); + _notmuch_search_cleanup (ctx); return ret ? EXIT_FAILURE : EXIT_SUCCESS; }