Re: [PATCH] emacs: wash: make word-wrap bound message width
[notmuch-archives.git] / bc / c4b2ebd850db82e5fc7ef9351dcace5bb4e819
1 Return-Path: <sojkam1@fel.cvut.cz>\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 olra.theworths.org (Postfix) with ESMTP id 30F7E431FAF\r
6         for <notmuch@notmuchmail.org>; Sat,  1 Nov 2014 17:50:27 -0700 (PDT)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: -2.3\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5\r
12         tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled\r
13 Received: from olra.theworths.org ([127.0.0.1])\r
14         by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
15         with ESMTP id 2aIDNVQnScby for <notmuch@notmuchmail.org>;\r
16         Sat,  1 Nov 2014 17:50:18 -0700 (PDT)\r
17 Received: from max.feld.cvut.cz (max.feld.cvut.cz [147.32.192.36])\r
18         by olra.theworths.org (Postfix) with ESMTP id E652D431FDC\r
19         for <notmuch@notmuchmail.org>; Sat,  1 Nov 2014 17:50:13 -0700 (PDT)\r
20 Received: from localhost (unknown [192.168.200.7])\r
21         by max.feld.cvut.cz (Postfix) with ESMTP id 977725CD28B\r
22         for <notmuch@notmuchmail.org>; Sun,  2 Nov 2014 01:50:13 +0100 (CET)\r
23 X-Virus-Scanned: IMAP STYX AMAVIS\r
24 Received: from max.feld.cvut.cz ([192.168.200.1])\r
25         by localhost (styx.feld.cvut.cz [192.168.200.7]) (amavisd-new,\r
26         port 10044) with ESMTP id KTUChTzKxDGu for <notmuch@notmuchmail.org>;\r
27         Sun,  2 Nov 2014 01:50:10 +0100 (CET)\r
28 Received: from imap.feld.cvut.cz (imap.feld.cvut.cz [147.32.192.34])\r
29         by max.feld.cvut.cz (Postfix) with ESMTP id DBE5F5CD291\r
30         for <notmuch@notmuchmail.org>; Sun,  2 Nov 2014 01:50:06 +0100 (CET)\r
31 Received: from wsh by steelpick.2x.cz with local (Exim 4.84)\r
32         (envelope-from <sojkam1@fel.cvut.cz>)\r
33         id 1XkjMq-00085L-JZ; Sun, 02 Nov 2014 01:50:04 +0100\r
34 From: Michal Sojka <sojkam1@fel.cvut.cz>\r
35 To: notmuch@notmuchmail.org\r
36 Subject: [PATCH 08/10] cli: address: Do not output duplicate addresses\r
37 Date: Sun,  2 Nov 2014 01:49:58 +0100\r
38 Message-Id: <1414889400-30977-9-git-send-email-sojkam1@fel.cvut.cz>\r
39 X-Mailer: git-send-email 2.1.1\r
40 In-Reply-To: <1414889400-30977-1-git-send-email-sojkam1@fel.cvut.cz>\r
41 References: <1414889400-30977-1-git-send-email-sojkam1@fel.cvut.cz>\r
42 MIME-Version: 1.0\r
43 Content-Type: text/plain; charset=UTF-8\r
44 Content-Transfer-Encoding: 8bit\r
45 X-BeenThere: notmuch@notmuchmail.org\r
46 X-Mailman-Version: 2.1.13\r
47 Precedence: list\r
48 List-Id: "Use and development of the notmuch mail system."\r
49         <notmuch.notmuchmail.org>\r
50 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
51         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
52 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
53 List-Post: <mailto:notmuch@notmuchmail.org>\r
54 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
55 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
56         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
57 X-List-Received-Date: Sun, 02 Nov 2014 00:50:27 -0000\r
58 \r
59 This filters out duplicate addresses from address command output.\r
60 \r
61 It also also adds tests for the address command.\r
62 \r
63 The code here is an extended version of a patch from Jani Nikula.\r
64 ---\r
65  doc/man1/notmuch-address.rst |   2 +-\r
66  notmuch-search.c             |  40 ++++++++++++++++-\r
67  test/T095-address.sh         | 100 +++++++++++++++++++++++++++++++++++++++++++\r
68  3 files changed, 140 insertions(+), 2 deletions(-)\r
69  create mode 100755 test/T095-address.sh\r
70 \r
71 diff --git a/doc/man1/notmuch-address.rst b/doc/man1/notmuch-address.rst\r
72 index 8109f11..96512b7 100644\r
73 --- a/doc/man1/notmuch-address.rst\r
74 +++ b/doc/man1/notmuch-address.rst\r
75 @@ -11,7 +11,7 @@ DESCRIPTION\r
76  ===========\r
77  \r
78  Search for messages matching the given search terms, and display the\r
79 -addresses from them.\r
80 +addresses from them. Duplicate addresses are filtered out.\r
81  \r
82  See **notmuch-search-terms(7)** for details of the supported syntax for\r
83  <search-terms>.\r
84 diff --git a/notmuch-search.c b/notmuch-search.c\r
85 index 4b9a372..c765017 100644\r
86 --- a/notmuch-search.c\r
87 +++ b/notmuch-search.c\r
88 @@ -53,6 +53,7 @@ typedef struct {\r
89      int offset;\r
90      int limit;\r
91      int dupe;\r
92 +    GHashTable *addresses;\r
93  } search_context_t;\r
94  \r
95  typedef struct {\r
96 @@ -240,6 +241,27 @@ do_search_threads (search_context_t *ctx)\r
97      return 0;\r
98  }\r
99  \r
100 +/* Returns TRUE iff name and addr is duplicate. */\r
101 +static notmuch_bool_t\r
102 +is_duplicate (const search_context_t *ctx, const char *name, const char *addr)\r
103 +{\r
104 +    notmuch_bool_t duplicate;\r
105 +    char *key;\r
106 +\r
107 +    key = talloc_asprintf (ctx->format, "%s <%s>", name, addr);\r
108 +    if (! key)\r
109 +       return FALSE;\r
110 +\r
111 +    duplicate = g_hash_table_lookup_extended (ctx->addresses, key, NULL, NULL);\r
112 +\r
113 +    if (! duplicate)\r
114 +       g_hash_table_insert (ctx->addresses, key, NULL);\r
115 +    else\r
116 +       talloc_free (key);\r
117 +\r
118 +    return duplicate;\r
119 +}\r
120 +\r
121  static void\r
122  print_mailbox (const search_context_t *ctx, const mailbox_t *mailbox)\r
123  {\r
124 @@ -274,7 +296,8 @@ print_mailbox (const search_context_t *ctx, const mailbox_t *mailbox)\r
125  \r
126  /* Print addresses from InternetAddressList.  */\r
127  static void\r
128 -process_address_list (const search_context_t *ctx, InternetAddressList *list)\r
129 +process_address_list (const search_context_t *ctx,\r
130 +                     InternetAddressList *list)\r
131  {\r
132      InternetAddress *address;\r
133      int i;\r
134 @@ -298,6 +321,9 @@ process_address_list (const search_context_t *ctx, InternetAddressList *list)\r
135                 .addr = internet_address_mailbox_get_addr (mailbox),\r
136             };\r
137  \r
138 +           if (is_duplicate (ctx, mbx.name, mbx.addr))\r
139 +               continue;\r
140 +\r
141             print_mailbox (ctx, &mbx);\r
142         }\r
143      }\r
144 @@ -321,6 +347,12 @@ process_address_header (const search_context_t *ctx, const char *value)\r
145      g_object_unref (list);\r
146  }\r
147  \r
148 +static void\r
149 +_my_talloc_free_for_g_hash (void *ptr)\r
150 +{\r
151 +    talloc_free (ptr);\r
152 +}\r
153 +\r
154  static int\r
155  do_search_messages (search_context_t *ctx)\r
156  {\r
157 @@ -642,8 +674,14 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[])\r
158                                  argc - opt_index, argv + opt_index))\r
159         return EXIT_FAILURE;\r
160  \r
161 +    ctx->addresses = g_hash_table_new_full (g_str_hash, g_str_equal,\r
162 +                                           _my_talloc_free_for_g_hash, NULL);\r
163 +\r
164      ret = do_search_messages (ctx);\r
165  \r
166 +    g_hash_table_unref (ctx->addresses);\r
167 +\r
168 +\r
169      _notmuch_search_cleanup (ctx);\r
170  \r
171      return ret ? EXIT_FAILURE : EXIT_SUCCESS;\r
172 diff --git a/test/T095-address.sh b/test/T095-address.sh\r
173 new file mode 100755\r
174 index 0000000..8a256d2\r
175 --- /dev/null\r
176 +++ b/test/T095-address.sh\r
177 @@ -0,0 +1,100 @@\r
178 +#!/usr/bin/env bash\r
179 +test_description='"notmuch address" in several variants'\r
180 +. ./test-lib.sh\r
181 +\r
182 +add_email_corpus\r
183 +\r
184 +test_begin_subtest "--output=sender"\r
185 +notmuch address --output=sender '*' >OUTPUT\r
186 +cat <<EOF >EXPECTED\r
187 +François Boulogne <boulogne.f@gmail.com>\r
188 +Olivier Berger <olivier.berger@it-sudparis.eu>\r
189 +Chris Wilson <chris@chris-wilson.co.uk>\r
190 +Carl Worth <cworth@cworth.org>\r
191 +Alexander Botero-Lowry <alex.boterolowry@gmail.com>\r
192 +Keith Packard <keithp@keithp.com>\r
193 +Jjgod Jiang <gzjjgod@gmail.com>\r
194 +Rolland Santimano <rollandsantimano@yahoo.com>\r
195 +Jan Janak <jan@ryngle.com>\r
196 +Stewart Smith <stewart@flamingspork.com>\r
197 +Lars Kellogg-Stedman <lars@seas.harvard.edu>\r
198 +Alex Botero-Lowry <alex.boterolowry@gmail.com>\r
199 +Ingmar Vanhassel <ingmar@exherbo.org>\r
200 +Aron Griffis <agriffis@n01se.net>\r
201 +Adrian Perez de Castro <aperez@igalia.com>\r
202 +Israel Herraiz <isra@herraiz.org>\r
203 +Mikhail Gusarov <dottedmag@dottedmag.net>\r
204 +EOF\r
205 +test_expect_equal_file OUTPUT EXPECTED\r
206 +\r
207 +test_begin_subtest "--output=sender --format=json"\r
208 +notmuch address --output=sender --format=json '*' >OUTPUT\r
209 +cat <<EOF >EXPECTED\r
210 +[{"name": "François Boulogne", "address": "boulogne.f@gmail.com", "name-addr": "François Boulogne <boulogne.f@gmail.com>"},\r
211 +{"name": "Olivier Berger", "address": "olivier.berger@it-sudparis.eu", "name-addr": "Olivier Berger <olivier.berger@it-sudparis.eu>"},\r
212 +{"name": "Chris Wilson", "address": "chris@chris-wilson.co.uk", "name-addr": "Chris Wilson <chris@chris-wilson.co.uk>"},\r
213 +{"name": "Carl Worth", "address": "cworth@cworth.org", "name-addr": "Carl Worth <cworth@cworth.org>"},\r
214 +{"name": "Alexander Botero-Lowry", "address": "alex.boterolowry@gmail.com", "name-addr": "Alexander Botero-Lowry <alex.boterolowry@gmail.com>"},\r
215 +{"name": "Keith Packard", "address": "keithp@keithp.com", "name-addr": "Keith Packard <keithp@keithp.com>"},\r
216 +{"name": "Jjgod Jiang", "address": "gzjjgod@gmail.com", "name-addr": "Jjgod Jiang <gzjjgod@gmail.com>"},\r
217 +{"name": "Rolland Santimano", "address": "rollandsantimano@yahoo.com", "name-addr": "Rolland Santimano <rollandsantimano@yahoo.com>"},\r
218 +{"name": "Jan Janak", "address": "jan@ryngle.com", "name-addr": "Jan Janak <jan@ryngle.com>"},\r
219 +{"name": "Stewart Smith", "address": "stewart@flamingspork.com", "name-addr": "Stewart Smith <stewart@flamingspork.com>"},\r
220 +{"name": "Lars Kellogg-Stedman", "address": "lars@seas.harvard.edu", "name-addr": "Lars Kellogg-Stedman <lars@seas.harvard.edu>"},\r
221 +{"name": "Alex Botero-Lowry", "address": "alex.boterolowry@gmail.com", "name-addr": "Alex Botero-Lowry <alex.boterolowry@gmail.com>"},\r
222 +{"name": "Ingmar Vanhassel", "address": "ingmar@exherbo.org", "name-addr": "Ingmar Vanhassel <ingmar@exherbo.org>"},\r
223 +{"name": "Aron Griffis", "address": "agriffis@n01se.net", "name-addr": "Aron Griffis <agriffis@n01se.net>"},\r
224 +{"name": "Adrian Perez de Castro", "address": "aperez@igalia.com", "name-addr": "Adrian Perez de Castro <aperez@igalia.com>"},\r
225 +{"name": "Israel Herraiz", "address": "isra@herraiz.org", "name-addr": "Israel Herraiz <isra@herraiz.org>"},\r
226 +{"name": "Mikhail Gusarov", "address": "dottedmag@dottedmag.net", "name-addr": "Mikhail Gusarov <dottedmag@dottedmag.net>"}]\r
227 +EOF\r
228 +test_expect_equal_file OUTPUT EXPECTED\r
229 +\r
230 +test_begin_subtest "--output=recipients"\r
231 +notmuch address --output=recipients '*' >OUTPUT\r
232 +cat <<EOF >EXPECTED\r
233 +Allan McRae <allan@archlinux.org>\r
234 +"Discussion about the Arch User Repository (AUR)" <aur-general@archlinux.org>\r
235 +olivier.berger@it-sudparis.eu\r
236 +notmuch@notmuchmail.org\r
237 +notmuch <notmuch@notmuchmail.org>\r
238 +Keith Packard <keithp@keithp.com>\r
239 +Mikhail Gusarov <dottedmag@dottedmag.net>\r
240 +EOF\r
241 +test_expect_equal_file OUTPUT EXPECTED\r
242 +\r
243 +test_begin_subtest "--output=sender --output=recipients"\r
244 +notmuch address --output=sender --output=recipients '*' >OUTPUT\r
245 +cat <<EOF >EXPECTED\r
246 +François Boulogne <boulogne.f@gmail.com>\r
247 +Allan McRae <allan@archlinux.org>\r
248 +"Discussion about the Arch User Repository (AUR)" <aur-general@archlinux.org>\r
249 +Olivier Berger <olivier.berger@it-sudparis.eu>\r
250 +olivier.berger@it-sudparis.eu\r
251 +Chris Wilson <chris@chris-wilson.co.uk>\r
252 +notmuch@notmuchmail.org\r
253 +Carl Worth <cworth@cworth.org>\r
254 +Alexander Botero-Lowry <alex.boterolowry@gmail.com>\r
255 +Keith Packard <keithp@keithp.com>\r
256 +Jjgod Jiang <gzjjgod@gmail.com>\r
257 +Rolland Santimano <rollandsantimano@yahoo.com>\r
258 +Jan Janak <jan@ryngle.com>\r
259 +Stewart Smith <stewart@flamingspork.com>\r
260 +Lars Kellogg-Stedman <lars@seas.harvard.edu>\r
261 +notmuch <notmuch@notmuchmail.org>\r
262 +Alex Botero-Lowry <alex.boterolowry@gmail.com>\r
263 +Ingmar Vanhassel <ingmar@exherbo.org>\r
264 +Aron Griffis <agriffis@n01se.net>\r
265 +Adrian Perez de Castro <aperez@igalia.com>\r
266 +Israel Herraiz <isra@herraiz.org>\r
267 +Mikhail Gusarov <dottedmag@dottedmag.net>\r
268 +EOF\r
269 +test_expect_equal_file OUTPUT EXPECTED\r
270 +\r
271 +test_begin_subtest "No --output"\r
272 +notmuch address --output=sender --output=recipients '*' >OUTPUT\r
273 +# Use EXPECTED from previous subtest\r
274 +test_expect_equal_file OUTPUT EXPECTED\r
275 +\r
276 +\r
277 +test_done\r
278 -- \r
279 2.1.1\r
280 \r