mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 03:48:10 +01:00
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:
parent
d071828bd5
commit
acc6331baa
4 changed files with 112 additions and 28 deletions
|
@ -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,11 +80,16 @@ 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);
|
||||||
|
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) {
|
if (status && status != NOTMUCH_STATUS_IGNORED) {
|
||||||
print_status_query ("notmuch count", query, status);
|
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
|
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, ¬much))
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
|
@ -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
75
test/T035-read-config.sh
Executable 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
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue