mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
CLI: add notmuch-config support for named queries
Most of the infrastructure here is general, only the validation/dispatch is hardcoded to a particular prefix. A notable change in behaviour is that notmuch-config now opens the database e.g. on every call to list, which fails with an error message if the database doesn't exit yet.
This commit is contained in:
parent
c6fcc555dd
commit
2d2a13966c
6 changed files with 159 additions and 7 deletions
|
@ -138,6 +138,12 @@ The available configuration items are described below.
|
||||||
"compact" (see **notmuch-compact(1)**)
|
"compact" (see **notmuch-compact(1)**)
|
||||||
and "field_processor" (see **notmuch-search-terms(7)**).
|
and "field_processor" (see **notmuch-search-terms(7)**).
|
||||||
|
|
||||||
|
**query.<name>**
|
||||||
|
|
||||||
|
Expansion for named query called <name>. See
|
||||||
|
**notmuch-search-terms(7)** for more information about named
|
||||||
|
queries.
|
||||||
|
|
||||||
ENVIRONMENT
|
ENVIRONMENT
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|
|
|
@ -751,6 +751,28 @@ _item_split (char *item, char **group, char **key)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BUILT_WITH_PREFIX "built_with."
|
#define BUILT_WITH_PREFIX "built_with."
|
||||||
|
#define QUERY_PREFIX "query."
|
||||||
|
|
||||||
|
static int
|
||||||
|
_print_db_config(notmuch_config_t *config, const char *name)
|
||||||
|
{
|
||||||
|
notmuch_database_t *notmuch;
|
||||||
|
char *val;
|
||||||
|
|
||||||
|
if (notmuch_database_open (notmuch_config_get_database_path (config),
|
||||||
|
NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
/* XXX Handle UUID mismatch? */
|
||||||
|
|
||||||
|
if (print_status_database ("notmuch config", notmuch,
|
||||||
|
notmuch_database_get_config (notmuch, name, &val)))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
puts (val);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
notmuch_config_command_get (notmuch_config_t *config, char *item)
|
notmuch_config_command_get (notmuch_config_t *config, char *item)
|
||||||
|
@ -778,6 +800,8 @@ notmuch_config_command_get (notmuch_config_t *config, char *item)
|
||||||
} else if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) {
|
} else if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) {
|
||||||
printf ("%s\n",
|
printf ("%s\n",
|
||||||
notmuch_built_with (item + strlen (BUILT_WITH_PREFIX)) ? "true" : "false");
|
notmuch_built_with (item + strlen (BUILT_WITH_PREFIX)) ? "true" : "false");
|
||||||
|
} else if (STRNCMP_LITERAL (item, QUERY_PREFIX) == 0) {
|
||||||
|
return _print_db_config (config, item);
|
||||||
} else {
|
} else {
|
||||||
char **value;
|
char **value;
|
||||||
size_t i, length;
|
size_t i, length;
|
||||||
|
@ -804,6 +828,39 @@ notmuch_config_command_get (notmuch_config_t *config, char *item)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_set_db_config(notmuch_config_t *config, const char *key, int argc, char **argv)
|
||||||
|
{
|
||||||
|
notmuch_database_t *notmuch;
|
||||||
|
const char *val = "";
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
/* XXX handle lists? */
|
||||||
|
fprintf (stderr, "notmuch config set: at most one value expected for %s\n", key);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 0) {
|
||||||
|
val = argv[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notmuch_database_open (notmuch_config_get_database_path (config),
|
||||||
|
NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
/* XXX Handle UUID mismatch? */
|
||||||
|
|
||||||
|
if (print_status_database ("notmuch config", notmuch,
|
||||||
|
notmuch_database_set_config (notmuch, key, val)))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
if (print_status_database ("notmuch config", notmuch,
|
||||||
|
notmuch_database_close (notmuch)))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char *argv[])
|
notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -814,6 +871,10 @@ notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (STRNCMP_LITERAL (item, QUERY_PREFIX) == 0) {
|
||||||
|
return _set_db_config (config, item, argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
if (_item_split (item, &group, &key))
|
if (_item_split (item, &group, &key))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -852,6 +913,31 @@ _notmuch_config_list_built_with ()
|
||||||
notmuch_built_with ("field_processor") ? "true" : "false");
|
notmuch_built_with ("field_processor") ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_list_db_config (notmuch_config_t *config)
|
||||||
|
{
|
||||||
|
notmuch_database_t *notmuch;
|
||||||
|
notmuch_config_list_t *list;
|
||||||
|
|
||||||
|
if (notmuch_database_open (notmuch_config_get_database_path (config),
|
||||||
|
NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
/* XXX Handle UUID mismatch? */
|
||||||
|
|
||||||
|
|
||||||
|
if (print_status_database ("notmuch config", notmuch,
|
||||||
|
notmuch_database_get_config_list (notmuch, "", &list)))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
|
||||||
|
printf("%s=%s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
|
||||||
|
}
|
||||||
|
notmuch_config_list_destroy (list);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
notmuch_config_command_list (notmuch_config_t *config)
|
notmuch_config_command_list (notmuch_config_t *config)
|
||||||
{
|
{
|
||||||
|
@ -888,7 +974,7 @@ notmuch_config_command_list (notmuch_config_t *config)
|
||||||
g_strfreev (groups);
|
g_strfreev (groups);
|
||||||
|
|
||||||
_notmuch_config_list_built_with ();
|
_notmuch_config_list_built_with ();
|
||||||
return 0;
|
return _list_db_config (config);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -19,7 +19,7 @@ $(dir)/hex-xcode: $(dir)/hex-xcode.o command-line-arguments.o util/libutil.a
|
||||||
$(call quiet,CC) $^ -o $@ $(LDFLAGS) $(TALLOC_LDFLAGS)
|
$(call quiet,CC) $^ -o $@ $(LDFLAGS) $(TALLOC_LDFLAGS)
|
||||||
|
|
||||||
random_corpus_deps = $(dir)/random-corpus.o $(dir)/database-test.o \
|
random_corpus_deps = $(dir)/random-corpus.o $(dir)/database-test.o \
|
||||||
notmuch-config.o command-line-arguments.o \
|
notmuch-config.o status.o command-line-arguments.o \
|
||||||
lib/libnotmuch.a util/libutil.a \
|
lib/libnotmuch.a util/libutil.a \
|
||||||
parse-time-string/libparse-time-string.a
|
parse-time-string/libparse-time-string.a
|
||||||
|
|
||||||
|
|
|
@ -43,10 +43,10 @@ notmuch config set foo.nonexistent
|
||||||
test_expect_equal "$(notmuch config get foo.nonexistent)" ""
|
test_expect_equal "$(notmuch config get foo.nonexistent)" ""
|
||||||
|
|
||||||
test_begin_subtest "List all items"
|
test_begin_subtest "List all items"
|
||||||
notmuch config set database.path "/canonical/path"
|
notmuch config list 2>&1 | notmuch_config_sanitize > OUTPUT
|
||||||
output=$(notmuch config list | notmuch_built_with_sanitize)
|
cat <<EOF > EXPECTED
|
||||||
test_expect_equal "$output" "\
|
Error opening database at MAIL_DIR/.notmuch: No such file or directory
|
||||||
database.path=/canonical/path
|
database.path=MAIL_DIR
|
||||||
user.name=Notmuch Test Suite
|
user.name=Notmuch Test Suite
|
||||||
user.primary_email=test_suite@notmuchmail.org
|
user.primary_email=test_suite@notmuchmail.org
|
||||||
user.other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org
|
user.other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org
|
||||||
|
@ -58,7 +58,9 @@ crypto.gpg_path=gpg
|
||||||
foo.string=this is another string value
|
foo.string=this is another string value
|
||||||
foo.list=this;is another;list value;
|
foo.list=this;is another;list value;
|
||||||
built_with.compact=something
|
built_with.compact=something
|
||||||
built_with.field_processor=something"
|
built_with.field_processor=something
|
||||||
|
EOF
|
||||||
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
test_begin_subtest "Top level --config=FILE option"
|
test_begin_subtest "Top level --config=FILE option"
|
||||||
cp "${NOTMUCH_CONFIG}" alt-config
|
cp "${NOTMUCH_CONFIG}" alt-config
|
||||||
|
|
53
test/T600-named-queries.sh
Executable file
53
test/T600-named-queries.sh
Executable file
|
@ -0,0 +1,53 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
test_description='named queries'
|
||||||
|
. ./test-lib.sh || exit 1
|
||||||
|
|
||||||
|
QUERYSTR="date:2009-11-18..2009-11-18 and tag:unread"
|
||||||
|
|
||||||
|
test_expect_code 1 "error adding named query before initializing DB" \
|
||||||
|
"notmuch config set query.test \"$QUERYSTR\""
|
||||||
|
|
||||||
|
add_email_corpus
|
||||||
|
|
||||||
|
test_expect_success "adding named query" \
|
||||||
|
"notmuch config set query.test \"$QUERYSTR\""
|
||||||
|
|
||||||
|
QUERYSTR2="query:test and subject:Maildir"
|
||||||
|
test_expect_success "adding nested named query" \
|
||||||
|
"notmuch config set query.test2 \"$QUERYSTR2\""
|
||||||
|
|
||||||
|
test_begin_subtest "retrieve named query"
|
||||||
|
output=$(notmuch config get query.test)
|
||||||
|
test_expect_equal "$QUERYSTR" "$output"
|
||||||
|
|
||||||
|
test_begin_subtest "List all queries"
|
||||||
|
notmuch config list | grep ^query | notmuch_config_sanitize > OUTPUT
|
||||||
|
cat <<EOF > EXPECTED
|
||||||
|
query.test=date:2009-11-18..2009-11-18 and tag:unread
|
||||||
|
query.test2=query:test and subject:Maildir
|
||||||
|
EOF
|
||||||
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
|
test_begin_subtest "dump named queries"
|
||||||
|
notmuch dump | grep '^#@' > OUTPUT
|
||||||
|
cat<<EOF > QUERIES.BEFORE
|
||||||
|
#@ query.test date%3a2009-11-18..2009-11-18%20and%20tag%3aunread
|
||||||
|
#@ query.test2 query%3atest%20and%20subject%3aMaildir
|
||||||
|
EOF
|
||||||
|
test_expect_equal_file QUERIES.BEFORE OUTPUT
|
||||||
|
|
||||||
|
test_begin_subtest "delete named queries"
|
||||||
|
notmuch dump > BEFORE
|
||||||
|
notmuch config set query.test
|
||||||
|
notmuch dump | grep '^#@' > OUTPUT
|
||||||
|
cat<<EOF > EXPECTED
|
||||||
|
#@ query.test2 query%3atest%20and%20subject%3aMaildir
|
||||||
|
EOF
|
||||||
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
|
test_begin_subtest "restore named queries"
|
||||||
|
notmuch restore < BEFORE
|
||||||
|
notmuch dump | grep '^#@' > OUTPUT
|
||||||
|
test_expect_equal_file QUERIES.BEFORE OUTPUT
|
||||||
|
|
||||||
|
test_done
|
|
@ -746,6 +746,11 @@ notmuch_built_with_sanitize ()
|
||||||
sed 's/^built_with[.]\(.*\)=.*$/built_with.\1=something/'
|
sed 's/^built_with[.]\(.*\)=.*$/built_with.\1=something/'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
notmuch_config_sanitize ()
|
||||||
|
{
|
||||||
|
notmuch_dir_sanitize | notmuch_built_with_sanitize
|
||||||
|
}
|
||||||
|
|
||||||
# End of notmuch helper functions
|
# End of notmuch helper functions
|
||||||
|
|
||||||
# Use test_set_prereq to tell that a particular prerequisite is available.
|
# Use test_set_prereq to tell that a particular prerequisite is available.
|
||||||
|
|
Loading…
Reference in a new issue