Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 5B6BB6DE093A for ; Sat, 7 May 2016 17:05:22 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.013 X-Spam-Level: X-Spam-Status: No, score=-0.013 tagged_above=-999 required=5 tests=[AWL=-0.002, SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DjcCcOJZccu6 for ; Sat, 7 May 2016 17:05:14 -0700 (PDT) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by arlo.cworth.org (Postfix) with ESMTPS id B936E6DE02B7 for ; Sat, 7 May 2016 17:05:00 -0700 (PDT) Received: from remotemail by fethera.tethera.net with local (Exim 4.84) (envelope-from ) id 1azCDO-00014P-Ly; Sat, 07 May 2016 20:04:54 -0400 Received: (nullmailer pid 17199 invoked by uid 1000); Sun, 08 May 2016 00:04:53 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [Patch v4 09/12] CLI: add notmuch-config support for named queries Date: Sat, 7 May 2016 21:04:46 -0300 Message-Id: <1462665889-17121-10-git-send-email-david@tethera.net> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1462665889-17121-1-git-send-email-david@tethera.net> References: <1462665889-17121-1-git-send-email-david@tethera.net> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 May 2016 00:05:22 -0000 Most of the infrastructure here is general, only the validation/dispatch is hardcoded to a particular prefix. A notable change in behaviour is that notmuch-config now opens the database e.g. on every call to list, which fails with an error message if the database doesn't exit yet. --- doc/man1/notmuch-config.rst | 6 ++++ notmuch-config.c | 88 ++++++++++++++++++++++++++++++++++++++++++++- test/Makefile.local | 2 +- test/T030-config.sh | 12 ++++--- test/T600-named-queries.sh | 53 +++++++++++++++++++++++++++ test/test-lib.sh | 5 +++ 6 files changed, 159 insertions(+), 7 deletions(-) create mode 100755 test/T600-named-queries.sh diff --git a/doc/man1/notmuch-config.rst b/doc/man1/notmuch-config.rst index 26a8eb1..5a517eb 100644 --- a/doc/man1/notmuch-config.rst +++ b/doc/man1/notmuch-config.rst @@ -138,6 +138,12 @@ The available configuration items are described below. "compact" (see **notmuch-compact(1)**) and "field_processor" (see **notmuch-search-terms(7)**). + **query.** + + Expansion for named query called . See + **notmuch-search-terms(7)** for more information about named + queries. + ENVIRONMENT =========== diff --git a/notmuch-config.c b/notmuch-config.c index 97a46fa..e4f47e4 100644 --- a/notmuch-config.c +++ b/notmuch-config.c @@ -751,6 +751,28 @@ _item_split (char *item, char **group, char **key) } #define BUILT_WITH_PREFIX "built_with." +#define QUERY_PREFIX "query." + +static int +_print_db_config(notmuch_config_t *config, const char *name) +{ + notmuch_database_t *notmuch; + char *val; + + if (notmuch_database_open (notmuch_config_get_database_path (config), + NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much)) + return EXIT_FAILURE; + + /* XXX Handle UUID mismatch? */ + + if (print_status_database ("notmuch config", notmuch, + notmuch_database_get_config (notmuch, name, &val))) + return EXIT_FAILURE; + + puts (val); + + return EXIT_SUCCESS; +} static int notmuch_config_command_get (notmuch_config_t *config, char *item) @@ -778,6 +800,8 @@ notmuch_config_command_get (notmuch_config_t *config, char *item) } else if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) { printf ("%s\n", notmuch_built_with (item + strlen (BUILT_WITH_PREFIX)) ? "true" : "false"); + } else if (STRNCMP_LITERAL (item, QUERY_PREFIX) == 0) { + return _print_db_config (config, item); } else { char **value; size_t i, length; @@ -805,6 +829,39 @@ notmuch_config_command_get (notmuch_config_t *config, char *item) } static int +_set_db_config(notmuch_config_t *config, const char *key, int argc, char **argv) +{ + notmuch_database_t *notmuch; + const char *val = ""; + + if (argc > 1) { + /* XXX handle lists? */ + fprintf (stderr, "notmuch config set: at most one value expected for %s\n", key); + return EXIT_FAILURE; + } + + if (argc > 0) { + val = argv[0]; + } + + if (notmuch_database_open (notmuch_config_get_database_path (config), + NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much)) + return EXIT_FAILURE; + + /* XXX Handle UUID mismatch? */ + + if (print_status_database ("notmuch config", notmuch, + notmuch_database_set_config (notmuch, key, val))) + return EXIT_FAILURE; + + if (print_status_database ("notmuch config", notmuch, + notmuch_database_close (notmuch))) + return EXIT_FAILURE; + + return EXIT_SUCCESS; +} + +static int notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char *argv[]) { char *group, *key; @@ -814,6 +871,10 @@ notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char return 1; } + if (STRNCMP_LITERAL (item, QUERY_PREFIX) == 0) { + return _set_db_config (config, item, argc, argv); + } + if (_item_split (item, &group, &key)) return 1; @@ -852,6 +913,31 @@ _notmuch_config_list_options () { } static int +_list_db_config (notmuch_config_t *config) +{ + notmuch_database_t *notmuch; + notmuch_config_list_t *list; + + if (notmuch_database_open (notmuch_config_get_database_path (config), + NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much)) + return EXIT_FAILURE; + + /* XXX Handle UUID mismatch? */ + + + if (print_status_database ("notmuch config", notmuch, + notmuch_database_get_config_list (notmuch, "", &list))) + return EXIT_FAILURE; + + for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) { + printf("%s=%s\n", notmuch_config_list_key (list), notmuch_config_list_value(list)); + } + notmuch_config_list_destroy (list); + + return EXIT_SUCCESS; +} + +static int notmuch_config_command_list (notmuch_config_t *config) { char **groups; @@ -887,7 +973,7 @@ notmuch_config_command_list (notmuch_config_t *config) g_strfreev (groups); _notmuch_config_list_options (); - return 0; + return _list_db_config (config); } int diff --git a/test/Makefile.local b/test/Makefile.local index 022f2cf..91b3693 100644 --- a/test/Makefile.local +++ b/test/Makefile.local @@ -19,7 +19,7 @@ $(dir)/hex-xcode: $(dir)/hex-xcode.o command-line-arguments.o util/libutil.a $(call quiet,CC) $^ -o $@ $(LDFLAGS) $(TALLOC_LDFLAGS) random_corpus_deps = $(dir)/random-corpus.o $(dir)/database-test.o \ - notmuch-config.o command-line-arguments.o \ + notmuch-config.o status.o command-line-arguments.o \ lib/libnotmuch.a util/libutil.a \ parse-time-string/libparse-time-string.a diff --git a/test/T030-config.sh b/test/T030-config.sh index 437269f..b8d5a86 100755 --- a/test/T030-config.sh +++ b/test/T030-config.sh @@ -43,10 +43,10 @@ notmuch config set foo.nonexistent test_expect_equal "$(notmuch config get foo.nonexistent)" "" test_begin_subtest "List all items" -notmuch config set database.path "/canonical/path" -output=$(notmuch config list | notmuch_built_with_sanitize) -test_expect_equal "$output" "\ -database.path=/canonical/path +notmuch config list 2>&1 | notmuch_config_sanitize > OUTPUT +cat < EXPECTED +Error opening database at MAIL_DIR/.notmuch: No such file or directory +database.path=MAIL_DIR user.name=Notmuch Test Suite user.primary_email=test_suite@notmuchmail.org user.other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org @@ -58,7 +58,9 @@ crypto.gpg_path=gpg foo.string=this is another string value foo.list=this;is another;list value; built_with.compact=something -built_with.field_processor=something" +built_with.field_processor=something +EOF +test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "Top level --config=FILE option" cp "${NOTMUCH_CONFIG}" alt-config diff --git a/test/T600-named-queries.sh b/test/T600-named-queries.sh new file mode 100755 index 0000000..0922620 --- /dev/null +++ b/test/T600-named-queries.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +test_description='named queries' +. ./test-lib.sh || exit 1 + +QUERYSTR="date:2009-11-18..2009-11-18 and tag:unread" + +test_expect_code 1 "error adding named query before initializing DB" \ + "notmuch config set query.test \"$QUERYSTR\"" + +add_email_corpus + +test_expect_success "adding named query" \ + "notmuch config set query.test \"$QUERYSTR\"" + +QUERYSTR2="query:test and subject:Maildir" +test_expect_success "adding nested named query" \ + "notmuch config set query.test2 \"$QUERYSTR2\"" + +test_begin_subtest "retrieve named query" +output=$(notmuch config get query.test) +test_expect_equal "$QUERYSTR" "$output" + +test_begin_subtest "List all queries" +notmuch config list | grep ^query | notmuch_config_sanitize > OUTPUT +cat < EXPECTED +query.test=date:2009-11-18..2009-11-18 and tag:unread +query.test2=query:test and subject:Maildir +EOF +test_expect_equal_file EXPECTED OUTPUT + +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 + +test_begin_subtest "delete named queries" +notmuch dump > BEFORE +notmuch config set query.test +notmuch dump | grep '^#@' > OUTPUT +cat< EXPECTED +#@ query.test2 query%3atest%20and%20subject%3aMaildir +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "restore named queries" +notmuch restore < BEFORE +notmuch dump | grep '^#@' > OUTPUT +test_expect_equal_file QUERIES.BEFORE OUTPUT + +test_done diff --git a/test/test-lib.sh b/test/test-lib.sh index 68a8774..8fef275 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -745,6 +745,11 @@ notmuch_built_with_sanitize () sed 's/^built_with[.]\(.*\)=.*$/built_with.\1=something/' } +notmuch_config_sanitize () +{ + notmuch_dir_sanitize | notmuch_built_with_sanitize +} + # End of notmuch helper functions # Use test_set_prereq to tell that a particular prerequisite is available. -- 2.8.1