Re: [PATCH v4 01/16] add util/search-path.{c, h} to test for executables in $PATH
[notmuch-archives.git] / ee / 3ce507890558e87fa97cb8ae39b985a63d794a
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 56E52431FB6\r
6         for <notmuch@notmuchmail.org>; Fri,  3 Feb 2012 14:41:19 -0800 (PST)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: 0\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none]\r
12         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 T6xVHja0012b for <notmuch@notmuchmail.org>;\r
16         Fri,  3 Feb 2012 14:41:18 -0800 (PST)\r
17 Received: from mail-lpp01m020-f181.google.com (mail-lpp01m020-f181.google.com\r
18         [209.85.217.181]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
19         (No client certificate requested)\r
20         by olra.theworths.org (Postfix) with ESMTPS id 2FEFB431FAE\r
21         for <notmuch@notmuchmail.org>; Fri,  3 Feb 2012 14:41:18 -0800 (PST)\r
22 Received: by lbbgn5 with SMTP id gn5so940158lbb.26\r
23         for <notmuch@notmuchmail.org>; Fri, 03 Feb 2012 14:41:15 -0800 (PST)\r
24 Received: by 10.112.102.37 with SMTP id fl5mr2369846lbb.95.1328308875156;\r
25         Fri, 03 Feb 2012 14:41:15 -0800 (PST)\r
26 Received: from localhost (dsl-hkibrasgw4-fe50f800-253.dhcp.inet.fi.\r
27         [84.248.80.253])\r
28         by mx.google.com with ESMTPS id hl9sm5901620lab.5.2012.02.03.14.41.12\r
29         (version=SSLv3 cipher=OTHER); Fri, 03 Feb 2012 14:41:13 -0800 (PST)\r
30 From: Jani Nikula <jani@nikula.org>\r
31 To: notmuch@notmuchmail.org\r
32 Subject: [PATCH 1/2] cli: convert "notmuch show" to use the new argument\r
33  parser\r
34 Date: Sat,  4 Feb 2012 00:41:08 +0200\r
35 Message-Id:\r
36  <df2e9bd7682e9c81e1b205cc1d92a1526cdd1a9b.1328308635.git.jani@nikula.org>\r
37 X-Mailer: git-send-email 1.7.5.4\r
38 X-BeenThere: notmuch@notmuchmail.org\r
39 X-Mailman-Version: 2.1.13\r
40 Precedence: list\r
41 List-Id: "Use and development of the notmuch mail system."\r
42         <notmuch.notmuchmail.org>\r
43 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
44         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
45 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
46 List-Post: <mailto:notmuch@notmuchmail.org>\r
47 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
48 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
49         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
50 X-List-Received-Date: Fri, 03 Feb 2012 22:41:19 -0000\r
51 \r
52 Use the new notmuch argument parser to handle arguments in "notmuch\r
53 show". There are two corner case functional changes:\r
54 \r
55 1) Also set params.raw = 1 when defaulting to raw format when part is\r
56    requested but format is not specified.\r
57 \r
58 2) Do not set params.decrypt if crypto context creation fails.\r
59 \r
60 Signed-off-by: Jani Nikula <jani@nikula.org>\r
61 ---\r
62  notmuch-show.c |  153 +++++++++++++++++++++++++++++---------------------------\r
63  1 files changed, 79 insertions(+), 74 deletions(-)\r
64 \r
65 diff --git a/notmuch-show.c b/notmuch-show.c\r
66 index dec799c..f93e121 100644\r
67 --- a/notmuch-show.c\r
68 +++ b/notmuch-show.c\r
69 @@ -1049,6 +1049,14 @@ do_show (void *ctx,\r
70      return 0;\r
71  }\r
72  \r
73 +enum {\r
74 +    NOTMUCH_FORMAT_NOT_SPECIFIED,\r
75 +    NOTMUCH_FORMAT_JSON,\r
76 +    NOTMUCH_FORMAT_TEXT,\r
77 +    NOTMUCH_FORMAT_MBOX,\r
78 +    NOTMUCH_FORMAT_RAW\r
79 +};\r
80 +\r
81  int\r
82  notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))\r
83  {\r
84 @@ -1056,92 +1064,98 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))\r
85      notmuch_database_t *notmuch;\r
86      notmuch_query_t *query;\r
87      char *query_string;\r
88 -    char *opt;\r
89 +    int opt_index;\r
90      const notmuch_show_format_t *format = &format_text;\r
91 -    notmuch_show_params_t params;\r
92 -    int mbox = 0;\r
93 -    int format_specified = 0;\r
94 -    int i;\r
95 +    notmuch_show_params_t params = { .part = -1 };\r
96 +    int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;\r
97 +    notmuch_bool_t decrypt = FALSE;\r
98 +    notmuch_bool_t verify = FALSE;\r
99 +    notmuch_bool_t entire_thread = FALSE;\r
100 +\r
101 +    notmuch_opt_desc_t options[] = {\r
102 +       { NOTMUCH_OPT_KEYWORD, &format_sel, "format", 'f',\r
103 +         (notmuch_keyword_t []){ { "json", NOTMUCH_FORMAT_JSON },\r
104 +                                 { "text", NOTMUCH_FORMAT_TEXT },\r
105 +                                 { "mbox", NOTMUCH_FORMAT_MBOX },\r
106 +                                 { "raw", NOTMUCH_FORMAT_RAW },\r
107 +                                 { 0, 0 } } },\r
108 +       { NOTMUCH_OPT_INT, &params.part, "part", 'p', 0 },\r
109 +       { NOTMUCH_OPT_BOOLEAN, &entire_thread, "entire-thread", 't', 0 },\r
110 +       { NOTMUCH_OPT_BOOLEAN, &decrypt, "decrypt", 'd', 0 },\r
111 +       { NOTMUCH_OPT_BOOLEAN, &verify, "verify", 'v', 0 },\r
112 +       { 0, 0, 0, 0, 0 }\r
113 +    };\r
114 +\r
115 +    opt_index = parse_arguments (argc, argv, options, 1);\r
116 +    if (opt_index < 0) {\r
117 +       /* diagnostics already printed */\r
118 +       return 1;\r
119 +    }\r
120  \r
121 -    params.entire_thread = 0;\r
122 -    params.raw = 0;\r
123 -    params.part = -1;\r
124 -    params.cryptoctx = NULL;\r
125 -    params.decrypt = 0;\r
126 +    params.entire_thread = entire_thread;\r
127  \r
128 -    argc--; argv++; /* skip subcommand argument */\r
129 +    if (format_sel == NOTMUCH_FORMAT_NOT_SPECIFIED) {\r
130 +       /* if part was requested and format was not specified, use format=raw */\r
131 +       if (params.part >= 0)\r
132 +           format_sel = NOTMUCH_FORMAT_RAW;\r
133 +       else\r
134 +           format_sel = NOTMUCH_FORMAT_TEXT;\r
135 +    }\r
136  \r
137 -    for (i = 0; i < argc && argv[i][0] == '-'; i++) {\r
138 -       if (strcmp (argv[i], "--") == 0) {\r
139 -           i++;\r
140 -           break;\r
141 +    switch (format_sel) {\r
142 +    case NOTMUCH_FORMAT_JSON:\r
143 +       format = &format_json;\r
144 +       params.entire_thread = 1;\r
145 +       break;\r
146 +    case NOTMUCH_FORMAT_TEXT:\r
147 +       format = &format_text;\r
148 +       break;\r
149 +    case NOTMUCH_FORMAT_MBOX:\r
150 +       if (params.part > 0) {\r
151 +           fprintf (stderr, "Error: specifying parts is incompatible with mbox output format.\n");\r
152 +           return 1;\r
153         }\r
154 -       if (STRNCMP_LITERAL (argv[i], "--format=") == 0) {\r
155 -           opt = argv[i] + sizeof ("--format=") - 1;\r
156 -           if (strcmp (opt, "text") == 0) {\r
157 -               format = &format_text;\r
158 -           } else if (strcmp (opt, "json") == 0) {\r
159 -               format = &format_json;\r
160 -               params.entire_thread = 1;\r
161 -           } else if (strcmp (opt, "mbox") == 0) {\r
162 -               format = &format_mbox;\r
163 -               mbox = 1;\r
164 -           } else if (strcmp (opt, "raw") == 0) {\r
165 -               format = &format_raw;\r
166 -               params.raw = 1;\r
167 -           } else {\r
168 -               fprintf (stderr, "Invalid value for --format: %s\n", opt);\r
169 -               return 1;\r
170 -           }\r
171 -           format_specified = 1;\r
172 -       } else if (STRNCMP_LITERAL (argv[i], "--part=") == 0) {\r
173 -           params.part = atoi(argv[i] + sizeof ("--part=") - 1);\r
174 -       } else if (STRNCMP_LITERAL (argv[i], "--entire-thread") == 0) {\r
175 -           params.entire_thread = 1;\r
176 -       } else if ((STRNCMP_LITERAL (argv[i], "--verify") == 0) ||\r
177 -                  (STRNCMP_LITERAL (argv[i], "--decrypt") == 0)) {\r
178 -           if (params.cryptoctx == NULL) {\r
179 +       format = &format_mbox;\r
180 +       break;\r
181 +    case NOTMUCH_FORMAT_RAW:\r
182 +       format = &format_raw;\r
183 +       /* If --format=raw specified without specifying part, we can only\r
184 +        * output single message, so set part=0 */\r
185 +       if (params.part < 0)\r
186 +           params.part = 0;\r
187 +       params.raw = 1;\r
188 +       break;\r
189 +    }\r
190 +\r
191 +    if (decrypt || verify) {\r
192  #ifdef GMIME_ATLEAST_26\r
193 -               /* TODO: GMimePasswordRequestFunc */\r
194 -               if (NULL == (params.cryptoctx = g_mime_gpg_context_new(NULL, "gpg")))\r
195 +       /* TODO: GMimePasswordRequestFunc */\r
196 +       params.cryptoctx = g_mime_gpg_context_new (NULL, "gpg");\r
197  #else\r
198 -               GMimeSession* session = g_object_new(g_mime_session_get_type(), NULL);\r
199 -               if (NULL == (params.cryptoctx = g_mime_gpg_context_new(session, "gpg")))\r
200 -#endif\r
201 -                   fprintf (stderr, "Failed to construct gpg context.\n");\r
202 -               else\r
203 -                   g_mime_gpg_context_set_always_trust((GMimeGpgContext*)params.cryptoctx, FALSE);\r
204 -#ifndef GMIME_ATLEAST_26\r
205 -               g_object_unref (session);\r
206 -               session = NULL;\r
207 +       GMimeSession* session = g_object_new (g_mime_session_get_type(), NULL);\r
208 +       params.cryptoctx = g_mime_gpg_context_new (session, "gpg");\r
209  #endif\r
210 -           }\r
211 -           if (STRNCMP_LITERAL (argv[i], "--decrypt") == 0)\r
212 -               params.decrypt = 1;\r
213 +       if (params.cryptoctx) {\r
214 +           g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) params.cryptoctx, FALSE);\r
215 +           params.decrypt = decrypt;\r
216         } else {\r
217 -           fprintf (stderr, "Unrecognized option: %s\n", argv[i]);\r
218 -           return 1;\r
219 +           fprintf (stderr, "Failed to construct gpg context.\n");\r
220         }\r
221 +#ifndef GMIME_ATLEAST_26\r
222 +       g_object_unref (session);\r
223 +#endif\r
224      }\r
225  \r
226 -    argc -= i;\r
227 -    argv += i;\r
228 -\r
229      config = notmuch_config_open (ctx, NULL, NULL);\r
230      if (config == NULL)\r
231         return 1;\r
232  \r
233 -    query_string = query_string_from_args (ctx, argc, argv);\r
234 +    query_string = query_string_from_args (ctx, argc-opt_index, argv+opt_index);\r
235      if (query_string == NULL) {\r
236         fprintf (stderr, "Out of memory\n");\r
237         return 1;\r
238      }\r
239  \r
240 -    if (mbox && params.part > 0) {\r
241 -       fprintf (stderr, "Error: specifying parts is incompatible with mbox output format.\n");\r
242 -       return 1;\r
243 -    }\r
244 -\r
245      if (*query_string == '\0') {\r
246         fprintf (stderr, "Error: notmuch show requires at least one search term.\n");\r
247         return 1;\r
248 @@ -1158,15 +1172,6 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))\r
249         return 1;\r
250      }\r
251  \r
252 -    /* if part was requested and format was not specified, use format=raw */\r
253 -    if (params.part >= 0 && !format_specified)\r
254 -       format = &format_raw;\r
255 -\r
256 -    /* If --format=raw specified without specifying part, we can only\r
257 -     * output single message, so set part=0 */\r
258 -    if (params.raw && params.part < 0)\r
259 -       params.part = 0;\r
260 -\r
261      if (params.part >= 0)\r
262         return do_show_single (ctx, query, format, &params);\r
263      else\r
264 -- \r
265 1.7.5.4\r
266 \r