From 06a64cf0aa2bc3de083d0c317726863ebeed504f Mon Sep 17 00:00:00 2001 From: David Bremner Date: Thu, 24 Dec 2020 16:10:05 -0400 Subject: [PATCH] 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. --- lib/config.cc | 50 +++++++++++++++++++++++++++++++++++++++++- lib/notmuch-private.h | 3 +++ lib/open.cc | 4 ++++ test/T590-libconfig.sh | 27 +++++++++++++++++++++++ 4 files changed, 83 insertions(+), 1 deletion(-) diff --git a/lib/config.cc b/lib/config.cc index c07b607b..a6b75913 100644 --- a/lib/config.cc +++ b/lib/config.cc @@ -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) { diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 40b1a855..961d50cf 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -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 diff --git a/lib/open.cc b/lib/open.cc index 2d9c4365..ad74ccd6 100644 --- a/lib/open.cc +++ b/lib/open.cc @@ -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; diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh index fcd96876..0c148ad9 100755 --- a/test/T590-libconfig.sh +++ b/test/T590-libconfig.sh @@ -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 -- 2.43.0