From cf646ff42d367f0fd3aa358dc20e5894d07d853c Mon Sep 17 00:00:00 2001 From: David Bremner Date: Wed, 23 Mar 2016 07:54:52 +2100 Subject: [PATCH] [PATCH 11/13] CLI: add notmuch-config support for named queries --- 9e/445cc89dd45a6450c4f1d1c54083c72c5b3928 | 334 ++++++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 9e/445cc89dd45a6450c4f1d1c54083c72c5b3928 diff --git a/9e/445cc89dd45a6450c4f1d1c54083c72c5b3928 b/9e/445cc89dd45a6450c4f1d1c54083c72c5b3928 new file mode 100644 index 000000000..888d52eaf --- /dev/null +++ b/9e/445cc89dd45a6450c4f1d1c54083c72c5b3928 @@ -0,0 +1,334 @@ +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 6BDAD6DE092B + for ; Tue, 22 Mar 2016 03:56:08 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: -0.029 +X-Spam-Level: +X-Spam-Status: No, score=-0.029 tagged_above=-999 required=5 + tests=[AWL=-0.018, 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 c5M-Iw1F0ae5 for ; + Tue, 22 Mar 2016 03:56:00 -0700 (PDT) +Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) + by arlo.cworth.org (Postfix) with ESMTPS id D4D7E6DE0297 + for ; Tue, 22 Mar 2016 03:55:25 -0700 (PDT) +Received: from remotemail by fethera.tethera.net with local (Exim 4.84) + (envelope-from ) + id 1aiJyj-00015k-9C; Tue, 22 Mar 2016 06:56:01 -0400 +Received: (nullmailer pid 14089 invoked by uid 1000); + Tue, 22 Mar 2016 10:55:11 -0000 +From: David Bremner +To: notmuch@notmuchmail.org +Subject: [PATCH 11/13] CLI: add notmuch-config support for named queries +Date: Tue, 22 Mar 2016 07:54:52 -0300 +Message-Id: <1458644094-13951-12-git-send-email-david@tethera.net> +X-Mailer: git-send-email 2.7.0 +In-Reply-To: <1458644094-13951-1-git-send-email-david@tethera.net> +References: <1458644094-13951-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: Tue, 22 Mar 2016 10:56:08 -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 | 5 +++ + 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, 158 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 40c1272..98b3c1a 100644 +--- a/doc/man1/notmuch-config.rst ++++ b/doc/man1/notmuch-config.rst +@@ -132,6 +132,11 @@ The available configuration items are described below. + + Default: ``gpg``. + ++ **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 cfc549d..121fec6 100644 +--- a/notmuch-config.c ++++ b/notmuch-config.c +@@ -751,6 +751,28 @@ _item_split (char *item, char **group, char **key) + } + + #define OPTION_PREFIX "options." ++#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, OPTION_PREFIX) == 0) { + printf ("%s\n", + notmuch_options_get (item + strlen (OPTION_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; + +@@ -850,6 +911,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; +@@ -885,7 +971,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 30d420e..8c55441 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 c37ba21..39ee885 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_options_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; + options.compact=something +-options.field_processor=something" ++options.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 98abbe2..00df2bd 100644 +--- a/test/test-lib.sh ++++ b/test/test-lib.sh +@@ -745,6 +745,11 @@ notmuch_options_sanitize () + sed 's/^options[.]\(.*\)=.*$/options.\1=something/' + } + ++notmuch_config_sanitize () ++{ ++ notmuch_dir_sanitize | notmuch_options_sanitize ++} ++ + # End of notmuch helper functions + + # Use test_set_prereq to tell that a particular prerequisite is available. +-- +2.7.0 + -- 2.26.2