CLI/config: default to storing all config in external files

Previously the fact that some configuration options were only stored
in the database (and thus editing the config file had no effect) was a
source of user confusion. This was fixed with the series ending at
d9af0af164.

On the other hand, the underlying partition of config options into
those stored by default in the database and those stored in the config
file remained. This is also confusing, since now some invocations of
"notmuch config set" modify the config file, and others silently
modify the database instead.

With this commit, it is up to the user to decide which configuration
to modify. A new "--database" option is provided for notmuch config to
enable modifying the configuration information in the database;
otherwise the default is to update an external config file.
This commit is contained in:
David Bremner 2021-02-19 08:41:36 -04:00
parent 7f6aae4f64
commit dd9112e7d8
6 changed files with 66 additions and 32 deletions

View file

@ -7,7 +7,7 @@ SYNOPSIS
**notmuch** **config** **get** <*section*>.<*item*>
**notmuch** **config** **set** <*section*>.<*item*> [*value* ...]
**notmuch** **config** **set** [--database] <*section*>.<*item*> [*value* ...]
**notmuch** **config** **list**
@ -30,6 +30,10 @@ configuration file and corresponding database.
If no values are provided, the specified configuration item will
be removed from the configuration file.
With the `--database` option, updates configuration metadata
stored in the database, rather than the default (text)
configuration file.
**list**
Every configuration item is printed to stdout, each on a separate
line of the form::

View file

