notmuch.el: controlling what does and doesn't get expanded in searches
[notmuch-archives.git] / 13 / a6074c16b059e30b4558fd3148773f7dc50c57
1 Return-Path: <bremner@tesseract.cs.unb.ca>\r
2 X-Original-To: notmuch@notmuchmail.org\r
3 Delivered-To: notmuch@notmuchmail.org\r
4 Received: from localhost (localhost [127.0.0.1])\r
5  by arlo.cworth.org (Postfix) with ESMTP id C2F896DE1BD3\r
6  for <notmuch@notmuchmail.org>; Sun,  5 Apr 2015 16:03:56 -0700 (PDT)\r
7 X-Virus-Scanned: Debian amavisd-new at cworth.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: 0.488\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=0.488 tagged_above=-999 required=5 tests=[AWL=0.478, \r
12  T_HEADER_FROM_DIFFERENT_DOMAINS=0.01] autolearn=disabled\r
13 Received: from arlo.cworth.org ([127.0.0.1])\r
14  by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
15  with ESMTP id SVGGayr289jQ for <notmuch@notmuchmail.org>;\r
16  Sun,  5 Apr 2015 16:03:54 -0700 (PDT)\r
17 Received: from mx.xen14.node3324.gplhost.com (gitolite.debian.net\r
18  [87.98.215.224])\r
19  by arlo.cworth.org (Postfix) with ESMTPS id 5AA656DE1BD5\r
20  for <notmuch@notmuchmail.org>; Sun,  5 Apr 2015 16:03:53 -0700 (PDT)\r
21 Received: from remotemail by mx.xen14.node3324.gplhost.com with local (Exim\r
22  4.80) (envelope-from <bremner@tesseract.cs.unb.ca>)\r
23  id 1YetZP-0002rI-R0; Sun, 05 Apr 2015 23:03:11 +0000\r
24 Received: (nullmailer pid 2253 invoked by uid 1000); Sun, 05 Apr 2015\r
25  22:59:25 -0000\r
26 From: David Bremner <david@tethera.net>\r
27 To: notmuch@notmuchmail.org\r
28 Subject: [WIP2 09/12] cli/search: add  metadata element to structured output\r
29 Date: Mon,  6 Apr 2015 07:59:11 +0900\r
30 Message-Id: <1428274754-1698-10-git-send-email-david@tethera.net>\r
31 X-Mailer: git-send-email 2.1.4\r
32 In-Reply-To: <1428274754-1698-1-git-send-email-david@tethera.net>\r
33 References: <1428274754-1698-1-git-send-email-david@tethera.net>\r
34 MIME-Version: 1.0\r
35 Content-Type: text/plain; charset=UTF-8\r
36 Content-Transfer-Encoding: 8bit\r
37 X-BeenThere: notmuch@notmuchmail.org\r
38 X-Mailman-Version: 2.1.18\r
39 Precedence: list\r
40 List-Id: "Use and development of the notmuch mail system."\r
41  <notmuch.notmuchmail.org>\r
42 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
43  <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
44 List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
45 List-Post: <mailto:notmuch@notmuchmail.org>\r
46 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
47 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
48  <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
49 X-List-Received-Date: Sun, 05 Apr 2015 23:03:56 -0000\r
50 \r
51 As before, we force the test suite to use format version 2 in order\r
52 not to break. This is probably not the solution for the final version\r
53 of these patches.\r
54 ---\r
55  devel/schemata               | 10 +++++-----\r
56  notmuch-search.c             | 18 +++++++++---------\r
57  test/T070-insert.sh          |  2 +-\r
58  test/T090-search-output.sh   | 20 ++++++++++----------\r
59  test/T095-address.sh         |  4 ++--\r
60  test/T160-json.sh            |  4 ++--\r
61  test/T170-sexp.sh            |  4 ++--\r
62  test/T470-missing-headers.sh |  2 +-\r
63  test/test-lib.sh             |  8 ++++++++\r
64  9 files changed, 40 insertions(+), 32 deletions(-)\r
65 \r
66 diff --git a/devel/schemata b/devel/schemata\r
67 index 02f7cc0..e297adf 100644\r
68 --- a/devel/schemata\r
69 +++ b/devel/schemata\r
70 @@ -144,19 +144,19 @@ notmuch search schema\r
71  ---------------------\r
72  \r
73  # --output=summary\r
74 -search_summary = [thread_summary*]\r
75 +search_summary = [database_metadata, thread_summary*]\r
76  \r
77  # --output=threads\r
78 -search_threads = [threadid*]\r
79 +search_threads = [database_metadata, threadid*]\r
80  \r
81  # --output=messages\r
82 -search_messages = [messageid*]\r
83 +search_messages = [database_metadata, messageid*]\r
84  \r
85  # --output=files\r
86 -search_files = [string*]\r
87 +search_files = [database_metadata, string*]\r
88  \r
89  # --output=tags\r
90 -search_tags = [string*]\r
91 +search_tags = [database_metadata, string*]\r
92  \r
93  thread_summary = {\r
94      database:       database_metadata\r
95 diff --git a/notmuch-search.c b/notmuch-search.c\r
96 index 994ae58..5d17dac 100644\r
97 --- a/notmuch-search.c\r
98 +++ b/notmuch-search.c\r
99 @@ -122,7 +122,8 @@ do_search_threads (search_context_t *ctx)\r
100      if (threads == NULL)\r
101         return 1;\r
102  \r
103 -    format->begin_list (format);\r
104 +    sprinter_start_output (format, ctx->query,\r
105 +                          (ctx->output == OUTPUT_THREADS) ? "threads" : "summary");\r
106  \r
107      for (i = 0;\r
108          notmuch_threads_valid (threads) && (ctx->limit < 0 || i < ctx->offset + ctx->limit);\r
109 @@ -238,8 +239,7 @@ do_search_threads (search_context_t *ctx)\r
110         notmuch_thread_destroy (thread);\r
111      }\r
112  \r
113 -    format->end (format);\r
114 -\r
115 +    sprinter_finish_output (format);\r
116      return 0;\r
117  }\r
118  \r
119 @@ -423,7 +423,7 @@ do_search_messages (search_context_t *ctx)\r
120      if (messages == NULL)\r
121         return 1;\r
122  \r
123 -    format->begin_list (format);\r
124 +    sprinter_start_output (format, ctx->query, "messages");\r
125  \r
126      for (i = 0;\r
127          notmuch_messages_valid (messages) && (ctx->limit < 0 || i < ctx->offset + ctx->limit);\r
128 @@ -486,8 +486,7 @@ do_search_messages (search_context_t *ctx)\r
129  \r
130      notmuch_messages_destroy (messages);\r
131  \r
132 -    format->end (format);\r
133 -\r
134 +    sprinter_finish_output (format);\r
135      return 0;\r
136  }\r
137  \r
138 @@ -505,6 +504,8 @@ do_search_tags (const search_context_t *ctx)\r
139       * specified? */\r
140  \r
141      /* Special-case query of "*" for better performance. */\r
142 +\r
143 +\r
144      if (strcmp (notmuch_query_get_query_string (query), "*") == 0) {\r
145         tags = notmuch_database_get_all_tags (notmuch);\r
146      } else {\r
147 @@ -517,7 +518,7 @@ do_search_tags (const search_context_t *ctx)\r
148      if (tags == NULL)\r
149         return 1;\r
150  \r
151 -    format->begin_list (format);\r
152 +    sprinter_start_output (format, query, "tags");\r
153  \r
154      for (;\r
155          notmuch_tags_valid (tags);\r
156 @@ -535,8 +536,7 @@ do_search_tags (const search_context_t *ctx)\r
157      if (messages)\r
158         notmuch_messages_destroy (messages);\r
159  \r
160 -    format->end (format);\r
161 -\r
162 +    sprinter_finish_output (format);\r
163      return 0;\r
164  }\r
165  \r
166 diff --git a/test/T070-insert.sh b/test/T070-insert.sh\r
167 index 48d36af..67acbb0 100755\r
168 --- a/test/T070-insert.sh\r
169 +++ b/test/T070-insert.sh\r
170 @@ -64,7 +64,7 @@ output=$(notmuch search --output=files "subject:insert-subject" | wc -l)\r
171  test_expect_equal "$output" 2\r
172  \r
173  test_begin_subtest "Duplicate message does not change tags"\r
174 -output=$(notmuch search --format=json --output=tags "subject:insert-subject")\r
175 +output=$(NOTMUCH_SEARCH --format=json --output=tags "subject:insert-subject")\r
176  test_expect_equal_json "$output" '["inbox", "unread"]'\r
177  \r
178  test_begin_subtest "Insert message, add tag"\r
179 diff --git a/test/T090-search-output.sh b/test/T090-search-output.sh\r
180 index fe2ec9a..1dc74b6 100755\r
181 --- a/test/T090-search-output.sh\r
182 +++ b/test/T090-search-output.sh\r
183 @@ -35,7 +35,7 @@ EOF\r
184  test_expect_equal_file OUTPUT EXPECTED\r
185  \r
186  test_begin_subtest "--output=threads --format=json"\r
187 -notmuch search --format=json --output=threads '*' | sed -e s/\".*\"/\"THREADID\"/ >OUTPUT\r
188 +NOTMUCH_SEARCH --format=json --output=threads '*' | sed -e s/\".*\"/\"THREADID\"/ >OUTPUT\r
189  cat <<EOF >EXPECTED\r
190  ["THREADID",\r
191  "THREADID",\r
192 @@ -141,7 +141,7 @@ EOF\r
193  test_expect_equal_file OUTPUT EXPECTED\r
194  \r
195  test_begin_subtest "--output=messages --format=json"\r
196 -notmuch search --format=json --output=messages '*' >OUTPUT\r
197 +NOTMUCH_SEARCH --format=json --output=messages '*' >OUTPUT\r
198  cat <<EOF >EXPECTED\r
199  ["4EFC743A.3060609@april.org",\r
200  "877h1wv7mg.fsf@inf-8657.int-evry.fr",\r
201 @@ -199,19 +199,19 @@ EOF\r
202  test_expect_equal_file OUTPUT EXPECTED\r
203  \r
204  test_begin_subtest "--output=messages --format=json --duplicate=1"\r
205 -notmuch search --output=messages --format=json --duplicate=1 '*' >OUTPUT\r
206 +NOTMUCH_SEARCH --output=messages --format=json --duplicate=1 '*' >OUTPUT\r
207  # reuse same EXPECTED as above\r
208  test_expect_equal_file OUTPUT EXPECTED\r
209  \r
210  test_begin_subtest "--output=messages --format=json --duplicate=2"\r
211 -notmuch search --output=messages --format=json --duplicate=2 '*' >OUTPUT\r
212 +NOTMUCH_SEARCH --output=messages --format=json --duplicate=2 '*' >OUTPUT\r
213  cat <<EOF >EXPECTED\r
214  ["20091117232137.GA7669@griffis1.net"]\r
215  EOF\r
216  test_expect_equal_file OUTPUT EXPECTED\r
217  \r
218  test_begin_subtest "--output=messages --format=json --duplicate=3"\r
219 -notmuch search --output=messages --format=json --duplicate=3 '*' >OUTPUT\r
220 +NOTMUCH_SEARCH --output=messages --format=json --duplicate=3 '*' >OUTPUT\r
221  cat <<EOF >EXPECTED\r
222  []\r
223  EOF\r
224 @@ -338,7 +338,7 @@ EOF\r
225  test_expect_equal_file OUTPUT EXPECTED\r
226  \r
227  test_begin_subtest "--output=files --format=json"\r
228 -notmuch search --format=json --output=files '*' | notmuch_search_files_sanitize \\r
229 +NOTMUCH_SEARCH --format=json --output=files '*' | notmuch_search_files_sanitize \\r
230      | test_sort_json >OUTPUT\r
231  cat <<EOF | test_sort_json >EXPECTED\r
232  ["MAIL_DIR/cur/52:2,",\r
233 @@ -398,14 +398,14 @@ EOF\r
234  test_expect_equal_file OUTPUT EXPECTED\r
235  \r
236  test_begin_subtest "--output=files --format=json --duplicate=2"\r
237 -notmuch search --format=json --output=files --duplicate=2 '*' | notmuch_search_files_sanitize >OUTPUT\r
238 +NOTMUCH_SEARCH --format=json --output=files --duplicate=2 '*' | notmuch_search_files_sanitize >OUTPUT\r
239  cat <<EOF >EXPECTED\r
240  ["$dup2"]\r
241  EOF\r
242  test_expect_equal_file OUTPUT EXPECTED\r
243  \r
244  test_begin_subtest "--output=tags"\r
245 -notmuch search --output=tags '*' >OUTPUT\r
246 +NOTMUCH_SEARCH --output=tags '*' >OUTPUT\r
247  cat <<EOF >EXPECTED\r
248  attachment\r
249  inbox\r
250 @@ -415,7 +415,7 @@ EOF\r
251  test_expect_equal_file OUTPUT EXPECTED\r
252  \r
253  test_begin_subtest "--output=tags --format=json"\r
254 -notmuch search --format=json --output=tags '*' >OUTPUT\r
255 +NOTMUCH_SEARCH --format=json --output=tags '*' >OUTPUT\r
256  cat <<EOF >EXPECTED\r
257  ["attachment",\r
258  "inbox",\r
259 @@ -439,7 +439,7 @@ echo -n >EXPECTED\r
260  test_expect_equal_file OUTPUT EXPECTED\r
261  \r
262  test_begin_subtest "search --format=json for non-existent message prints proper empty json"\r
263 -notmuch search --format=json "no-message-matches-this" > OUTPUT\r
264 +NOTMUCH_SEARCH --format=json "no-message-matches-this" > OUTPUT\r
265  echo "[]" >EXPECTED\r
266  test_expect_equal_file OUTPUT EXPECTED\r
267  \r
268 diff --git a/test/T095-address.sh b/test/T095-address.sh\r
269 index ed0cac7..6eae30e 100755\r
270 --- a/test/T095-address.sh\r
271 +++ b/test/T095-address.sh\r
272 @@ -33,7 +33,7 @@ notmuch address '*' >OUTPUT\r
273  test_expect_equal_file OUTPUT EXPECTED\r
274  \r
275  test_begin_subtest "--output=sender --format=json"\r
276 -notmuch address --output=sender --format=json '*' >OUTPUT\r
277 +NOTMUCH_ADDRESS --output=sender --format=json '*' >OUTPUT\r
278  cat <<EOF >EXPECTED\r
279  [{"name": "François Boulogne", "address": "boulogne.f@gmail.com", "name-addr": "François Boulogne <boulogne.f@gmail.com>"},\r
280  {"name": "Olivier Berger", "address": "olivier.berger@it-sudparis.eu", "name-addr": "Olivier Berger <olivier.berger@it-sudparis.eu>"},\r
281 @@ -122,7 +122,7 @@ test_expect_equal_file OUTPUT EXPECTED\r
282  test_begin_subtest "--output=count --format=json"\r
283  # Since the iteration order of GHashTable is not specified, we\r
284  # preprocess and sort the results to keep the order stable here.\r
285 -notmuch address --output=count --format=json '*' | \\r
286 +NOTMUCH_ADDRESS --output=count --format=json '*' | \\r
287      sed -e 's/^\[//' -e 's/]$//' -e 's/,$//' | sort >OUTPUT\r
288  cat <<EOF >EXPECTED\r
289  {"name": "Adrian Perez de Castro", "address": "aperez@igalia.com", "name-addr": "Adrian Perez de Castro <aperez@igalia.com>", "count": 1}\r
290 diff --git a/test/T160-json.sh b/test/T160-json.sh\r
291 index 46c1314..10df42a 100755\r
292 --- a/test/T160-json.sh\r
293 +++ b/test/T160-json.sh\r
294 @@ -18,7 +18,7 @@ test_expect_equal_json "$output" "[[[{\"id\": \"${gen_msg_id}\", \"match\": true\r
295  \r
296  test_begin_subtest "Search message: json"\r
297  add_message "[subject]=\"json-search-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"json-search-message\""\r
298 -output=$(notmuch search --format=json "json-search-message" | notmuch_search_sanitize)\r
299 +output=$(NOTMUCH_SEARCH --format=json "json-search-message" | notmuch_search_sanitize)\r
300  test_expect_equal_json "$output" "[{\"thread\": \"XXX\",\r
301   \"timestamp\": 946728000,\r
302   \"date_relative\": \"2000-01-01\",\r
303 @@ -52,7 +52,7 @@ test_expect_equal_json "$output" "[[[{\"id\": \"$id\", \"match\": true, \"exclud\r
304  \r
305  test_begin_subtest "Search message: json, utf-8"\r
306  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
307 -output=$(notmuch search --format=json "jsön-search-méssage" | notmuch_search_sanitize)\r
308 +output=$(NOTMUCH_SEARCH --format=json "jsön-search-méssage" | notmuch_search_sanitize)\r
309  test_expect_equal_json "$output" "[{\"thread\": \"XXX\",\r
310   \"timestamp\": 946728000,\r
311   \"date_relative\": \"2000-01-01\",\r
312 diff --git a/test/T170-sexp.sh b/test/T170-sexp.sh\r
313 index 6c7402a..06a7f98 100755\r
314 --- a/test/T170-sexp.sh\r
315 +++ b/test/T170-sexp.sh\r
316 @@ -18,7 +18,7 @@ test_expect_equal "$output" "((((:id \"${gen_msg_id}\" :match t :excluded nil :f\r
317  \r
318  test_begin_subtest "Search message: sexp"\r
319  add_message "[subject]=\"sexp-search-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"sexp-search-message\""\r
320 -output=$(notmuch search --format=sexp "sexp-search-message" | notmuch_search_sanitize)\r
321 +output=$(NOTMUCH_SEARCH --format=sexp "sexp-search-message" | notmuch_search_sanitize)\r
322  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
323  \r
324  test_begin_subtest "Show message: sexp, utf-8"\r
325 @@ -43,7 +43,7 @@ test_expect_equal "$output" "((((:id \"$id\" :match t :excluded nil :filename \"\r
326  \r
327  test_begin_subtest "Search message: sexp, utf-8"\r
328  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
329 -output=$(notmuch search --format=sexp "jsön-search-méssage" | notmuch_search_sanitize)\r
330 +output=$(NOTMUCH_SEARCH --format=sexp "jsön-search-méssage" | notmuch_search_sanitize)\r
331  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
332  \r
333  \r
334 diff --git a/test/T470-missing-headers.sh b/test/T470-missing-headers.sh\r
335 index c3ee430..2e24a74 100755\r
336 --- a/test/T470-missing-headers.sh\r
337 +++ b/test/T470-missing-headers.sh\r
338 @@ -29,7 +29,7 @@ thread:XXX   2001-01-05 [1/1] (null);  (inbox unread)\r
339  thread:XXX   1970-01-01 [1/1] Notmuch Test Suite;  (inbox unread)"\r
340  \r
341  test_begin_subtest "Search: json"\r
342 -output=$(notmuch search --format=json '*' | notmuch_search_sanitize)\r
343 +output=$(NOTMUCH_SEARCH --format=json '*' | notmuch_search_sanitize)\r
344  test_expect_equal_json "$output" '\r
345  [\r
346      {\r
347 diff --git a/test/test-lib.sh b/test/test-lib.sh\r
348 index d30608a..d9d8ea1 100644\r
349 --- a/test/test-lib.sh\r
350 +++ b/test/test-lib.sh\r
351 @@ -664,11 +664,19 @@ test_emacs_expect_t () {\r
352         fi\r
353  }\r
354  \r
355 +NOTMUCH_ADDRESS () {\r
356 +    notmuch address --format-version=2 "${@}"\r
357 +}\r
358 +\r
359  NOTMUCH_NEW ()\r
360  {\r
361      notmuch new "${@}" | grep -v -E -e '^Processed [0-9]*( total)? file|Found [0-9]* total file'\r
362  }\r
363  \r
364 +NOTMUCH_SEARCH () {\r
365 +    notmuch search --format-version=2 "${@}"\r
366 +}\r
367 +\r
368  NOTMUCH_SHOW () {\r
369      notmuch show --format-version=2 "${@}"\r
370  }\r
371 -- \r
372 2.1.4\r
373 \r