From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id yMUHGolV8l8KBwAA0tVLHw (envelope-from ) for ; Sun, 03 Jan 2021 23:38:49 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id KO/XFYlV8l+OPQAA1q6Kng (envelope-from ) for ; Sun, 03 Jan 2021 23:38:49 +0000 Received: from mail.notmuchmail.org (nmbug.tethera.net [IPv6:2607:5300:201:3100::1657]) (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 D573094038E for ; Sun, 3 Jan 2021 23:38:48 +0000 (UTC) Received: from nmbug.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id 71E5B29EC2; Sun, 3 Jan 2021 18:37:19 -0500 (EST) Received: from fethera.tethera.net (fethera.tethera.net [IPv6:2607:5300:60:c5::1]) by mail.notmuchmail.org (Postfix) with ESMTP id 49F6A29D39 for ; Sun, 3 Jan 2021 18:36:28 -0500 (EST) Received: by fethera.tethera.net (Postfix, from userid 1001) id 40DDD5FF47; Sun, 3 Jan 2021 18:36:28 -0500 (EST) Received: (nullmailer pid 126212 invoked by uid 1000); Sun, 03 Jan 2021 23:35:56 -0000 From: David Bremner To: notmuch@notmuchmail.org Cc: David Bremner Subject: [PATCH 09/36] lib/open: load default values for known configuration keys. Date: Sun, 3 Jan 2021 19:35:20 -0400 Message-Id: <20210103233547.122707-10-david@tethera.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210103233547.122707-1-david@tethera.net> References: <20210103233547.122707-1-david@tethera.net> MIME-Version: 1.0 Message-ID-Hash: LY2KKU3X2FC4GGAO3IHPUJOXRSXTB5FI X-Message-ID-Hash: LY2KKU3X2FC4GGAO3IHPUJOXRSXTB5FI 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.88 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 2607:5300:201:3100::1657 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Queue-Id: D573094038E X-Spam-Score: -0.88 X-Migadu-Scanner: scn1.migadu.com X-TUID: CzPcvsKn56Om 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 c92ffeef..f6d9bf44 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 76255283..8cede121 100644 --- a/lib/open.cc +++ b/lib/open.cc @@ -288,6 +288,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 8bf43eed..0c7398a2 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.29.2