[WIP2 09/12] cli/search: add metadata element to structured output
authorDavid Bremner <david@tethera.net>
Sun, 5 Apr 2015 22:59:11 +0000 (07:59 +0900)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 21:48:43 +0000 (14:48 -0700)
13/a6074c16b059e30b4558fd3148773f7dc50c57 [new file with mode: 0644]

diff --git a/13/a6074c16b059e30b4558fd3148773f7dc50c57 b/13/a6074c16b059e30b4558fd3148773f7dc50c57
new file mode 100644 (file)
index 0000000..68c73ec
--- /dev/null
@@ -0,0 +1,373 @@
+Return-Path: <bremner@tesseract.cs.unb.ca>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by arlo.cworth.org (Postfix) with ESMTP id C2F896DE1BD3\r
+ for <notmuch@notmuchmail.org>; Sun,  5 Apr 2015 16:03:56 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0.488\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0.488 tagged_above=-999 required=5 tests=[AWL=0.478, \r
+ T_HEADER_FROM_DIFFERENT_DOMAINS=0.01] autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id SVGGayr289jQ for <notmuch@notmuchmail.org>;\r
+ Sun,  5 Apr 2015 16:03:54 -0700 (PDT)\r
+Received: from mx.xen14.node3324.gplhost.com (gitolite.debian.net\r
+ [87.98.215.224])\r
+ by arlo.cworth.org (Postfix) with ESMTPS id 5AA656DE1BD5\r
+ for <notmuch@notmuchmail.org>; Sun,  5 Apr 2015 16:03:53 -0700 (PDT)\r
+Received: from remotemail by mx.xen14.node3324.gplhost.com with local (Exim\r
+ 4.80) (envelope-from <bremner@tesseract.cs.unb.ca>)\r
+ id 1YetZP-0002rI-R0; Sun, 05 Apr 2015 23:03:11 +0000\r
+Received: (nullmailer pid 2253 invoked by uid 1000); Sun, 05 Apr 2015\r
+ 22:59:25 -0000\r
+From: David Bremner <david@tethera.net>\r
+To: notmuch@notmuchmail.org\r
+Subject: [WIP2 09/12] cli/search: add  metadata element to structured output\r
+Date: Mon,  6 Apr 2015 07:59:11 +0900\r
+Message-Id: <1428274754-1698-10-git-send-email-david@tethera.net>\r
+X-Mailer: git-send-email 2.1.4\r
+In-Reply-To: <1428274754-1698-1-git-send-email-david@tethera.net>\r
+References: <1428274754-1698-1-git-send-email-david@tethera.net>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain; charset=UTF-8\r
+Content-Transfer-Encoding: 8bit\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.18\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Sun, 05 Apr 2015 23:03:56 -0000\r
+\r
+As before, we force the test suite to use format version 2 in order\r
+not to break. This is probably not the solution for the final version\r
+of these patches.\r
+---\r
+ devel/schemata               | 10 +++++-----\r
+ notmuch-search.c             | 18 +++++++++---------\r
+ test/T070-insert.sh          |  2 +-\r
+ test/T090-search-output.sh   | 20 ++++++++++----------\r
+ test/T095-address.sh         |  4 ++--\r
+ test/T160-json.sh            |  4 ++--\r
+ test/T170-sexp.sh            |  4 ++--\r
+ test/T470-missing-headers.sh |  2 +-\r
+ test/test-lib.sh             |  8 ++++++++\r
+ 9 files changed, 40 insertions(+), 32 deletions(-)\r
+\r
+diff --git a/devel/schemata b/devel/schemata\r
+index 02f7cc0..e297adf 100644\r
+--- a/devel/schemata\r
++++ b/devel/schemata\r
+@@ -144,19 +144,19 @@ notmuch search schema\r
+ ---------------------\r
\r
+ # --output=summary\r
+-search_summary = [thread_summary*]\r
++search_summary = [database_metadata, thread_summary*]\r
\r
+ # --output=threads\r
+-search_threads = [threadid*]\r
++search_threads = [database_metadata, threadid*]\r
\r
+ # --output=messages\r
+-search_messages = [messageid*]\r
++search_messages = [database_metadata, messageid*]\r
\r
+ # --output=files\r
+-search_files = [string*]\r
++search_files = [database_metadata, string*]\r
\r
+ # --output=tags\r
+-search_tags = [string*]\r
++search_tags = [database_metadata, string*]\r
\r
+ thread_summary = {\r
+     database:       database_metadata\r
+diff --git a/notmuch-search.c b/notmuch-search.c\r
+index 994ae58..5d17dac 100644\r
+--- a/notmuch-search.c\r
++++ b/notmuch-search.c\r
+@@ -122,7 +122,8 @@ do_search_threads (search_context_t *ctx)\r
+     if (threads == NULL)\r
+       return 1;\r
\r
+-    format->begin_list (format);\r
++    sprinter_start_output (format, ctx->query,\r
++                         (ctx->output == OUTPUT_THREADS) ? "threads" : "summary");\r
\r
+     for (i = 0;\r
+        notmuch_threads_valid (threads) && (ctx->limit < 0 || i < ctx->offset + ctx->limit);\r
+@@ -238,8 +239,7 @@ do_search_threads (search_context_t *ctx)\r
+       notmuch_thread_destroy (thread);\r
+     }\r
\r
+-    format->end (format);\r
+-\r
++    sprinter_finish_output (format);\r
+     return 0;\r
+ }\r
\r
+@@ -423,7 +423,7 @@ do_search_messages (search_context_t *ctx)\r
+     if (messages == NULL)\r
+       return 1;\r
\r
+-    format->begin_list (format);\r
++    sprinter_start_output (format, ctx->query, "messages");\r
\r
+     for (i = 0;\r
+        notmuch_messages_valid (messages) && (ctx->limit < 0 || i < ctx->offset + ctx->limit);\r
+@@ -486,8 +486,7 @@ do_search_messages (search_context_t *ctx)\r
\r
+     notmuch_messages_destroy (messages);\r
\r
+-    format->end (format);\r
+-\r
++    sprinter_finish_output (format);\r
+     return 0;\r
+ }\r
\r
+@@ -505,6 +504,8 @@ do_search_tags (const search_context_t *ctx)\r
+      * specified? */\r
\r
+     /* Special-case query of "*" for better performance. */\r
++\r
++\r
+     if (strcmp (notmuch_query_get_query_string (query), "*") == 0) {\r
+       tags = notmuch_database_get_all_tags (notmuch);\r
+     } else {\r
+@@ -517,7 +518,7 @@ do_search_tags (const search_context_t *ctx)\r
+     if (tags == NULL)\r
+       return 1;\r
\r
+-    format->begin_list (format);\r
++    sprinter_start_output (format, query, "tags");\r
\r
+     for (;\r
+        notmuch_tags_valid (tags);\r
+@@ -535,8 +536,7 @@ do_search_tags (const search_context_t *ctx)\r
+     if (messages)\r
+       notmuch_messages_destroy (messages);\r
\r
+-    format->end (format);\r
+-\r
++    sprinter_finish_output (format);\r
+     return 0;\r
+ }\r
\r
+diff --git a/test/T070-insert.sh b/test/T070-insert.sh\r
+index 48d36af..67acbb0 100755\r
+--- a/test/T070-insert.sh\r
++++ b/test/T070-insert.sh\r
+@@ -64,7 +64,7 @@ output=$(notmuch search --output=files "subject:insert-subject" | wc -l)\r
+ test_expect_equal "$output" 2\r
\r
+ test_begin_subtest "Duplicate message does not change tags"\r
+-output=$(notmuch search --format=json --output=tags "subject:insert-subject")\r
++output=$(NOTMUCH_SEARCH --format=json --output=tags "subject:insert-subject")\r
+ test_expect_equal_json "$output" '["inbox", "unread"]'\r
\r
+ test_begin_subtest "Insert message, add tag"\r
+diff --git a/test/T090-search-output.sh b/test/T090-search-output.sh\r
+index fe2ec9a..1dc74b6 100755\r
+--- a/test/T090-search-output.sh\r
++++ b/test/T090-search-output.sh\r
+@@ -35,7 +35,7 @@ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=threads --format=json"\r
+-notmuch search --format=json --output=threads '*' | sed -e s/\".*\"/\"THREADID\"/ >OUTPUT\r
++NOTMUCH_SEARCH --format=json --output=threads '*' | sed -e s/\".*\"/\"THREADID\"/ >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ ["THREADID",\r
+ "THREADID",\r
+@@ -141,7 +141,7 @@ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=messages --format=json"\r
+-notmuch search --format=json --output=messages '*' >OUTPUT\r
++NOTMUCH_SEARCH --format=json --output=messages '*' >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ ["4EFC743A.3060609@april.org",\r
+ "877h1wv7mg.fsf@inf-8657.int-evry.fr",\r
+@@ -199,19 +199,19 @@ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=messages --format=json --duplicate=1"\r
+-notmuch search --output=messages --format=json --duplicate=1 '*' >OUTPUT\r
++NOTMUCH_SEARCH --output=messages --format=json --duplicate=1 '*' >OUTPUT\r
+ # reuse same EXPECTED as above\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=messages --format=json --duplicate=2"\r
+-notmuch search --output=messages --format=json --duplicate=2 '*' >OUTPUT\r
++NOTMUCH_SEARCH --output=messages --format=json --duplicate=2 '*' >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ ["20091117232137.GA7669@griffis1.net"]\r
+ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=messages --format=json --duplicate=3"\r
+-notmuch search --output=messages --format=json --duplicate=3 '*' >OUTPUT\r
++NOTMUCH_SEARCH --output=messages --format=json --duplicate=3 '*' >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ []\r
+ EOF\r
+@@ -338,7 +338,7 @@ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=files --format=json"\r
+-notmuch search --format=json --output=files '*' | notmuch_search_files_sanitize \\r
++NOTMUCH_SEARCH --format=json --output=files '*' | notmuch_search_files_sanitize \\r
+     | test_sort_json >OUTPUT\r
+ cat <<EOF | test_sort_json >EXPECTED\r
+ ["MAIL_DIR/cur/52:2,",\r
+@@ -398,14 +398,14 @@ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=files --format=json --duplicate=2"\r
+-notmuch search --format=json --output=files --duplicate=2 '*' | notmuch_search_files_sanitize >OUTPUT\r
++NOTMUCH_SEARCH --format=json --output=files --duplicate=2 '*' | notmuch_search_files_sanitize >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ ["$dup2"]\r
+ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=tags"\r
+-notmuch search --output=tags '*' >OUTPUT\r
++NOTMUCH_SEARCH --output=tags '*' >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ attachment\r
+ inbox\r
+@@ -415,7 +415,7 @@ EOF\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=tags --format=json"\r
+-notmuch search --format=json --output=tags '*' >OUTPUT\r
++NOTMUCH_SEARCH --format=json --output=tags '*' >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ ["attachment",\r
+ "inbox",\r
+@@ -439,7 +439,7 @@ echo -n >EXPECTED\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "search --format=json for non-existent message prints proper empty json"\r
+-notmuch search --format=json "no-message-matches-this" > OUTPUT\r
++NOTMUCH_SEARCH --format=json "no-message-matches-this" > OUTPUT\r
+ echo "[]" >EXPECTED\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+diff --git a/test/T095-address.sh b/test/T095-address.sh\r
+index ed0cac7..6eae30e 100755\r
+--- a/test/T095-address.sh\r
++++ b/test/T095-address.sh\r
+@@ -33,7 +33,7 @@ notmuch address '*' >OUTPUT\r
+ test_expect_equal_file OUTPUT EXPECTED\r
\r
+ test_begin_subtest "--output=sender --format=json"\r
+-notmuch address --output=sender --format=json '*' >OUTPUT\r
++NOTMUCH_ADDRESS --output=sender --format=json '*' >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ [{"name": "François Boulogne", "address": "boulogne.f@gmail.com", "name-addr": "François Boulogne <boulogne.f@gmail.com>"},\r
+ {"name": "Olivier Berger", "address": "olivier.berger@it-sudparis.eu", "name-addr": "Olivier Berger <olivier.berger@it-sudparis.eu>"},\r
+@@ -122,7 +122,7 @@ test_expect_equal_file OUTPUT EXPECTED\r
+ test_begin_subtest "--output=count --format=json"\r
+ # Since the iteration order of GHashTable is not specified, we\r
+ # preprocess and sort the results to keep the order stable here.\r
+-notmuch address --output=count --format=json '*' | \\r
++NOTMUCH_ADDRESS --output=count --format=json '*' | \\r
+     sed -e 's/^\[//' -e 's/]$//' -e 's/,$//' | sort >OUTPUT\r
+ cat <<EOF >EXPECTED\r
+ {"name": "Adrian Perez de Castro", "address": "aperez@igalia.com", "name-addr": "Adrian Perez de Castro <aperez@igalia.com>", "count": 1}\r
+diff --git a/test/T160-json.sh b/test/T160-json.sh\r
+index 46c1314..10df42a 100755\r
+--- a/test/T160-json.sh\r
++++ b/test/T160-json.sh\r
+@@ -18,7 +18,7 @@ test_expect_equal_json "$output" "[[[{\"id\": \"${gen_msg_id}\", \"match\": true\r
\r
+ test_begin_subtest "Search message: json"\r
+ add_message "[subject]=\"json-search-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"json-search-message\""\r
+-output=$(notmuch search --format=json "json-search-message" | notmuch_search_sanitize)\r
++output=$(NOTMUCH_SEARCH --format=json "json-search-message" | notmuch_search_sanitize)\r
+ test_expect_equal_json "$output" "[{\"thread\": \"XXX\",\r
+  \"timestamp\": 946728000,\r
+  \"date_relative\": \"2000-01-01\",\r
+@@ -52,7 +52,7 @@ test_expect_equal_json "$output" "[[[{\"id\": \"$id\", \"match\": true, \"exclud\r
\r
+ test_begin_subtest "Search message: json, utf-8"\r
+ add_message "[subject]=\"json-search-utf8-body-sübjéct\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"jsön-search-méssage\""\r
+-output=$(notmuch search --format=json "jsön-search-méssage" | notmuch_search_sanitize)\r
++output=$(NOTMUCH_SEARCH --format=json "jsön-search-méssage" | notmuch_search_sanitize)\r
+ test_expect_equal_json "$output" "[{\"thread\": \"XXX\",\r
+  \"timestamp\": 946728000,\r
+  \"date_relative\": \"2000-01-01\",\r
+diff --git a/test/T170-sexp.sh b/test/T170-sexp.sh\r
+index 6c7402a..06a7f98 100755\r
+--- a/test/T170-sexp.sh\r
++++ b/test/T170-sexp.sh\r
+@@ -18,7 +18,7 @@ test_expect_equal "$output" "((((:id \"${gen_msg_id}\" :match t :excluded nil :f\r
\r
+ test_begin_subtest "Search message: sexp"\r
+ add_message "[subject]=\"sexp-search-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"sexp-search-message\""\r
+-output=$(notmuch search --format=sexp "sexp-search-message" | notmuch_search_sanitize)\r
++output=$(NOTMUCH_SEARCH --format=sexp "sexp-search-message" | notmuch_search_sanitize)\r
+ test_expect_equal "$output" "((:thread \"0000000000000002\" :timestamp 946728000 :date_relative \"2000-01-01\" :matched 1 :total 1 :authors \"Notmuch Test Suite\" :subject \"sexp-search-subject\" :query (\"id:$gen_msg_id\" nil) :tags (\"inbox\" \"unread\")))"\r
\r
+ test_begin_subtest "Show message: sexp, utf-8"\r
+@@ -43,7 +43,7 @@ test_expect_equal "$output" "((((:id \"$id\" :match t :excluded nil :filename \"\r
\r
+ test_begin_subtest "Search message: sexp, utf-8"\r
+ add_message "[subject]=\"sexp-search-utf8-body-sübjéct\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"jsön-search-méssage\""\r
+-output=$(notmuch search --format=sexp "jsön-search-méssage" | notmuch_search_sanitize)\r
++output=$(NOTMUCH_SEARCH --format=sexp "jsön-search-méssage" | notmuch_search_sanitize)\r
+ test_expect_equal "$output" "((:thread \"0000000000000005\" :timestamp 946728000 :date_relative \"2000-01-01\" :matched 1 :total 1 :authors \"Notmuch Test Suite\" :subject \"sexp-search-utf8-body-sübjéct\" :query (\"id:$gen_msg_id\" nil) :tags (\"inbox\" \"unread\")))"\r
\r
\r
+diff --git a/test/T470-missing-headers.sh b/test/T470-missing-headers.sh\r
+index c3ee430..2e24a74 100755\r
+--- a/test/T470-missing-headers.sh\r
++++ b/test/T470-missing-headers.sh\r
+@@ -29,7 +29,7 @@ thread:XXX   2001-01-05 [1/1] (null);  (inbox unread)\r
+ thread:XXX   1970-01-01 [1/1] Notmuch Test Suite;  (inbox unread)"\r
\r
+ test_begin_subtest "Search: json"\r
+-output=$(notmuch search --format=json '*' | notmuch_search_sanitize)\r
++output=$(NOTMUCH_SEARCH --format=json '*' | notmuch_search_sanitize)\r
+ test_expect_equal_json "$output" '\r
+ [\r
+     {\r
+diff --git a/test/test-lib.sh b/test/test-lib.sh\r
+index d30608a..d9d8ea1 100644\r
+--- a/test/test-lib.sh\r
++++ b/test/test-lib.sh\r
+@@ -664,11 +664,19 @@ test_emacs_expect_t () {\r
+       fi\r
+ }\r
\r
++NOTMUCH_ADDRESS () {\r
++    notmuch address --format-version=2 "${@}"\r
++}\r
++\r
+ NOTMUCH_NEW ()\r
+ {\r
+     notmuch new "${@}" | grep -v -E -e '^Processed [0-9]*( total)? file|Found [0-9]* total file'\r
+ }\r
\r
++NOTMUCH_SEARCH () {\r
++    notmuch search --format-version=2 "${@}"\r
++}\r
++\r
+ NOTMUCH_SHOW () {\r
+     notmuch show --format-version=2 "${@}"\r
+ }\r
+-- \r
+2.1.4\r
+\r