unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: David Bremner <david@tethera.net>
To: notmuch@notmuchmail.org
Cc: David Bremner <david@tethera.net>
Subject: [PATCH 20/27] CLI/config: default to storing all config in external files
Date: Thu,  4 Mar 2021 09:01:32 -0400	[thread overview]
Message-ID: <20210304130139.4046183-21-david@tethera.net> (raw)
In-Reply-To: <20210304130139.4046183-1-david@tethera.net>

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
d9af0af1646.

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.
---
 doc/man1/notmuch-config.rst |  6 ++++-
 doc/man1/notmuch.rst        |  4 +++-
 notmuch-config.c            | 44 +++++++++++++++++++++++++++----------
 test/T030-config.sh         | 20 +++++++++++++++++
 test/T600-named-queries.sh  | 17 ++++++--------
 test/T750-user-header.sh    |  8 -------
 6 files changed, 67 insertions(+), 32 deletions(-)

diff --git a/doc/man1/notmuch-config.rst b/doc/man1/notmuch-config.rst
index 99030a41..2a155632 100644
--- a/doc/man1/notmuch-config.rst
+++ b/doc/man1/notmuch-config.rst
@@ -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::
diff --git a/doc/man1/notmuch.rst b/doc/man1/notmuch.rst
index fecfd08a..48351588 100644
--- a/doc/man1/notmuch.rst
+++ b/doc/man1/notmuch.rst
@@ -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
diff --git a/notmuch-config.c b/notmuch-config.c
index 93a1018e..5ba62819 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -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 *
@@ -582,10 +581,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, int argc, char *argv[])
+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);
@@ -596,7 +621,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);
     }
 
@@ -689,12 +714,7 @@ notmuch_config_command (notmuch_config_t *config, notmuch_database_t *notmuch, i
 	}
 	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 {
diff --git a/test/T030-config.sh b/test/T030-config.sh
index 65cb189b..c7d72455 100755
--- a/test/T030-config.sh
+++ b/test/T030-config.sh
@@ -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
diff --git a/test/T600-named-queries.sh b/test/T600-named-queries.sh
index 0ae8b83d..a7b84995 100755
--- a/test/T600-named-queries.sh
+++ b/test/T600-named-queries.sh
@@ -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
 
diff --git a/test/T750-user-header.sh b/test/T750-user-header.sh
index 586788b3..05f80885 100755
--- a/test/T750-user-header.sh
+++ b/test/T750-user-header.sh
@@ -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
-- 
2.30.1

  parent reply	other threads:[~2021-03-04 13:02 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-04 13:01 v1: convert remaining CLI to new configuration David Bremner
2021-03-04 13:01 ` [PATCH 01/27] lib: add missing status strings David Bremner
2021-03-04 13:01 ` [PATCH 02/27] test: convert random-corpus to use n_d_open_with_config David Bremner
2021-03-04 13:01 ` [PATCH 03/27] lib/open: pull _load_key_file out of _choose_database_path David Bremner
2021-03-04 13:01 ` [PATCH 04/27] lib: provide notmuch_database_load_config David Bremner
2021-03-04 13:01 ` [PATCH 05/27] lib/config: add notmuch_config_get_values_string David Bremner
2021-03-04 13:01 ` [PATCH 06/27] lib/config: add config_pairs iterators David Bremner
2021-03-04 13:01 ` [PATCH 07/27] lib/config: set defaults for user full name David Bremner
2021-03-04 13:01 ` [PATCH 08/27] lib/config: set default for primary user email David Bremner
2021-03-04 13:01 ` [PATCH 09/27] lib/open: canonicalize relative path read from config file David Bremner
2021-03-04 13:01 ` [PATCH 10/27] CLI: load merged config at top level David Bremner
2021-03-04 13:01 ` [PATCH 11/27] CLI/config: use merged config for "config get" David Bremner
2021-03-04 13:01 ` [PATCH 12/27] test/setup: check file output instead of notmuch config list David Bremner
2021-03-04 13:01 ` [PATCH 13/27] CLI/setup: switch to new configuration framework David Bremner
2021-03-04 13:01 ` [PATCH 14/27] CLI/config: switch "notmuch config list" to merged config David Bremner
2021-03-04 13:01 ` [PATCH 15/27] CLI/config: migrate notmuch_config_open to new config David Bremner
2021-03-04 13:01 ` [PATCH 16/27] CLI/config: use notmuch_database_reopen David Bremner
2021-03-04 13:01 ` [PATCH 17/27] CLI/notmuch: switch notmuch_command to notmuch_config_get David Bremner
2021-03-04 13:01 ` [PATCH 18/27] CLI/config: drop obsolete notmuch_config_get_* David Bremner
2021-03-04 13:01 ` [PATCH 19/27] CLI/config: drop cached data from notmuch_config_t David Bremner
2021-03-04 13:01 ` David Bremner [this message]
2021-03-04 13:01 ` [PATCH 21/27] lib: add NOTMUCH_STATUS_NO_DATABASE David Bremner
2021-03-04 13:01 ` [PATCH 22/27] CLI+lib: detect missing database in split configurations David Bremner
2021-03-04 13:01 ` [PATCH 23/27] lib: provide notmuch_config_path David Bremner
2021-03-04 13:01 ` [PATCH 24/27] CLI/config: support set/get with split configuration David Bremner
2021-03-04 13:01 ` [PATCH 25/27] CLI/config: remove calls to notmuch_config_open from top level David Bremner
2021-03-04 13:01 ` [PATCH 26/27] CLI: drop notmuch_config_t from subcommand interface David Bremner
2021-03-04 13:01 ` [PATCH 27/27] CLI: rename notmuch_config_t to notmuch_conffile_t David Bremner
2021-03-04 13:50 ` v1: convert remaining CLI to new configuration David Bremner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210304130139.4046183-21-david@tethera.net \
    --to=david@tethera.net \
    --cc=notmuch@notmuchmail.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).