diff --git a/doc/man1/notmuch-config.rst b/doc/man1/notmuch-config.rst index 223d2de5..32290a38 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 24c16833..c4283576 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 * @@ -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 { diff --git a/test/T030-config.sh b/test/T030-config.sh index c87d35b6..b22d8f29 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 < 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< 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 <> 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< 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 < 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