@ -48,7 +48,9 @@ Supported global options for ``notmuch`` include
``--config=FILE``
Specify the configuration file to use. This overrides any
configuration file specified by ${NOTMUCH\_CONFIG}.
configuration file specified by ${NOTMUCH\_CONFIG}. The empty
string is a permitted and sometimes useful value of *FILE*, which
tells ``notmuch`` to use only configuration metadata from the database.
``--uuid=HEX``
Enforce that the database UUID (a unique identifier which persists

View file

@ -511,16 +511,15 @@ validate_field_name (const char *str)
typedef struct config_key {
const char *name;
bool in_db;
bool prefix;
bool (*validate)(const char *);
} config_key_info_t;
static struct config_key
config_key_table[] = {
{ "index.decrypt", true, false, NULL },
{ "index.header.", true, true, validate_field_name },
{ "query.", true, true, NULL },
{ "index.decrypt", false, NULL },
{ "index.header.", true, validate_field_name },
{ "query.", true, NULL },
};
static config_key_info_t *
@ -583,11 +582,36 @@ _set_db_config (notmuch_database_t *notmuch, const char *key, int argc, char **a
}
static int
notmuch_config_command_set (notmuch_config_t *config, notmuch_database_t *notmuch, char *item,
notmuch_config_command_set (notmuch_config_t *config, notmuch_database_t *notmuch,
int argc, char *argv[])
{
char *group, *key;
config_key_info_t *key_info;
bool update_database = false;
int opt_index;
char *item;
notmuch_opt_desc_t options[] = {
{ .opt_bool = &update_database, .name = "database" },
{ }
};
opt_index = parse_arguments (argc, argv, options, 1);
if (opt_index < 0)
return EXIT_FAILURE;
argc -= opt_index;
argv += opt_index;
if (argc < 1) {
fprintf (stderr, "Error: notmuch config set requires at least "
"one argument.\n");
return EXIT_FAILURE;
}
item = argv[0];
argv++;
argc--;
if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) {
fprintf (stderr, "Error: read only option: %s\n", item);
@ -598,7 +622,7 @@ notmuch_config_command_set (notmuch_config_t *config, notmuch_database_t *notmuc
if (key_info && key_info->validate && (! key_info->validate (item)))
return 1;
if (key_info && key_info->in_db) {
if (update_database) {
return _set_db_config (notmuch, item, argc, argv);
}
@ -692,12 +716,7 @@ notmuch_config_command (notmuch_config_t *config, notmuch_database_t *notmuch,
}
ret = notmuch_config_command_get (notmuch, argv[1]);
} else if (strcmp (argv[0], "set") == 0) {
if (argc < 2) {
fprintf (stderr, "Error: notmuch config set requires at least "
"one argument.\n");
return EXIT_FAILURE;
}
ret = notmuch_config_command_set (config, notmuch, argv[1], argc - 2, argv + 2);
ret = notmuch_config_command_set (config, notmuch, argc, argv);
} else if (strcmp (argv[0], "list") == 0) {
ret = notmuch_config_command_list (notmuch);
} else {

View file

@ -124,4 +124,24 @@ count=$(notmuch count '*')
test_expect_equal "${path} ${count}" \
"Maildir 52"
test_begin_subtest "Add config to database"
notmuch new
key=g${RANDOM}.m${RANDOM}
value=${RANDOM}
notmuch config set --database ${key} ${value}
notmuch dump --include=config > OUTPUT
cat <<EOF > EXPECTED
#notmuch-dump batch-tag:3 config
#@ ${key} ${value}
EOF
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "Roundtrip config to/from database"
notmuch new
key=g${RANDOM}.m${RANDOM}
value=${RANDOM}
notmuch config set --database ${key} ${value}
output=$(notmuch config get ${key})
test_expect_equal "${output}" "${value}"
test_done

View file

@ -4,13 +4,13 @@ test_description='named queries'
QUERYSTR="date:2009-11-18..2009-11-18 and tag:unread"
test_begin_subtest "error adding named query before initializing DB"
test_expect_code 1 "notmuch config set query.test \"$QUERYSTR\""
test_begin_subtest "error adding named query to DB before initialization"
test_expect_code 1 "notmuch config set --database query.test \"$QUERYSTR\""
add_email_corpus
test_begin_subtest "adding named query"
test_expect_success "notmuch config set query.test \"$QUERYSTR\""
test_begin_subtest "adding named query (database)"
test_expect_success "notmuch config set --database query.test \"$QUERYSTR\""
test_begin_subtest "adding nested named query"
QUERYSTR2="query:test and subject:Maildir"
@ -32,7 +32,6 @@ 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
@ -40,23 +39,21 @@ test_begin_subtest 'dumping large queries'
# This value is just large enough to trigger a limitation of gzprintf
# to 8191 bytes in total (by default).
repeat=1329
notmuch config set query.big "$(seq -s' ' $repeat)"
notmuch config set --database query.big "$(seq -s' ' $repeat)"
notmuch dump --include=config > OUTPUT
notmuch config set query.big ''
notmuch config set --database query.big
printf "#notmuch-dump batch-tag:3 config\n#@ query.big " > EXPECTED
seq -s'%20' $repeat >> EXPECTED
cat <<EOF >> EXPECTED
#@ query.test date%3a2009-11-18..2009-11-18%20and%20tag%3aunread
#@ query.test2 query%3atest%20and%20subject%3aMaildir
EOF
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "delete named queries"
notmuch dump > BEFORE
notmuch config set query.test
notmuch config set --database query.test
notmuch dump | grep '^#@' > OUTPUT
cat<<EOF > EXPECTED
#@ query.test2 query%3atest%20and%20subject%3aMaildir
EOF
test_expect_equal_file EXPECTED OUTPUT

View file

@ -2,14 +2,6 @@
test_description='indexing user specified headers'
. $(dirname "$0")/test-lib.sh || exit 1
test_begin_subtest "error adding user header before initializing DB"
notmuch config set index.header.List List-Id 2>&1 | notmuch_dir_sanitize > OUTPUT
cat <<EOF > EXPECTED
notmuch config: Illegal argument for function
Cannot reopen closed or nonexistent database
EOF
test_expect_equal_file EXPECTED OUTPUT
add_email_corpus
notmuch search '*' | notmuch_search_sanitize > initial-threads