From: David Bremner Date: Sun, 8 May 2016 00:04:46 +0000 (+2100) Subject: [Patch v4 09/12] CLI: add notmuch-config support for named queries X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=ce301ea7839b7663b2db6186cf47693c5ef0b9f1;p=notmuch-archives.git [Patch v4 09/12] CLI: add notmuch-config support for named queries --- diff --git a/6c/54ad79e15b331dc0da9f969fc6451cf53340df b/6c/54ad79e15b331dc0da9f969fc6451cf53340df new file mode 100644 index 000000000..05cf5f0ca --- /dev/null +++ b/6c/54ad79e15b331dc0da9f969fc6451cf53340df @@ -0,0 +1,335 @@ +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 +