Re: [PATCH] emacs: wash: make word-wrap bound message width
[notmuch-archives.git] / df / 179d1677580d73200c49877d74536b21ae38c6
1 Return-Path: <jani@nikula.org>\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 1209E431FB6\r
6         for <notmuch@notmuchmail.org>; Sat,  6 Sep 2014 09:47:48 -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: -0.7\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
12         tests=[RCVD_IN_DNSWL_LOW=-0.7] 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 0F6Ririxd--E for <notmuch@notmuchmail.org>;\r
16         Sat,  6 Sep 2014 09:47:40 -0700 (PDT)\r
17 Received: from mail-wg0-f51.google.com (mail-wg0-f51.google.com\r
18  [74.125.82.51])        (using TLSv1 with cipher RC4-SHA (128/128 bits))        (No client\r
19  certificate requested) by olra.theworths.org (Postfix) with ESMTPS id\r
20  190EA431FAE    for <notmuch@notmuchmail.org>; Sat,  6 Sep 2014 09:47:39 -0700\r
21  (PDT)\r
22 Received: by mail-wg0-f51.google.com with SMTP id l18so12841023wgh.34\r
23         for <notmuch@notmuchmail.org>; Sat, 06 Sep 2014 09:47:38 -0700 (PDT)\r
24 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
25         d=1e100.net; s=20130820;\r
26         h=x-gm-message-state:from:to:subject:in-reply-to:references\r
27         :user-agent:date:message-id:mime-version:content-type;\r
28         bh=6cFxVmVfVaxKfehvTfSkBc7oNdUMKCj9dVmcFahuLjI=;\r
29         b=aK1ZxxykiG2sV804zrEd8mDIZDXLY/Jj8GnS5vzAa50M021D1qEyAOybcQ+oz2JuFw\r
30         xloCBdMlrRc6Wi2HWcCAtGIHxRM/ugLL/dwCRSz0/Ka6eNuufX/FIpF7/lUB25VT8B7f\r
31         OYJR/U1wRAN3bL9RycudzK5Ml+4B5lJFFHWajDy+5T/DZeRdg6u9MLQbOEwqh5CjWZuJ\r
32         lsfPXtevVlxt0ylX9TxAZtPlJ4GV9EHNEKBePUAcJ9hL5ucoxW3oMP8xa9O/UKDYuWST\r
33         MWiPj+X6B6n9zk0Q8Gj7/UH3C2dLtBnYoRaNRBvkl7Ch6soS+K7H7xKbvTuU01sW+B6X\r
34         LXeg==\r
35 X-Gm-Message-State:\r
36  ALoCoQnt59mUA6+6WHmLa3E8EXmQDnGq60rKPO6C1u4dEAbZAfazseCddW4BYUuZZPFVXsdEemmG\r
37 X-Received: by 10.195.13.34 with SMTP id ev2mr21723821wjd.55.1410022057770;\r
38         Sat, 06 Sep 2014 09:47:37 -0700 (PDT)\r
39 Received: from localhost (dsl-hkibrasgw2-58c374-75.dhcp.inet.fi.\r
40         [88.195.116.75])\r
41         by mx.google.com with ESMTPSA id pn5sm5065005wjc.4.2014.09.06.09.47.36\r
42         for <notmuch@notmuchmail.org>\r
43         (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
44         Sat, 06 Sep 2014 09:47:37 -0700 (PDT)\r
45 From: Jani Nikula <jani@nikula.org>\r
46 To: notmuch@notmuchmail.org\r
47 Subject: Re: [PATCH] cli: add --output=address-{from, to,\r
48         all} to notmuch search\r
49 In-Reply-To: <1410021689-15901-1-git-send-email-jani@nikula.org>\r
50 References: <871troub1v.fsf@qmul.ac.uk>\r
51         <1410021689-15901-1-git-send-email-jani@nikula.org>\r
52 User-Agent: Notmuch/0.18.1+65~g9f0f30f (http://notmuchmail.org) Emacs/24.3.1\r
53         (x86_64-pc-linux-gnu)\r
54 Date: Sat, 06 Sep 2014 19:47:36 +0300\r
55 Message-ID: <8738c41ys7.fsf@nikula.org>\r
56 MIME-Version: 1.0\r
57 Content-Type: text/plain\r
58 X-BeenThere: notmuch@notmuchmail.org\r
59 X-Mailman-Version: 2.1.13\r
60 Precedence: list\r
61 List-Id: "Use and development of the notmuch mail system."\r
62         <notmuch.notmuchmail.org>\r
63 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
64         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
65 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
66 List-Post: <mailto:notmuch@notmuchmail.org>\r
67 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
68 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
69         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
70 X-List-Received-Date: Sat, 06 Sep 2014 16:47:48 -0000\r
71 \r
72 On Sat, 06 Sep 2014, Jani Nikula <jani@nikula.org> wrote:\r
73 > address-from prints reply-to or from, address-to prints to, cc, and\r
74 > bcc, and address-all prints all of them.\r
75 \r
76 *sigh* this was supposed to be:\r
77 \r
78 ---\r
79 \r
80 cli: add --output=sender and --output=recipients to notmuch search\r
81     \r
82 sender prints from, recipients prints to, cc, and bcc.\r
83 \r
84 ---\r
85 \r
86 I don't have the time for this, and I'm rushing too much...\r
87 \r
88 \r
89 BR,\r
90 Jani.\r
91 \r
92 \r
93 \r
94 > ---\r
95 >  notmuch-search.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++-----\r
96 >  1 file changed, 100 insertions(+), 9 deletions(-)\r
97 >\r
98 > diff --git a/notmuch-search.c b/notmuch-search.c\r
99 > index bc9be4593ecc..e7cf3d2a0fdf 100644\r
100 > --- a/notmuch-search.c\r
101 > +++ b/notmuch-search.c\r
102 > @@ -23,11 +23,14 @@\r
103 >  #include "string-util.h"\r
104 >  \r
105 >  typedef enum {\r
106 > -    OUTPUT_SUMMARY,\r
107 > -    OUTPUT_THREADS,\r
108 > -    OUTPUT_MESSAGES,\r
109 > -    OUTPUT_FILES,\r
110 > -    OUTPUT_TAGS\r
111 > +    OUTPUT_SUMMARY   = 1 << 0,\r
112 > +    OUTPUT_THREADS   = 1 << 1,\r
113 > +    OUTPUT_MESSAGES  = 1 << 2,\r
114 > +    OUTPUT_FILES     = 1 << 3,\r
115 > +    OUTPUT_TAGS              = 1 << 4,\r
116 > +    OUTPUT_SENDER    = 1 << 5,\r
117 > +    OUTPUT_RECIPIENTS        = 1 << 6,\r
118 > +    OUTPUT_ADDRESSES = OUTPUT_SENDER | OUTPUT_RECIPIENTS,\r
119 >  } output_t;\r
120 >  \r
121 >  /* Return two stable query strings that identify exactly the matched\r
122 > @@ -214,6 +217,66 @@ do_search_threads (sprinter_t *format,\r
123 >      return 0;\r
124 >  }\r
125 >  \r
126 > +static void\r
127 > +print_address_list (sprinter_t *format, InternetAddressList *list)\r
128 > +{\r
129 > +    InternetAddress *address;\r
130 > +    int i;\r
131 > +\r
132 > +    for (i = 0; i < internet_address_list_length (list); i++) {\r
133 > +     address = internet_address_list_get_address (list, i);\r
134 > +     if (INTERNET_ADDRESS_IS_GROUP (address)) {\r
135 > +         InternetAddressGroup *group;\r
136 > +         InternetAddressList *group_list;\r
137 > +\r
138 > +         group = INTERNET_ADDRESS_GROUP (address);\r
139 > +         group_list = internet_address_group_get_members (group);\r
140 > +         if (group_list == NULL)\r
141 > +             continue;\r
142 > +\r
143 > +         print_address_list (format, group_list);\r
144 > +     } else {\r
145 > +         InternetAddressMailbox *mailbox;\r
146 > +         const char *name;\r
147 > +         const char *addr;\r
148 > +         char *full_address;\r
149 > +\r
150 > +         mailbox = INTERNET_ADDRESS_MAILBOX (address);\r
151 > +\r
152 > +         name = internet_address_get_name (address);\r
153 > +         addr = internet_address_mailbox_get_addr (mailbox);\r
154 > +\r
155 > +         if (name && *name)\r
156 > +             full_address = talloc_asprintf (NULL, "%s <%s>", name, addr);\r
157 > +         else\r
158 > +             full_address = talloc_asprintf (NULL, "<%s>", addr);\r
159 > +\r
160 > +         if (!full_address)\r
161 > +             break;\r
162 > +\r
163 > +         format->string (format, full_address);\r
164 > +         format->separator (format);\r
165 > +\r
166 > +         talloc_free (full_address);\r
167 > +     }\r
168 > +    }\r
169 > +}\r
170 > +\r
171 > +static void\r
172 > +print_address_string (sprinter_t *format, const char *recipients)\r
173 > +{\r
174 > +    InternetAddressList *list;\r
175 > +\r
176 > +    if (recipients == NULL)\r
177 > +     return;\r
178 > +\r
179 > +    list = internet_address_list_parse_string (recipients);\r
180 > +    if (list == NULL)\r
181 > +     return;\r
182 > +\r
183 > +    print_address_list (format, list);\r
184 > +}\r
185 > +\r
186 >  static int\r
187 >  do_search_messages (sprinter_t *format,\r
188 >                   notmuch_query_t *query,\r
189 > @@ -264,11 +327,29 @@ do_search_messages (sprinter_t *format,\r
190 >           \r
191 >           notmuch_filenames_destroy( filenames );\r
192 >  \r
193 > -     } else { /* output == OUTPUT_MESSAGES */\r
194 > +     } else if (output == OUTPUT_MESSAGES) {\r
195 >           format->set_prefix (format, "id");\r
196 >           format->string (format,\r
197 >                           notmuch_message_get_message_id (message));\r
198 >           format->separator (format);\r
199 > +     } else {\r
200 > +         if (output & OUTPUT_SENDER) {\r
201 > +             const char *addrs;\r
202 > +\r
203 > +             addrs = notmuch_message_get_header (message, "from");\r
204 > +             print_address_string (format, addrs);\r
205 > +         }\r
206 > +\r
207 > +         if (output & OUTPUT_RECIPIENTS) {\r
208 > +             const char *hdrs[] = { "to", "cc", "bcc" };\r
209 > +             const char *addrs;\r
210 > +             size_t j;\r
211 > +\r
212 > +             for (j = 0; j < ARRAY_SIZE (hdrs); j++) {\r
213 > +                 addrs = notmuch_message_get_header (message, hdrs[j]);\r
214 > +                 print_address_string (format, addrs);\r
215 > +             }\r
216 > +         }\r
217 >       }\r
218 >  \r
219 >       notmuch_message_destroy (message);\r
220 > @@ -338,7 +419,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
221 >      notmuch_sort_t sort = NOTMUCH_SORT_NEWEST_FIRST;\r
222 >      sprinter_t *format = NULL;\r
223 >      int opt_index, ret;\r
224 > -    output_t output = OUTPUT_SUMMARY;\r
225 > +    output_t output = 0;\r
226 >      int offset = 0;\r
227 >      int limit = -1; /* unlimited */\r
228 >      notmuch_exclude_t exclude = NOTMUCH_EXCLUDE_TRUE;\r
229 > @@ -364,10 +445,12 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
230 >                                 { "text0", NOTMUCH_FORMAT_TEXT0 },\r
231 >                                 { 0, 0 } } },\r
232 >       { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 0, 0 },\r
233 > -     { NOTMUCH_OPT_KEYWORD, &output, "output", 'o',\r
234 > +     { NOTMUCH_OPT_KEYWORD_FLAGS, &output, "output", 'o',\r
235 >         (notmuch_keyword_t []){ { "summary", OUTPUT_SUMMARY },\r
236 >                                 { "threads", OUTPUT_THREADS },\r
237 >                                 { "messages", OUTPUT_MESSAGES },\r
238 > +                               { "sender", OUTPUT_SENDER },\r
239 > +                               { "recipients", OUTPUT_RECIPIENTS },\r
240 >                                 { "files", OUTPUT_FILES },\r
241 >                                 { "tags", OUTPUT_TAGS },\r
242 >                                 { 0, 0 } } },\r
243 > @@ -387,6 +470,9 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
244 >      if (opt_index < 0)\r
245 >       return EXIT_FAILURE;\r
246 >  \r
247 > +    if (! output)\r
248 > +     output = OUTPUT_SUMMARY;\r
249 > +\r
250 >      switch (format_sel) {\r
251 >      case NOTMUCH_FORMAT_TEXT:\r
252 >       format = sprinter_text_create (config, stdout);\r
253 > @@ -453,18 +539,23 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
254 >      }\r
255 >  \r
256 >      switch (output) {\r
257 > -    default:\r
258 >      case OUTPUT_SUMMARY:\r
259 >      case OUTPUT_THREADS:\r
260 >       ret = do_search_threads (format, query, sort, output, offset, limit);\r
261 >       break;\r
262 >      case OUTPUT_MESSAGES:\r
263 > +    case OUTPUT_SENDER:\r
264 > +    case OUTPUT_RECIPIENTS:\r
265 > +    case OUTPUT_ADDRESSES:\r
266 >      case OUTPUT_FILES:\r
267 >       ret = do_search_messages (format, query, output, offset, limit, dupe);\r
268 >       break;\r
269 >      case OUTPUT_TAGS:\r
270 >       ret = do_search_tags (notmuch, format, query);\r
271 >       break;\r
272 > +    default:\r
273 > +     fprintf (stderr, "Error: the combination of outputs is not supported.\n");\r
274 > +     ret = 1;\r
275 >      }\r
276 >  \r
277 >      notmuch_query_destroy (query);\r
278 > -- \r
279 > 2.1.0\r