[PATCH 2/2] emacs: express notmuch-search-line-faces in terms of two new faces: notmu...
[notmuch-archives.git] / 70 / 44f620ec0854f770ebe372ccd06f2096cf15c4
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 0961A431FB6\r
6         for <notmuch@notmuchmail.org>; Sat,  6 Sep 2014 09:41:38 -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 EWMOyqx6n91v for <notmuch@notmuchmail.org>;\r
16         Sat,  6 Sep 2014 09:41:32 -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  3E256431FAE    for <notmuch@notmuchmail.org>; Sat,  6 Sep 2014 09:41:32 -0700\r
21  (PDT)\r
22 Received: by mail-wg0-f51.google.com with SMTP id l18so12988299wgh.10\r
23         for <notmuch@notmuchmail.org>; Sat, 06 Sep 2014 09:41:31 -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:cc:subject:date:message-id:in-reply-to\r
27         :references;\r
28         bh=tsjKsxMPRBBQxKtxVL02C9XA/QkegjcIJuUkN5f97eY=;\r
29         b=Lm5ehg7b4PgJcQ6EhsBIFWRYooVXcvtH6eCJL7u12t/gSM20EKxaQgAhIXcugrh3rA\r
30         wAO5TLwKCk60KhqcErvfw20a0gDDPyJ17Rv6tpya+ycQWtMa55un3R9jrJXNNCsVYCv9\r
31         Nl5HX2VbxaCJ9Pm5cyIJvzFTXSJoCzRcRitQGWjDDNlT+WHmQiAByWlYU2JKagzr8xeN\r
32         xe0ahZ/ULnlyrD/smZ7nKPwhfj7Jkpjl9f2Cn8bYDUVsBV/yt8RdOxOzsMqCeIjWRFsF\r
33         T4EapICHqlyZlRFHoOZz540fGS4OBq6E2UgklWXKL1jTdKrcb15jI/j1CPi8cthB/Adz\r
34         wQcA==\r
35 X-Gm-Message-State:\r
36  ALoCoQlPQUpVOI7rjWLvihwz2R2BQF2Jwfu5/RZG6Ope27SuXmR8POSHVEqL12/K7IOouBu+JMLz\r
37 X-Received: by 10.180.37.16 with SMTP id u16mr11195908wij.72.1410021690906;\r
38         Sat, 06 Sep 2014 09:41:30 -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 w1sm5662888wib.1.2014.09.06.09.41.29\r
42         for <multiple recipients>\r
43         (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
44         Sat, 06 Sep 2014 09:41:30 -0700 (PDT)\r
45 From: Jani Nikula <jani@nikula.org>\r
46 To: notmuch@notmuchmail.org\r
47 Subject: [PATCH] cli: add --output=address-{from,to,all} to notmuch search\r
48 Date: Sat,  6 Sep 2014 19:41:29 +0300\r
49 Message-Id: <1410021689-15901-1-git-send-email-jani@nikula.org>\r
50 X-Mailer: git-send-email 2.1.0\r
51 In-Reply-To: <871troub1v.fsf@qmul.ac.uk>\r
52 References: <871troub1v.fsf@qmul.ac.uk>\r
53 X-BeenThere: notmuch@notmuchmail.org\r
54 X-Mailman-Version: 2.1.13\r
55 Precedence: list\r
56 List-Id: "Use and development of the notmuch mail system."\r
57         <notmuch.notmuchmail.org>\r
58 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
59         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
60 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
61 List-Post: <mailto:notmuch@notmuchmail.org>\r
62 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
63 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
64         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
65 X-List-Received-Date: Sat, 06 Sep 2014 16:41:38 -0000\r
66 \r
67 address-from prints reply-to or from, address-to prints to, cc, and\r
68 bcc, and address-all prints all of them.\r
69 ---\r
70  notmuch-search.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++-----\r
71  1 file changed, 100 insertions(+), 9 deletions(-)\r
72 \r
73 diff --git a/notmuch-search.c b/notmuch-search.c\r
74 index bc9be4593ecc..e7cf3d2a0fdf 100644\r
75 --- a/notmuch-search.c\r
76 +++ b/notmuch-search.c\r
77 @@ -23,11 +23,14 @@\r
78  #include "string-util.h"\r
79  \r
80  typedef enum {\r
81 -    OUTPUT_SUMMARY,\r
82 -    OUTPUT_THREADS,\r
83 -    OUTPUT_MESSAGES,\r
84 -    OUTPUT_FILES,\r
85 -    OUTPUT_TAGS\r
86 +    OUTPUT_SUMMARY     = 1 << 0,\r
87 +    OUTPUT_THREADS     = 1 << 1,\r
88 +    OUTPUT_MESSAGES    = 1 << 2,\r
89 +    OUTPUT_FILES       = 1 << 3,\r
90 +    OUTPUT_TAGS                = 1 << 4,\r
91 +    OUTPUT_SENDER      = 1 << 5,\r
92 +    OUTPUT_RECIPIENTS  = 1 << 6,\r
93 +    OUTPUT_ADDRESSES   = OUTPUT_SENDER | OUTPUT_RECIPIENTS,\r
94  } output_t;\r
95  \r
96  /* Return two stable query strings that identify exactly the matched\r
97 @@ -214,6 +217,66 @@ do_search_threads (sprinter_t *format,\r
98      return 0;\r
99  }\r
100  \r
101 +static void\r
102 +print_address_list (sprinter_t *format, InternetAddressList *list)\r
103 +{\r
104 +    InternetAddress *address;\r
105 +    int i;\r
106 +\r
107 +    for (i = 0; i < internet_address_list_length (list); i++) {\r
108 +       address = internet_address_list_get_address (list, i);\r
109 +       if (INTERNET_ADDRESS_IS_GROUP (address)) {\r
110 +           InternetAddressGroup *group;\r
111 +           InternetAddressList *group_list;\r
112 +\r
113 +           group = INTERNET_ADDRESS_GROUP (address);\r
114 +           group_list = internet_address_group_get_members (group);\r
115 +           if (group_list == NULL)\r
116 +               continue;\r
117 +\r
118 +           print_address_list (format, group_list);\r
119 +       } else {\r
120 +           InternetAddressMailbox *mailbox;\r
121 +           const char *name;\r
122 +           const char *addr;\r
123 +           char *full_address;\r
124 +\r
125 +           mailbox = INTERNET_ADDRESS_MAILBOX (address);\r
126 +\r
127 +           name = internet_address_get_name (address);\r
128 +           addr = internet_address_mailbox_get_addr (mailbox);\r
129 +\r
130 +           if (name && *name)\r
131 +               full_address = talloc_asprintf (NULL, "%s <%s>", name, addr);\r
132 +           else\r
133 +               full_address = talloc_asprintf (NULL, "<%s>", addr);\r
134 +\r
135 +           if (!full_address)\r
136 +               break;\r
137 +\r
138 +           format->string (format, full_address);\r
139 +           format->separator (format);\r
140 +\r
141 +           talloc_free (full_address);\r
142 +       }\r
143 +    }\r
144 +}\r
145 +\r
146 +static void\r
147 +print_address_string (sprinter_t *format, const char *recipients)\r
148 +{\r
149 +    InternetAddressList *list;\r
150 +\r
151 +    if (recipients == NULL)\r
152 +       return;\r
153 +\r
154 +    list = internet_address_list_parse_string (recipients);\r
155 +    if (list == NULL)\r
156 +       return;\r
157 +\r
158 +    print_address_list (format, list);\r
159 +}\r
160 +\r
161  static int\r
162  do_search_messages (sprinter_t *format,\r
163                     notmuch_query_t *query,\r
164 @@ -264,11 +327,29 @@ do_search_messages (sprinter_t *format,\r
165             \r
166             notmuch_filenames_destroy( filenames );\r
167  \r
168 -       } else { /* output == OUTPUT_MESSAGES */\r
169 +       } else if (output == OUTPUT_MESSAGES) {\r
170             format->set_prefix (format, "id");\r
171             format->string (format,\r
172                             notmuch_message_get_message_id (message));\r
173             format->separator (format);\r
174 +       } else {\r
175 +           if (output & OUTPUT_SENDER) {\r
176 +               const char *addrs;\r
177 +\r
178 +               addrs = notmuch_message_get_header (message, "from");\r
179 +               print_address_string (format, addrs);\r
180 +           }\r
181 +\r
182 +           if (output & OUTPUT_RECIPIENTS) {\r
183 +               const char *hdrs[] = { "to", "cc", "bcc" };\r
184 +               const char *addrs;\r
185 +               size_t j;\r
186 +\r
187 +               for (j = 0; j < ARRAY_SIZE (hdrs); j++) {\r
188 +                   addrs = notmuch_message_get_header (message, hdrs[j]);\r
189 +                   print_address_string (format, addrs);\r
190 +               }\r
191 +           }\r
192         }\r
193  \r
194         notmuch_message_destroy (message);\r
195 @@ -338,7 +419,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
196      notmuch_sort_t sort = NOTMUCH_SORT_NEWEST_FIRST;\r
197      sprinter_t *format = NULL;\r
198      int opt_index, ret;\r
199 -    output_t output = OUTPUT_SUMMARY;\r
200 +    output_t output = 0;\r
201      int offset = 0;\r
202      int limit = -1; /* unlimited */\r
203      notmuch_exclude_t exclude = NOTMUCH_EXCLUDE_TRUE;\r
204 @@ -364,10 +445,12 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
205                                   { "text0", NOTMUCH_FORMAT_TEXT0 },\r
206                                   { 0, 0 } } },\r
207         { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 0, 0 },\r
208 -       { NOTMUCH_OPT_KEYWORD, &output, "output", 'o',\r
209 +       { NOTMUCH_OPT_KEYWORD_FLAGS, &output, "output", 'o',\r
210           (notmuch_keyword_t []){ { "summary", OUTPUT_SUMMARY },\r
211                                   { "threads", OUTPUT_THREADS },\r
212                                   { "messages", OUTPUT_MESSAGES },\r
213 +                                 { "sender", OUTPUT_SENDER },\r
214 +                                 { "recipients", OUTPUT_RECIPIENTS },\r
215                                   { "files", OUTPUT_FILES },\r
216                                   { "tags", OUTPUT_TAGS },\r
217                                   { 0, 0 } } },\r
218 @@ -387,6 +470,9 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
219      if (opt_index < 0)\r
220         return EXIT_FAILURE;\r
221  \r
222 +    if (! output)\r
223 +       output = OUTPUT_SUMMARY;\r
224 +\r
225      switch (format_sel) {\r
226      case NOTMUCH_FORMAT_TEXT:\r
227         format = sprinter_text_create (config, stdout);\r
228 @@ -453,18 +539,23 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])\r
229      }\r
230  \r
231      switch (output) {\r
232 -    default:\r
233      case OUTPUT_SUMMARY:\r
234      case OUTPUT_THREADS:\r
235         ret = do_search_threads (format, query, sort, output, offset, limit);\r
236         break;\r
237      case OUTPUT_MESSAGES:\r
238 +    case OUTPUT_SENDER:\r
239 +    case OUTPUT_RECIPIENTS:\r
240 +    case OUTPUT_ADDRESSES:\r
241      case OUTPUT_FILES:\r
242         ret = do_search_messages (format, query, output, offset, limit, dupe);\r
243         break;\r
244      case OUTPUT_TAGS:\r
245         ret = do_search_tags (notmuch, format, query);\r
246         break;\r
247 +    default:\r
248 +       fprintf (stderr, "Error: the combination of outputs is not supported.\n");\r
249 +       ret = 1;\r
250      }\r
251  \r
252      notmuch_query_destroy (query);\r
253 -- \r
254 2.1.0\r
255 \r