From 6e12ed37c20d13506558dd55e979fee9c2ce2df7 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Wed, 5 Nov 2014 01:25:53 +0100 Subject: [PATCH] [PATCH v3 04/10] cli: search: Split notmuch_search_command to smaller functions --- 27/27c7626ce404085a24a18f969b2cb8c9b14315 | 255 ++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 27/27c7626ce404085a24a18f969b2cb8c9b14315 diff --git a/27/27c7626ce404085a24a18f969b2cb8c9b14315 b/27/27c7626ce404085a24a18f969b2cb8c9b14315 new file mode 100644 index 000000000..476650312 --- /dev/null +++ b/27/27c7626ce404085a24a18f969b2cb8c9b14315 @@ -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 E138F431FC3 + for ; Tue, 4 Nov 2014 16:26:52 -0800 (PST) +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 WDPNgrM8VZtC for ; + Tue, 4 Nov 2014 16:26:47 -0800 (PST) +Received: from max.feld.cvut.cz (max.feld.cvut.cz [147.32.192.36]) + by olra.theworths.org (Postfix) with ESMTP id 0D058431FC7 + for ; Tue, 4 Nov 2014 16:26:23 -0800 (PST) +Received: from localhost (unknown [192.168.200.7]) + by max.feld.cvut.cz (Postfix) with ESMTP id 735785CD1A6 + for ; Wed, 5 Nov 2014 01:26:22 +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 YLdHnPTDF5bR for ; + Wed, 5 Nov 2014 01:26:17 +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 27E315CD1AC + for ; Wed, 5 Nov 2014 01:26:14 +0100 (CET) +Received: from wsh by steelpick.2x.cz with local (Exim 4.84) + (envelope-from ) + id 1XloQI-0005Cu-R5; Wed, 05 Nov 2014 01:26:06 +0100 +From: Michal Sojka +To: notmuch@notmuchmail.org +Subject: [PATCH v3 04/10] cli: search: Split notmuch_search_command to smaller + functions +Date: Wed, 5 Nov 2014 01:25:53 +0100 +Message-Id: <1415147159-19946-5-git-send-email-sojkam1@fel.cvut.cz> +X-Mailer: git-send-email 2.1.1 +In-Reply-To: <1415147159-19946-1-git-send-email-sojkam1@fel.cvut.cz> +References: <1415147159-19946-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: Wed, 05 Nov 2014 00:26:53 -0000 + +In a subsequent 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 6765a16..f115359 100644 +--- a/notmuch-search.c ++++ b/notmuch-search.c +@@ -471,6 +471,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[]) + { +@@ -484,9 +567,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', +@@ -534,71 +615,10 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) + return EXIT_FAILURE; + } + +- 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); +@@ -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; + } +-- +2.1.1 + -- 2.26.2