]> git.cworth.org Git - notmuch/commitdiff
CLI/config: default to storing all config in external files
authorDavid Bremner <david@tethera.net>
Fri, 19 Feb 2021 12:41:36 +0000 (08:41 -0400)
committerDavid Bremner <david@tethera.net>
Sat, 27 Mar 2021 12:26:14 +0000 (09:26 -0300)
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;
otherwise the default is to update an external config file.

doc/man1/notmuch-config.rst
doc/man1/notmuch.rst
notmuch-config.c
test/T030-config.sh
test/T600-named-queries.sh
test/T750-user-header.sh

index 223d2de56d47a5f41de98cd173a8eb585bd57a97..32290a38a3e60605230e24e0dbab651b97effc5d 100644 (file)
@@ -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::
index fecfd08a360d0143586352387a5016a1fd25ee2f..48351588a3eafc7a20ed69161fa2ae44485c7486 100644 (file)
@@ -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
index 24c168331887a0004fd4432e18891a5ce4b68b04..c42835762e959e72973b3227144e292d2db97aa7 100644 (file)
@@ -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 *
@@ -583,11 +582,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,
+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);
@@ -598,7 +622,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);
     }
 
@@ -692,12 +716,7 @@ notmuch_config_command (notmuch_config_t *config, notmuch_database_t *notmuch,
        }
        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 {
index c87d35b695eb83ab9a44352abf08f45ee19c7c0a..b22d8f291f5c0dfae01aeae5274281fca3112857 100755 (executable)
@@ -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
index 0ae8b83d976a8ac897ed26f8127d7495cbba22b6..a7b84995735926ef868e15030ea6f86087dfa666 100755 (executable)
@@ -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
 
index 586788b31216cfd415acbfd62bd29637c7844345..05f80885eec5d23360f282187bc62a33acd51f07 100755 (executable)
@@ -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