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
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
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
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
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
57 Content-Type: text/plain
\r
58 X-BeenThere: notmuch@notmuchmail.org
\r
59 X-Mailman-Version: 2.1.13
\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
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
76 *sigh* this was supposed to be:
\r
80 cli: add --output=sender and --output=recipients to notmuch search
\r
82 sender prints from, recipients prints to, cc, and bcc.
\r
86 I don't have the time for this, and I'm rushing too much...
\r
95 > notmuch-search.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
\r
96 > 1 file changed, 100 insertions(+), 9 deletions(-)
\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
106 > - OUTPUT_SUMMARY,
\r
107 > - OUTPUT_THREADS,
\r
108 > - OUTPUT_MESSAGES,
\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
121 > /* Return two stable query strings that identify exactly the matched
\r
122 > @@ -214,6 +217,66 @@ do_search_threads (sprinter_t *format,
\r
127 > +print_address_list (sprinter_t *format, InternetAddressList *list)
\r
129 > + InternetAddress *address;
\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
138 > + group = INTERNET_ADDRESS_GROUP (address);
\r
139 > + group_list = internet_address_group_get_members (group);
\r
140 > + if (group_list == NULL)
\r
143 > + print_address_list (format, group_list);
\r
145 > + InternetAddressMailbox *mailbox;
\r
146 > + const char *name;
\r
147 > + const char *addr;
\r
148 > + char *full_address;
\r
150 > + mailbox = INTERNET_ADDRESS_MAILBOX (address);
\r
152 > + name = internet_address_get_name (address);
\r
153 > + addr = internet_address_mailbox_get_addr (mailbox);
\r
155 > + if (name && *name)
\r
156 > + full_address = talloc_asprintf (NULL, "%s <%s>", name, addr);
\r
158 > + full_address = talloc_asprintf (NULL, "<%s>", addr);
\r
160 > + if (!full_address)
\r
163 > + format->string (format, full_address);
\r
164 > + format->separator (format);
\r
166 > + talloc_free (full_address);
\r
172 > +print_address_string (sprinter_t *format, const char *recipients)
\r
174 > + InternetAddressList *list;
\r
176 > + if (recipients == NULL)
\r
179 > + list = internet_address_list_parse_string (recipients);
\r
180 > + if (list == NULL)
\r
183 > + print_address_list (format, list);
\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
191 > notmuch_filenames_destroy( filenames );
\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
200 > + if (output & OUTPUT_SENDER) {
\r
201 > + const char *addrs;
\r
203 > + addrs = notmuch_message_get_header (message, "from");
\r
204 > + print_address_string (format, addrs);
\r
207 > + if (output & OUTPUT_RECIPIENTS) {
\r
208 > + const char *hdrs[] = { "to", "cc", "bcc" };
\r
209 > + const char *addrs;
\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
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
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
232 > { NOTMUCH_OPT_INT, ¬much_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
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
248 > + output = OUTPUT_SUMMARY;
\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
256 > switch (output) {
\r
258 > case OUTPUT_SUMMARY:
\r
259 > case OUTPUT_THREADS:
\r
260 > ret = do_search_threads (format, query, sort, output, offset, limit);
\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
269 > case OUTPUT_TAGS:
\r
270 > ret = do_search_tags (notmuch, format, query);
\r
273 > + fprintf (stderr, "Error: the combination of outputs is not supported.\n");
\r
277 > notmuch_query_destroy (query);
\r