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).
This commit is contained in:
David Bremner 2020-12-22 08:13:51 -04:00
parent d071828bd5
commit acc6331baa
4 changed files with 112 additions and 28 deletions

View file

@ -64,10 +64,9 @@ count_files (notmuch_query_t *query)
/* return 0 on success, -1 on failure */ /* return 0 on success, -1 on failure */
static int static int
print_count (notmuch_database_t *notmuch, const char *query_str, 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; notmuch_query_t *query;
size_t i;
int count; int count;
unsigned int ucount; unsigned int ucount;
unsigned long revision; unsigned long revision;
@ -81,13 +80,18 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
return -1; return -1;
} }
for (i = 0; i < exclude_tags_length; i++) { for (notmuch_config_values_start (exclude_tags);
status = notmuch_query_add_tag_exclude (query, exclude_tags[i]); notmuch_config_values_valid (exclude_tags);
if (status && status != NOTMUCH_STATUS_IGNORED) { notmuch_config_values_move_to_next (exclude_tags)) {
print_status_query ("notmuch count", query, status);
return -1; 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) { switch (output) {
case OUTPUT_MESSAGES: case OUTPUT_MESSAGES:
@ -127,8 +131,8 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
} }
static int static int
count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags, count_file (notmuch_database_t *notmuch, FILE *input, notmuch_config_values_t *exclude_tags,
size_t exclude_tags_length, int output, int print_lastmod) int output, int print_lastmod)
{ {
char *line = NULL; char *line = NULL;
ssize_t line_len; 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) { while (! ret && (line_len = getline (&line, &line_size, input)) != -1) {
chomp_newline (line); chomp_newline (line);
ret = print_count (notmuch, line, exclude_tags, exclude_tags_length, ret = print_count (notmuch, line, exclude_tags, output, print_lastmod);
output, print_lastmod);
} }
if (line) if (line)
@ -148,15 +151,13 @@ count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags,
} }
int 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; char *query_str;
int opt_index; int opt_index;
int output = OUTPUT_MESSAGES; int output = OUTPUT_MESSAGES;
bool exclude = true; bool exclude = true;
const char **search_exclude_tags = NULL; notmuch_config_values_t *exclude_tags = NULL;
size_t search_exclude_tags_length = 0;
bool batch = false; bool batch = false;
bool print_lastmod = false; bool print_lastmod = false;
FILE *input = stdin; FILE *input = stdin;
@ -200,29 +201,22 @@ notmuch_count_command (notmuch_config_t *config, unused(notmuch_database_t *notm
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (notmuch_database_open (notmuch_config_get_database_path (config),
NOTMUCH_DATABASE_MODE_READ_ONLY, &notmuch))
return EXIT_FAILURE;
notmuch_exit_if_unmatched_db_uuid (notmuch); 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) { if (query_str == NULL) {
fprintf (stderr, "Out of memory.\n"); fprintf (stderr, "Out of memory.\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (exclude) { if (exclude) {
search_exclude_tags = notmuch_config_get_search_exclude_tags exclude_tags = notmuch_config_get_values (notmuch, NOTMUCH_CONFIG_EXCLUDE_TAGS);
(config, &search_exclude_tags_length);
} }
if (batch) if (batch)
ret = count_file (notmuch, input, search_exclude_tags, ret = count_file (notmuch, input, exclude_tags, output, print_lastmod);
search_exclude_tags_length, output, print_lastmod);
else else
ret = print_count (notmuch, query_str, search_exclude_tags, ret = print_count (notmuch, query_str, exclude_tags, output, print_lastmod);
search_exclude_tags_length, output, print_lastmod);
notmuch_database_destroy (notmuch); notmuch_database_destroy (notmuch);

View file

@ -153,7 +153,7 @@ static command_t commands[] = {
"Get addresses from messages matching the given search terms." }, "Get addresses from messages matching the given search terms." },
{ "show", notmuch_show_command, NOTMUCH_COMMAND_CONFIG_OPEN, { "show", notmuch_show_command, NOTMUCH_COMMAND_CONFIG_OPEN,
"Show all messages matching the search terms." }, "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." }, "Count messages matching the search terms." },
{ "reply", notmuch_reply_command, NOTMUCH_COMMAND_CONFIG_OPEN, { "reply", notmuch_reply_command, NOTMUCH_COMMAND_CONFIG_OPEN,
"Construct a reply template for a set of messages." }, "Construct a reply template for a set of messages." },

75
test/T035-read-config.sh Executable file
View file

@ -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 <<EOF > 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 <<EOF > 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 <<EOF > EXPECTED
0
52
EOF
restore_config
test_expect_equal_file EXPECTED OUTPUT
test_done

View file

@ -286,6 +286,21 @@ test_begin_subtest "Count, default exclusion: tag in query (threads)"
output=$(notmuch count --output=threads tag:test and tag:deleted) output=$(notmuch count --output=threads tag:test and tag:deleted)
test_expect_equal "$output" "3" test_expect_equal "$output" "3"
test_begin_subtest "Count, default exclusion, batch"
notmuch count --batch --output=messages<<EOF > OUTPUT
tag:test
tag:test and tag:deleted
tag:test
tag:test and tag:deleted
EOF
cat <<EOF >EXPECTED
2
4
2
4
EOF
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "Count, exclude=true: tag in query (messages)" test_begin_subtest "Count, exclude=true: tag in query (messages)"
output=$(notmuch count --exclude=true tag:test and tag:deleted) output=$(notmuch count --exclude=true tag:test and tag:deleted)
test_expect_equal "$output" "4" test_expect_equal "$output" "4"