cli: search: Split notmuch_search_command to smaller functions
authorMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 5 Nov 2014 00:25:53 +0000 (01:25 +0100)
committerDavid Bremner <david@tethera.net>
Wed, 5 Nov 2014 22:14:24 +0000 (23:14 +0100)
In a subsequent commit, these functions will be used to share some
functionality between search and address commands.

notmuch-search.c

index 6765a166357cb649ea64fb2d730448a170ed05b1..f11535942d566e4e386008b2adcbefa2cc318ec7 100644 (file)
@@ -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, &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 } } },
-        { 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, &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 } } },
+        { 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;
 }