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 */
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,11 +80,16 @@ 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]);
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);
return -1;
ret = -1;
goto DONE;
}
}
@ -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, &notmuch))
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);

View file

@ -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." },

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)
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)"
output=$(notmuch count --exclude=true tag:test and tag:deleted)
test_expect_equal "$output" "4"