lib/open: load default values for known configuration keys.

This emulates the behaviour of notmuch_config_open defined in the CLI,
in that it fills in default values if they are not otherwise defined.
This commit is contained in:
David Bremner 2020-12-24 16:10:05 -04:00
parent d6bd87a712
commit 06a64cf0aa
4 changed files with 83 additions and 1 deletions

View file

@ -31,6 +31,8 @@ struct _notmuch_config_list {
char *current_val;
};
static const char * _notmuch_config_key_to_string (notmuch_config_key_t key);
static int
_notmuch_config_list_destroy (notmuch_config_list_t *list)
{
@ -280,7 +282,7 @@ _notmuch_config_load_from_file (notmuch_database_t *notmuch,
return status;
}
const char *
static const char *
_notmuch_config_key_to_string (notmuch_config_key_t key) {
switch (key) {
case NOTMUCH_CONFIG_DATABASE_PATH:
@ -302,6 +304,52 @@ _notmuch_config_key_to_string (notmuch_config_key_t key) {
}
}
static const char *
_notmuch_config_default (void *ctx, notmuch_config_key_t key) {
char *path;
switch (key) {
case NOTMUCH_CONFIG_DATABASE_PATH:
path = getenv ("MAILDIR");
if (path)
path = talloc_strdup (ctx, path);
else
path = talloc_asprintf (ctx, "%s/mail",
getenv ("HOME"));
return path;
case NOTMUCH_CONFIG_EXCLUDE_TAGS:
return "";
case NOTMUCH_CONFIG_NEW_TAGS:
return "inbox;unread";
case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
return "true";
case NOTMUCH_CONFIG_USER_NAME:
case NOTMUCH_CONFIG_PRIMARY_EMAIL:
case NOTMUCH_CONFIG_OTHER_EMAIL:
return NULL;
default:
case NOTMUCH_CONFIG_LAST:
INTERNAL_ERROR ("illegal key enum %d", key);
}
}
notmuch_status_t
_notmuch_config_load_defaults (notmuch_database_t *notmuch) {
notmuch_config_key_t key;
for (key = NOTMUCH_CONFIG_FIRST;
key < NOTMUCH_CONFIG_LAST;
key = notmuch_config_key_t(key + 1)) {
const char *val = notmuch_config_get (notmuch, key);
const char *key_string = _notmuch_config_key_to_string (key);
val = _notmuch_string_map_get (notmuch->config, key_string);
if (! val) {
_notmuch_string_map_set (notmuch->config, key_string, _notmuch_config_default (notmuch, key));
}
}
return NOTMUCH_STATUS_SUCCESS;
}
const char *
notmuch_config_get (notmuch_database_t *notmuch, notmuch_config_key_t key) {

View file

@ -710,6 +710,9 @@ _notmuch_config_load_from_database (notmuch_database_t * db);
notmuch_status_t
_notmuch_config_load_from_file (notmuch_database_t * db, GKeyFile *file);
notmuch_status_t
_notmuch_config_load_defaults (notmuch_database_t * db);
NOTMUCH_END_DECLS
#ifdef __cplusplus

View file

@ -289,6 +289,10 @@ notmuch_database_open_with_config (const char *database_path,
if (status)
goto DONE;
status = _notmuch_config_load_defaults (notmuch);
if (status)
goto DONE;
status = _notmuch_database_setup_standard_query_fields (notmuch);
if (status)
goto DONE;

View file

@ -239,6 +239,33 @@ EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
test_begin_subtest "load default values"
export MAILDIR=${MAIL_DIR}
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} '' %NULL%
{
notmuch_config_key_t key;
for (key = NOTMUCH_CONFIG_FIRST;
key < NOTMUCH_CONFIG_LAST;
key = (notmuch_config_key_t)(key + 1)) {
const char *val = notmuch_config_get (db, key);
printf("%s\n", val ? val : "NULL" );
}
}
EOF
cat <<'EOF' >EXPECTED
== stdout ==
MAIL_DIR
inbox;unread
true
NULL
NULL
NULL
== stderr ==
EOF
unset MAILDIR
test_expect_equal_file EXPECTED OUTPUT
backup_database
test_begin_subtest "override config from \${NOTMUCH_CONFIG}"
notmuch config set test.key1 overridden