From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id sAGqNcxHHWBWRAAA0tVLHw (envelope-from ) for ; Fri, 05 Feb 2021 13:27:40 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1 with LMTPS id YCVdMcxHHWAmcAAAbx9fmQ (envelope-from ) for ; Fri, 05 Feb 2021 13:27:40 +0000 Received: from mail.notmuchmail.org (nmbug.tethera.net [144.217.243.247]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (2048 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 16E379402BD for ; Fri, 5 Feb 2021 13:27:40 +0000 (UTC) Received: from nmbug.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id 8CF4E1FBAD; Fri, 5 Feb 2021 08:27:12 -0500 (EST) Received: from fethera.tethera.net (fethera.tethera.net [IPv6:2607:5300:60:c5::1]) by mail.notmuchmail.org (Postfix) with ESMTP id 6FA0C1FAEC for ; Fri, 5 Feb 2021 08:27:06 -0500 (EST) Received: by fethera.tethera.net (Postfix, from userid 1001) id 682736067F; Fri, 5 Feb 2021 08:27:06 -0500 (EST) Received: (nullmailer pid 3258388 invoked by uid 1000); Fri, 05 Feb 2021 13:27:02 -0000 From: David Bremner To: notmuch@notmuchmail.org Cc: David Bremner Subject: [PATCH 07/39] lib/open: load default values for known configuration keys. Date: Fri, 5 Feb 2021 09:26:22 -0400 Message-Id: <20210205132654.3258292-8-david@tethera.net> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210205132654.3258292-1-david@tethera.net> References: <20210205132654.3258292-1-david@tethera.net> MIME-Version: 1.0 Message-ID-Hash: BINAU5QERRP6ZY3WBKAORPXXETTZGFW7 X-Message-ID-Hash: BINAU5QERRP6ZY3WBKAORPXXETTZGFW7 X-MailFrom: bremner@tethera.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-notmuch.notmuchmail.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.1 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: -0.94 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 144.217.243.247 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Queue-Id: 16E379402BD X-Spam-Score: -0.94 X-Migadu-Scanner: scn0.migadu.com X-TUID: VwZzDj4Gf4ZT 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.30.0