From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:4a6f::]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id 8BqnDHMRbWCcIAEAgWs5BA (envelope-from ) for ; Wed, 07 Apr 2021 03:57:07 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id qFmEBnMRbWCVRwAAB5/wlQ (envelope-from ) for ; Wed, 07 Apr 2021 01:57:07 +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) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 92091A0C4 for ; Wed, 7 Apr 2021 03:57:06 +0200 (CEST) Received: from nmbug.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id C6ACD29071; Tue, 6 Apr 2021 21:56:16 -0400 (EDT) Received: from fethera.tethera.net (fethera.tethera.net [IPv6:2607:5300:60:c5::1]) by mail.notmuchmail.org (Postfix) with ESMTP id B6A7929036 for ; Tue, 6 Apr 2021 21:55:49 -0400 (EDT) Received: by fethera.tethera.net (Postfix, from userid 1001) id AE0F85FA96; Tue, 6 Apr 2021 21:55:49 -0400 (EDT) Received: (nullmailer pid 2964248 invoked by uid 1000); Wed, 07 Apr 2021 01:55:35 -0000 From: David Bremner To: notmuch@notmuchmail.org Cc: David Bremner Subject: [PATCH 21/28] CLI/config: default to storing all config in external files Date: Tue, 6 Apr 2021 22:55:23 -0300 Message-Id: <20210407015530.2964017-22-david@tethera.net> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210407015530.2964017-1-david@tethera.net> References: <20210407015530.2964017-1-david@tethera.net> MIME-Version: 1.0 Message-ID-Hash: PND75UOKASGE65T32YWD2N6UQYYQGYCP X-Message-ID-Hash: PND75UOKASGE65T32YWD2N6UQYYQGYCP 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 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1617760626; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=5UPMApyHeW5c0LJQSYC/26Swvsf9oCK00lZaXrok3Qg=; b=eDZs1UJnimo8KQjI6tyvp23UgXdHvJNoJFbEVg96cVdKqWO2TKHWLKC3AgYvUAKpiOTDHB NGucn5USqdZKN3B730PqtzY4MzQDKtjCWCLIglaNCWe93S9BvCd8dTzWaVO7wBlQZkGlc2 uXldESJU+SWgbqUjQovyGD9ONvL3wnn4HfXfQmyIXJDhssk42cof4MmRLagTklH9hwY4FQ UFyKbCpfSJ8aE9BCOeTb9WpyZ8kItwwqp+zJRmmbAWv/L5Pr3C8tYSxA64Y28Nt0BgV1to wNIcieawhUwwT46qD1kcZed69Gc9Xh5C7JQyfcRCkglcMDzlU7q+hSLeLQ7M0w== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1617760626; a=rsa-sha256; cv=none; b=qdzDHxV/TgONc2c8SsR2YGfaDNVbpbZPhFgCuIpVUIDWgKOdmsK9ZCopp0FuD38E9MpiYz NsZwFS+/j5x19A1Cdfk/jXdnFu4gAHaGfofirSkU6NKp4SDm+JdQoaiiN4LfSp1R24x21O 79Nu08KfpAQAXZGVfoLmruKqGUyP/jQJODBMSf0TUaaoawcekem0ws5KfbuT0gkVJmxfSo tqGg2fe5L956um9/6kNqOgGXa9dhIdQC6yRYgRLWTxUIL3U+07eGzPxYO6mkwWAclgkp5Z k/+I7KaZmWrJxtAhTjU8Jv+bueKY6UVMwBGGm4fZ/HXPcDERgUwZGPLZdeng8A== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=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-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: 92091A0C4 X-Spam-Score: -0.88 X-Migadu-Scanner: scn0.migadu.com X-TUID: PfAqjKFHMlmt 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 | 6 +++++- doc/man1/notmuch.rst | 4 +++- notmuch-config.c | 43 ++++++++++++++++++++++++++----------- test/T030-config.sh | 20 +++++++++++++++++ test/T600-named-queries.sh | 17 ++++++--------- test/T750-user-header.sh | 8 ------- 6 files changed, 66 insertions(+), 32 deletions(-) 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 -- 2.30.2