From acc6331baa41a8aa7025924c823251d8f8c3384f Mon Sep 17 00:00:00 2001 From: David Bremner Date: Tue, 22 Dec 2020 08:13:51 -0400 Subject: [PATCH] CLI/count: switch to new configuration framework The main effort is changing from the old argv style config list iterators to the new more opaque ones provided by the library (and backed by the database+file config cache). --- notmuch-count.c | 48 +++++++++++-------------- notmuch.c | 2 +- test/T035-read-config.sh | 75 ++++++++++++++++++++++++++++++++++++++++ test/T140-excludes.sh | 15 ++++++++ 4 files changed, 112 insertions(+), 28 deletions(-) create mode 100755 test/T035-read-config.sh diff --git a/notmuch-count.c b/notmuch-count.c index f752ef62..048b1f44 100644 --- a/notmuch-count.c +++ b/notmuch-count.c @@ -64,10 +64,9 @@ count_files (notmuch_query_t *query) /* return 0 on success, -1 on failure */ static int print_count (notmuch_database_t *notmuch, const char *query_str, - const char **exclude_tags, size_t exclude_tags_length, int output, int print_lastmod) + notmuch_config_values_t *exclude_tags, int output, int print_lastmod) { notmuch_query_t *query; - size_t i; int count; unsigned int ucount; unsigned long revision; @@ -81,13 +80,18 @@ print_count (notmuch_database_t *notmuch, const char *query_str, return -1; } - for (i = 0; i < exclude_tags_length; i++) { - status = notmuch_query_add_tag_exclude (query, exclude_tags[i]); - if (status && status != NOTMUCH_STATUS_IGNORED) { - print_status_query ("notmuch count", query, status); - return -1; + for (notmuch_config_values_start (exclude_tags); + notmuch_config_values_valid (exclude_tags); + notmuch_config_values_move_to_next (exclude_tags)) { + + status = notmuch_query_add_tag_exclude (query, + notmuch_config_values_get (exclude_tags)); + if (status && status != NOTMUCH_STATUS_IGNORED) { + print_status_query ("notmuch count", query, status); + ret = -1; + goto DONE; + } } - } switch (output) { case OUTPUT_MESSAGES: @@ -127,8 +131,8 @@ print_count (notmuch_database_t *notmuch, const char *query_str, } static int -count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags, - size_t exclude_tags_length, int output, int print_lastmod) +count_file (notmuch_database_t *notmuch, FILE *input, notmuch_config_values_t *exclude_tags, + int output, int print_lastmod) { char *line = NULL; ssize_t line_len; @@ -137,8 +141,7 @@ count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags, while (! ret && (line_len = getline (&line, &line_size, input)) != -1) { chomp_newline (line); - ret = print_count (notmuch, line, exclude_tags, exclude_tags_length, - output, print_lastmod); + ret = print_count (notmuch, line, exclude_tags, output, print_lastmod); } if (line) @@ -148,15 +151,13 @@ count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags, } int -notmuch_count_command (notmuch_config_t *config, unused(notmuch_database_t *notmuch), int argc, char *argv[]) +notmuch_count_command (unused(notmuch_config_t *config), notmuch_database_t *notmuch, int argc, char *argv[]) { - notmuch_database_t *notmuch; char *query_str; int opt_index; int output = OUTPUT_MESSAGES; bool exclude = true; - const char **search_exclude_tags = NULL; - size_t search_exclude_tags_length = 0; + notmuch_config_values_t *exclude_tags = NULL; bool batch = false; bool print_lastmod = false; FILE *input = stdin; @@ -200,29 +201,22 @@ notmuch_count_command (notmuch_config_t *config, unused(notmuch_database_t *notm return EXIT_FAILURE; } - if (notmuch_database_open (notmuch_config_get_database_path (config), - NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much)) - return EXIT_FAILURE; - notmuch_exit_if_unmatched_db_uuid (notmuch); - query_str = query_string_from_args (config, argc - opt_index, argv + opt_index); + query_str = query_string_from_args (notmuch, argc - opt_index, argv + opt_index); if (query_str == NULL) { fprintf (stderr, "Out of memory.\n"); return EXIT_FAILURE; } if (exclude) { - search_exclude_tags = notmuch_config_get_search_exclude_tags - (config, &search_exclude_tags_length); + exclude_tags = notmuch_config_get_values (notmuch, NOTMUCH_CONFIG_EXCLUDE_TAGS); } if (batch) - ret = count_file (notmuch, input, search_exclude_tags, - search_exclude_tags_length, output, print_lastmod); + ret = count_file (notmuch, input, exclude_tags, output, print_lastmod); else - ret = print_count (notmuch, query_str, search_exclude_tags, - search_exclude_tags_length, output, print_lastmod); + ret = print_count (notmuch, query_str, exclude_tags, output, print_lastmod); notmuch_database_destroy (notmuch); diff --git a/notmuch.c b/notmuch.c index e0649048..40527893 100644 --- a/notmuch.c +++ b/notmuch.c @@ -153,7 +153,7 @@ static command_t commands[] = { "Get addresses from messages matching the given search terms." }, { "show", notmuch_show_command, NOTMUCH_COMMAND_CONFIG_OPEN, "Show all messages matching the search terms." }, - { "count", notmuch_count_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "count", notmuch_count_command, NOTMUCH_COMMAND_DATABASE_EARLY, "Count messages matching the search terms." }, { "reply", notmuch_reply_command, NOTMUCH_COMMAND_CONFIG_OPEN, "Construct a reply template for a set of messages." }, diff --git a/test/T035-read-config.sh b/test/T035-read-config.sh new file mode 100755 index 00000000..38d6c609 --- /dev/null +++ b/test/T035-read-config.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +test_description='Various options for reading configuration' +. $(dirname "$0")/test-lib.sh || exit 1 + +backup_config () { + local test_name=$(basename $0 .sh) + cp ${NOTMUCH_CONFIG} notmuch-config-backup.${test_name} +} + +xdg_config () { + local dir + local profile=${1:-default} + if [[ $profile != default ]]; then + export NOTMUCH_PROFILE=$profile + fi + backup_config + dir="${HOME}/.config/notmuch/${profile}" + rm -rf $dir + mkdir -p $dir + CONFIG_PATH=$dir/config + mv ${NOTMUCH_CONFIG} ${CONFIG_PATH} + unset NOTMUCH_CONFIG +} + +restore_config () { + local test_name=$(basename $0 .sh) + export NOTMUCH_CONFIG="${TMP_DIRECTORY}/notmuch-config" + unset CONFIG_PATH + unset NOTMUCH_PROFILE + cp notmuch-config-backup.${test_name} ${NOTMUCH_CONFIG} +} + +add_email_corpus + +test_begin_subtest "count with saved query from config file" +backup_config +query_name="test${RANDOM}" +notmuch count query:$query_name > OUTPUT +printf "\n[query]\n${query_name} = tag:inbox\n" >> notmuch-config +notmuch count query:$query_name >> OUTPUT +cat < EXPECTED +0 +52 +EOF +restore_config +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "count with saved query from config file (xdg)" +query_name="test${RANDOM}" +xdg_config +notmuch count query:$query_name > OUTPUT +printf "\n[query]\n${query_name} = tag:inbox\n" >> ${CONFIG_PATH} +notmuch count query:$query_name >> OUTPUT +cat < EXPECTED +0 +52 +EOF +restore_config +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "count with saved query from config file (xdg+profile)" +query_name="test${RANDOM}" +xdg_config work +notmuch count query:$query_name > OUTPUT +printf "\n[query]\n${query_name} = tag:inbox\n" >> ${CONFIG_PATH} +notmuch count query:$query_name >> OUTPUT +cat < EXPECTED +0 +52 +EOF +restore_config +test_expect_equal_file EXPECTED OUTPUT + + +test_done diff --git a/test/T140-excludes.sh b/test/T140-excludes.sh index cef07095..0cacc41d 100755 --- a/test/T140-excludes.sh +++ b/test/T140-excludes.sh @@ -286,6 +286,21 @@ test_begin_subtest "Count, default exclusion: tag in query (threads)" output=$(notmuch count --output=threads tag:test and tag:deleted) test_expect_equal "$output" "3" +test_begin_subtest "Count, default exclusion, batch" +notmuch count --batch --output=messages< OUTPUT +tag:test +tag:test and tag:deleted +tag:test +tag:test and tag:deleted +EOF +cat <EXPECTED +2 +4 +2 +4 +EOF +test_expect_equal_file EXPECTED OUTPUT + test_begin_subtest "Count, exclude=true: tag in query (messages)" output=$(notmuch count --exclude=true tag:test and tag:deleted) test_expect_equal "$output" "4"