From e3dd7d5f7bf4d740a57327ece304e0f7f28c7c4f Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Sun, 2 Nov 2014 01:49:54 +0100 Subject: [PATCH] [PATCH 04/10] cli: search: Split notmuch_search_command to smaller functions --- 89/66aeb8ec60356918ab5ea5173dd23970d30614 | 255 ++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 89/66aeb8ec60356918ab5ea5173dd23970d30614 diff --git a/89/66aeb8ec60356918ab5ea5173dd23970d30614 b/89/66aeb8ec60356918ab5ea5173dd23970d30614 new file mode 100644 index 000000000..f729a47f3 --- /dev/null +++ b/89/66aeb8ec60356918ab5ea5173dd23970d30614 @@ -0,0 +1,255 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id C700D431FAF + for ; Sat, 1 Nov 2014 17:50:32 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -2.3 +X-Spam-Level: +X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id IrgtC7o427SU for ; + Sat, 1 Nov 2014 17:50:27 -0700 (PDT) +Received: from max.feld.cvut.cz (max.feld.cvut.cz [147.32.192.36]) + by olra.theworths.org (Postfix) with ESMTP id 7F7CE431FDE + for ; Sat, 1 Nov 2014 17:50:15 -0700 (PDT) +Received: from localhost (unknown [192.168.200.7]) + by max.feld.cvut.cz (Postfix) with ESMTP id 48A295CD288 + for ; Sun, 2 Nov 2014 01:50:11 +0100 (CET) +X-Virus-Scanned: IMAP STYX AMAVIS +Received: from max.feld.cvut.cz ([192.168.200.1]) + by localhost (styx.feld.cvut.cz [192.168.200.7]) (amavisd-new, + port 10044) with ESMTP id hik63zmFrO9m for ; + Sun, 2 Nov 2014 01:50:06 +0100 (CET) +Received: from imap.feld.cvut.cz (imap.feld.cvut.cz [147.32.192.34]) + by max.feld.cvut.cz (Postfix) with ESMTP id 7B9EF5CD28B + for ; Sun, 2 Nov 2014 01:50:06 +0100 (CET) +Received: from wsh by steelpick.2x.cz with local (Exim 4.84) + (envelope-from ) + id 1XkjMq-000851-FZ; Sun, 02 Nov 2014 01:50:04 +0100 +From: Michal Sojka +To: notmuch@notmuchmail.org +Subject: [PATCH 04/10] cli: search: Split notmuch_search_command to smaller + functions +Date: Sun, 2 Nov 2014 01:49:54 +0100 +Message-Id: <1414889400-30977-5-git-send-email-sojkam1@fel.cvut.cz> +X-Mailer: git-send-email 2.1.1 +In-Reply-To: <1414889400-30977-1-git-send-email-sojkam1@fel.cvut.cz> +References: <1414889400-30977-1-git-send-email-sojkam1@fel.cvut.cz> +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Sun, 02 Nov 2014 00:50:33 -0000 + +In the next commit, these functions will be used to share some +functionality between search and address commands. +--- + notmuch-search.c | 155 ++++++++++++++++++++++++++++++------------------------- + 1 file changed, 86 insertions(+), 69 deletions(-) + +diff --git a/notmuch-search.c b/notmuch-search.c +index ad7a92a..d7e64eb 100644 +--- a/notmuch-search.c ++++ b/notmuch-search.c +@@ -450,6 +450,89 @@ do_search_tags (const search_context_t *ctx) + return 0; + } + ++static int ++_notmuch_search_prepare (search_context_t *ctx, notmuch_config_t *config, int argc, char *argv[]) ++{ ++ char *query_str; ++ unsigned int i; ++ ++ switch (ctx->format_sel) { ++ case NOTMUCH_FORMAT_TEXT: ++ ctx->format = sprinter_text_create (config, stdout); ++ break; ++ case NOTMUCH_FORMAT_TEXT0: ++ if (ctx->output == OUTPUT_SUMMARY) { ++ fprintf (stderr, "Error: --format=text0 is not compatible with --output=summary.\n"); ++ return EXIT_FAILURE; ++ } ++ ctx->format = sprinter_text0_create (config, stdout); ++ break; ++ case NOTMUCH_FORMAT_JSON: ++ ctx->format = sprinter_json_create (config, stdout); ++ break; ++ case NOTMUCH_FORMAT_SEXP: ++ ctx->format = sprinter_sexp_create (config, stdout); ++ break; ++ default: ++ /* this should never happen */ ++ INTERNAL_ERROR("no output format selected"); ++ } ++ ++ notmuch_exit_if_unsupported_format (); ++ ++ if (notmuch_database_open (notmuch_config_get_database_path (config), ++ NOTMUCH_DATABASE_MODE_READ_ONLY, &ctx->notmuch)) ++ return EXIT_FAILURE; ++ ++ query_str = query_string_from_args (ctx->notmuch, argc, argv); ++ if (query_str == NULL) { ++ fprintf (stderr, "Out of memory.\n"); ++ return EXIT_FAILURE; ++ } ++ if (*query_str == '\0') { ++ fprintf (stderr, "Error: notmuch search requires at least one search term.\n"); ++ return EXIT_FAILURE; ++ } ++ ++ ctx->query = notmuch_query_create (ctx->notmuch, query_str); ++ if (ctx->query == NULL) { ++ fprintf (stderr, "Out of memory\n"); ++ return EXIT_FAILURE; ++ } ++ ++ notmuch_query_set_sort (ctx->query, ctx->sort); ++ ++ if (ctx->exclude == NOTMUCH_EXCLUDE_FLAG && ctx->output != OUTPUT_SUMMARY) { ++ /* If we are not doing summary output there is nowhere to ++ * print the excluded flag so fall back on including the ++ * excluded messages. */ ++ fprintf (stderr, "Warning: this output format cannot flag excluded messages.\n"); ++ ctx->exclude = NOTMUCH_EXCLUDE_FALSE; ++ } ++ ++ if (ctx->exclude != NOTMUCH_EXCLUDE_FALSE) { ++ const char **search_exclude_tags; ++ size_t search_exclude_tags_length; ++ ++ 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 (ctx->query, search_exclude_tags[i]); ++ 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[]) + { +@@ -463,9 +546,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) + .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', +@@ -507,71 +588,10 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) + if (! ctx->output) + ctx->output = OUTPUT_SUMMARY; + +- switch (ctx->format_sel) { +- case NOTMUCH_FORMAT_TEXT: +- ctx->format = sprinter_text_create (config, stdout); +- break; +- case NOTMUCH_FORMAT_TEXT0: +- if (ctx->output == OUTPUT_SUMMARY) { +- fprintf (stderr, "Error: --format=text0 is not compatible with --output=summary.\n"); +- return EXIT_FAILURE; +- } +- ctx->format = sprinter_text0_create (config, stdout); +- break; +- case NOTMUCH_FORMAT_JSON: +- ctx->format = sprinter_json_create (config, stdout); +- break; +- case NOTMUCH_FORMAT_SEXP: +- ctx->format = sprinter_sexp_create (config, stdout); +- break; +- default: +- /* this should never happen */ +- INTERNAL_ERROR("no output format selected"); +- } +- +- notmuch_exit_if_unsupported_format (); +- +- if (notmuch_database_open (notmuch_config_get_database_path (config), +- NOTMUCH_DATABASE_MODE_READ_ONLY, &ctx->notmuch)) ++ if (_notmuch_search_prepare (ctx, config, ++ argc - opt_index, argv + opt_index)) + return EXIT_FAILURE; + +- query_str = query_string_from_args (ctx->notmuch, argc-opt_index, argv+opt_index); +- if (query_str == NULL) { +- fprintf (stderr, "Out of memory.\n"); +- return EXIT_FAILURE; +- } +- if (*query_str == '\0') { +- fprintf (stderr, "Error: notmuch search requires at least one search term.\n"); +- return EXIT_FAILURE; +- } +- +- ctx->query = notmuch_query_create (ctx->notmuch, query_str); +- if (ctx->query == NULL) { +- fprintf (stderr, "Out of memory\n"); +- return EXIT_FAILURE; +- } +- +- notmuch_query_set_sort (ctx->query, ctx->sort); +- +- if (ctx->exclude == NOTMUCH_EXCLUDE_FLAG && ctx->output != OUTPUT_SUMMARY) { +- /* If we are not doing summary output there is nowhere to +- * print the excluded flag so fall back on including the +- * excluded messages. */ +- fprintf (stderr, "Warning: this output format cannot flag excluded messages.\n"); +- ctx->exclude = NOTMUCH_EXCLUDE_FALSE; +- } +- +- if (ctx->exclude != NOTMUCH_EXCLUDE_FALSE) { +- const char **search_exclude_tags; +- size_t search_exclude_tags_length; +- +- 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 (ctx->query, search_exclude_tags[i]); +- notmuch_query_set_omit_excluded (ctx->query, ctx->exclude); +- } +- + if (ctx->output == OUTPUT_SUMMARY || + ctx->output == OUTPUT_THREADS) + ret = do_search_threads (ctx); +@@ -586,10 +606,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; + } +-- +2.1.1 + -- 2.26.2