]> git.ipfire.org Git - thirdparty/git.git/blame - parse-options.c
trace2/tr2_tls.h: remove unnecessary include
[thirdparty/git.git] / parse-options.c
CommitLineData
4a59fd13
PH
1#include "git-compat-util.h"
2#include "parse-options.h"
0b027f6c 3#include "abspath.h"
b1bda751 4#include "parse.h"
f394e093 5#include "gettext.h"
d4a4f929 6#include "strbuf.h"
b1bda751 7#include "string-list.h"
c0821965 8#include "utf8.h"
4a59fd13 9
b02e7d5d
JS
10static int disallow_abbreviated_options;
11
d3428345
ÆAB
12enum opt_parsed {
13 OPT_LONG = 0,
14 OPT_SHORT = 1<<0,
15 OPT_UNSET = 1<<1,
16};
4a59fd13 17
53ca5694 18static void optbug(const struct option *opt, const char *reason)
1e5ce570 19{
53ca5694
ÆAB
20 if (opt->long_name && opt->short_name)
21 bug("switch '%c' (--%s) %s", opt->short_name,
22 opt->long_name, reason);
23 else if (opt->long_name)
24 bug("option '%s' %s", opt->long_name, reason);
25 else
26 bug("switch '%c' %s", opt->short_name, reason);
1e5ce570
JN
27}
28
d3428345 29static const char *optname(const struct option *opt, enum opt_parsed flags)
3c2047a7
ÆAB
30{
31 static struct strbuf sb = STRBUF_INIT;
32
33 strbuf_reset(&sb);
34 if (flags & OPT_SHORT)
35 strbuf_addf(&sb, "switch `%c'", opt->short_name);
36 else if (flags & OPT_UNSET)
37 strbuf_addf(&sb, "option `no-%s'", opt->long_name);
d3428345 38 else if (flags == OPT_LONG)
3c2047a7 39 strbuf_addf(&sb, "option `%s'", opt->long_name);
d3428345
ÆAB
40 else
41 BUG("optname() got unknown flags %d", flags);
3c2047a7
ÆAB
42
43 return sb.buf;
44}
45
f41179f1
NTND
46static enum parse_opt_result get_arg(struct parse_opt_ctx_t *p,
47 const struct option *opt,
d3428345 48 enum opt_parsed flags, const char **arg)
1cc6985c
PH
49{
50 if (p->opt) {
51 *arg = p->opt;
52 p->opt = NULL;
53 } else if (p->argc == 1 && (opt->flags & PARSE_OPT_LASTARG_DEFAULT)) {
54 *arg = (const char *)opt->defval;
d5d745f9 55 } else if (p->argc > 1) {
1cc6985c
PH
56 p->argc--;
57 *arg = *++p->argv;
58 } else
9440b831 59 return error(_("%s requires a value"), optname(opt, flags));
1cc6985c
PH
60 return 0;
61}
62
7ce4088a 63static void fix_filename(const char *prefix, char **file)
df217ed6 64{
7ce4088a
JK
65 if (!file || !*file)
66 ; /* leave as NULL */
7ce4088a 67 else
0bbe1031 68 *file = prefix_filename_except_for_dash(prefix, *file);
df217ed6
SB
69}
70
0025dde7
RS
71static enum parse_opt_result do_get_value(struct parse_opt_ctx_t *p,
72 const struct option *opt,
73 enum opt_parsed flags,
74 const char **argp)
4a59fd13 75{
ffe659f9 76 const char *s, *arg;
db7244bd 77 const int unset = flags & OPT_UNSET;
df217ed6 78 int err;
4a59fd13 79
db7244bd 80 if (unset && p->opt)
9440b831 81 return error(_("%s takes no value"), optname(opt, flags));
db7244bd 82 if (unset && (opt->flags & PARSE_OPT_NONEG))
9440b831 83 return error(_("%s isn't available"), optname(opt, flags));
c1f4ec9e 84 if (!(flags & OPT_SHORT) && p->opt && (opt->flags & PARSE_OPT_NOARG))
9440b831 85 return error(_("%s takes no value"), optname(opt, flags));
db7244bd 86
db7244bd 87 switch (opt->type) {
b0b3a8b6 88 case OPTION_LOWLEVEL_CALLBACK:
3ebbe289 89 return opt->ll_callback(p, opt, NULL, unset);
b0b3a8b6 90
db7244bd
PH
91 case OPTION_BIT:
92 if (unset)
93 *(int *)opt->value &= ~opt->defval;
4a59fd13 94 else
db7244bd
PH
95 *(int *)opt->value |= opt->defval;
96 return 0;
97
2f4b97f9
RS
98 case OPTION_NEGBIT:
99 if (unset)
100 *(int *)opt->value |= opt->defval;
101 else
102 *(int *)opt->value &= ~opt->defval;
103 return 0;
104
f62470c6
NTND
105 case OPTION_BITOP:
106 if (unset)
107 BUG("BITOP can't have unset form");
108 *(int *)opt->value &= ~opt->extra;
109 *(int *)opt->value |= opt->defval;
110 return 0;
111
b04ba2bb 112 case OPTION_COUNTUP:
e0070e8b
PB
113 if (*(int *)opt->value < 0)
114 *(int *)opt->value = 0;
db7244bd
PH
115 *(int *)opt->value = unset ? 0 : *(int *)opt->value + 1;
116 return 0;
117
118 case OPTION_SET_INT:
119 *(int *)opt->value = unset ? 0 : opt->defval;
120 return 0;
121
4a59fd13 122 case OPTION_STRING:
1cc6985c 123 if (unset)
db7244bd 124 *(const char **)opt->value = NULL;
1cc6985c 125 else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
ffe659f9 126 *(const char **)opt->value = (const char *)opt->defval;
1cc6985c
PH
127 else
128 return get_arg(p, opt, flags, (const char **)opt->value);
4a59fd13
PH
129 return 0;
130
df217ed6
SB
131 case OPTION_FILENAME:
132 err = 0;
133 if (unset)
134 *(const char **)opt->value = NULL;
135 else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
136 *(const char **)opt->value = (const char *)opt->defval;
137 else
138 err = get_arg(p, opt, flags, (const char **)opt->value);
139
140 if (!err)
7ce4088a 141 fix_filename(p->prefix, (char **)opt->value);
df217ed6
SB
142 return err;
143
ffe659f9 144 case OPTION_CALLBACK:
3ebbe289
NTND
145 {
146 const char *p_arg = NULL;
147 int p_unset;
148
db7244bd 149 if (unset)
3ebbe289
NTND
150 p_unset = 1;
151 else if (opt->flags & PARSE_OPT_NOARG)
152 p_unset = 0;
153 else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
154 p_unset = 0;
155 else if (get_arg(p, opt, flags, &arg))
1cc6985c 156 return -1;
3ebbe289
NTND
157 else {
158 p_unset = 0;
159 p_arg = arg;
160 }
0025dde7
RS
161 if (opt->flags & PARSE_OPT_CMDMODE)
162 *argp = p_arg;
3ebbe289
NTND
163 if (opt->callback)
164 return (*opt->callback)(opt, p_arg, p_unset) ? (-1) : 0;
165 else
166 return (*opt->ll_callback)(p, opt, p_arg, p_unset);
167 }
4a59fd13 168 case OPTION_INTEGER:
db7244bd 169 if (unset) {
4a59fd13
PH
170 *(int *)opt->value = 0;
171 return 0;
172 }
c43a2483 173 if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
ffe659f9
PH
174 *(int *)opt->value = opt->defval;
175 return 0;
176 }
1cc6985c
PH
177 if (get_arg(p, opt, flags, &arg))
178 return -1;
f7e68a08
NTND
179 if (!*arg)
180 return error(_("%s expects a numerical value"),
181 optname(opt, flags));
1cc6985c 182 *(int *)opt->value = strtol(arg, (char **)&s, 10);
4a59fd13 183 if (*s)
9440b831
NTND
184 return error(_("%s expects a numerical value"),
185 optname(opt, flags));
4a59fd13
PH
186 return 0;
187
2a514ed8
CB
188 case OPTION_MAGNITUDE:
189 if (unset) {
190 *(unsigned long *)opt->value = 0;
191 return 0;
192 }
193 if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
194 *(unsigned long *)opt->value = opt->defval;
195 return 0;
196 }
197 if (get_arg(p, opt, flags, &arg))
198 return -1;
199 if (!git_parse_ulong(arg, opt->value))
9440b831
NTND
200 return error(_("%s expects a non-negative integer value"
201 " with an optional k/m/g suffix"),
202 optname(opt, flags));
2a514ed8
CB
203 return 0;
204
4a59fd13 205 default:
48a5499e 206 BUG("opt->type %d should not happen", opt->type);
4a59fd13
PH
207 }
208}
209
0025dde7
RS
210struct parse_opt_cmdmode_list {
211 int value, *value_ptr;
212 const struct option *opt;
213 const char *arg;
214 enum opt_parsed flags;
215 struct parse_opt_cmdmode_list *next;
216};
217
218static void build_cmdmode_list(struct parse_opt_ctx_t *ctx,
219 const struct option *opts)
220{
221 ctx->cmdmode_list = NULL;
222
223 for (; opts->type != OPTION_END; opts++) {
224 struct parse_opt_cmdmode_list *elem = ctx->cmdmode_list;
225 int *value_ptr = opts->value;
226
227 if (!(opts->flags & PARSE_OPT_CMDMODE) || !value_ptr)
228 continue;
229
230 while (elem && elem->value_ptr != value_ptr)
231 elem = elem->next;
232 if (elem)
233 continue;
234
235 CALLOC_ARRAY(elem, 1);
236 elem->value_ptr = value_ptr;
237 elem->value = *value_ptr;
238 elem->next = ctx->cmdmode_list;
239 ctx->cmdmode_list = elem;
240 }
241}
242
243static char *optnamearg(const struct option *opt, const char *arg,
244 enum opt_parsed flags)
245{
246 if (flags & OPT_SHORT)
247 return xstrfmt("-%c%s", opt->short_name, arg ? arg : "");
248 return xstrfmt("--%s%s%s%s", flags & OPT_UNSET ? "no-" : "",
249 opt->long_name, arg ? "=" : "", arg ? arg : "");
250}
251
252static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
253 const struct option *opt,
254 enum opt_parsed flags)
255{
256 const char *arg = NULL;
257 enum parse_opt_result result = do_get_value(p, opt, flags, &arg);
258 struct parse_opt_cmdmode_list *elem = p->cmdmode_list;
259 char *opt_name, *other_opt_name;
260
261 for (; elem; elem = elem->next) {
262 if (*elem->value_ptr == elem->value)
263 continue;
264
265 if (elem->opt &&
266 (elem->opt->flags | opt->flags) & PARSE_OPT_CMDMODE)
267 break;
268
269 elem->opt = opt;
270 elem->arg = arg;
271 elem->flags = flags;
272 elem->value = *elem->value_ptr;
273 }
274
275 if (result || !elem)
276 return result;
277
278 opt_name = optnamearg(opt, arg, flags);
279 other_opt_name = optnamearg(elem->opt, elem->arg, elem->flags);
280 error(_("%s is incompatible with %s"), opt_name, other_opt_name);
281 free(opt_name);
282 free(other_opt_name);
283 return -1;
284}
285
f41179f1
NTND
286static enum parse_opt_result parse_short_opt(struct parse_opt_ctx_t *p,
287 const struct option *options)
4a59fd13 288{
e0319ff5
RS
289 const struct option *numopt = NULL;
290
4a59fd13
PH
291 for (; options->type != OPTION_END; options++) {
292 if (options->short_name == *p->opt) {
293 p->opt = p->opt[1] ? p->opt + 1 : NULL;
0025dde7 294 return get_value(p, options, OPT_SHORT);
4a59fd13 295 }
e0319ff5
RS
296
297 /*
298 * Handle the numerical option later, explicit one-digit
299 * options take precedence over it.
300 */
301 if (options->type == OPTION_NUMBER)
302 numopt = options;
303 }
304 if (numopt && isdigit(*p->opt)) {
305 size_t len = 1;
306 char *arg;
307 int rc;
308
309 while (isdigit(p->opt[len]))
310 len++;
311 arg = xmemdupz(p->opt, len);
312 p->opt = p->opt[len] ? p->opt + len : NULL;
3ebbe289
NTND
313 if (numopt->callback)
314 rc = (*numopt->callback)(numopt, arg, 0) ? (-1) : 0;
315 else
316 rc = (*numopt->ll_callback)(p, numopt, arg, 0);
e0319ff5
RS
317 free(arg);
318 return rc;
4a59fd13 319 }
f41179f1 320 return PARSE_OPT_UNKNOWN;
4a59fd13
PH
321}
322
5c387428
NTND
323static int has_string(const char *it, const char **array)
324{
325 while (*array)
326 if (!strcmp(it, *(array++)))
327 return 1;
328 return 0;
329}
330
331static int is_alias(struct parse_opt_ctx_t *ctx,
332 const struct option *one_opt,
333 const struct option *another_opt)
334{
335 const char **group;
336
337 if (!ctx->alias_groups)
338 return 0;
339
340 if (!one_opt->long_name || !another_opt->long_name)
341 return 0;
342
343 for (group = ctx->alias_groups; *group; group += 3) {
344 /* it and other are from the same family? */
345 if (has_string(one_opt->long_name, group) &&
346 has_string(another_opt->long_name, group))
347 return 1;
348 }
349 return 0;
350}
351
f41179f1
NTND
352static enum parse_opt_result parse_long_opt(
353 struct parse_opt_ctx_t *p, const char *arg,
354 const struct option *options)
4a59fd13 355{
2c5495f7 356 const char *arg_end = strchrnul(arg, '=');
243e0614 357 const struct option *abbrev_option = NULL, *ambiguous_option = NULL;
d3428345 358 enum opt_parsed abbrev_flags = OPT_LONG, ambiguous_flags = OPT_LONG;
7f275b91 359
4a59fd13 360 for (; options->type != OPTION_END; options++) {
0f1930c5 361 const char *rest, *long_name = options->long_name;
d3428345 362 enum opt_parsed flags = OPT_LONG, opt_flags = OPT_LONG;
4a59fd13 363
fa83cc83
SG
364 if (options->type == OPTION_SUBCOMMAND)
365 continue;
0f1930c5 366 if (!long_name)
4a59fd13
PH
367 continue;
368
0f1930c5 369again:
cf4fff57
JK
370 if (!skip_prefix(arg, long_name, &rest))
371 rest = NULL;
4a59fd13 372 if (!rest) {
7f275b91 373 /* abbreviated? */
99d86d60 374 if (!(p->flags & PARSE_OPT_KEEP_UNKNOWN_OPT) &&
baa4adc6 375 !strncmp(long_name, arg, arg_end - arg)) {
7f275b91 376is_abbreviated:
5c387428
NTND
377 if (abbrev_option &&
378 !is_alias(p, abbrev_option, options)) {
243e0614
JS
379 /*
380 * If this is abbreviated, it is
381 * ambiguous. So when there is no
382 * exact match later, we need to
383 * error out.
384 */
385 ambiguous_option = abbrev_option;
386 ambiguous_flags = abbrev_flags;
387 }
7f275b91
JS
388 if (!(flags & OPT_UNSET) && *arg_end)
389 p->opt = arg_end + 1;
390 abbrev_option = options;
0f1930c5 391 abbrev_flags = flags ^ opt_flags;
7f275b91
JS
392 continue;
393 }
6bbfd1fa
AS
394 /* negation allowed? */
395 if (options->flags & PARSE_OPT_NONEG)
396 continue;
7f275b91 397 /* negated and abbreviated very much? */
59556548 398 if (starts_with("no-", arg)) {
7f275b91
JS
399 flags |= OPT_UNSET;
400 goto is_abbreviated;
401 }
402 /* negated? */
59556548 403 if (!starts_with(arg, "no-")) {
145136a9 404 if (skip_prefix(long_name, "no-", &long_name)) {
0f1930c5
RS
405 opt_flags |= OPT_UNSET;
406 goto again;
407 }
4a59fd13 408 continue;
0f1930c5 409 }
4a59fd13 410 flags |= OPT_UNSET;
cf4fff57
JK
411 if (!skip_prefix(arg + 3, long_name, &rest)) {
412 /* abbreviated and negated? */
413 if (starts_with(long_name, arg + 3))
414 goto is_abbreviated;
415 else
416 continue;
417 }
4a59fd13
PH
418 }
419 if (*rest) {
420 if (*rest != '=')
421 continue;
422 p->opt = rest + 1;
423 }
0025dde7 424 return get_value(p, options, flags ^ opt_flags);
4a59fd13 425 }
243e0614 426
b02e7d5d
JS
427 if (disallow_abbreviated_options && (ambiguous_option || abbrev_option))
428 die("disallowed abbreviated or ambiguous option '%.*s'",
429 (int)(arg_end - arg), arg);
430
3bb0923f 431 if (ambiguous_option) {
89003426
NTND
432 error(_("ambiguous option: %s "
433 "(could be --%s%s or --%s%s)"),
243e0614
JS
434 arg,
435 (ambiguous_flags & OPT_UNSET) ? "no-" : "",
436 ambiguous_option->long_name,
437 (abbrev_flags & OPT_UNSET) ? "no-" : "",
438 abbrev_option->long_name);
f41179f1 439 return PARSE_OPT_HELP;
3bb0923f 440 }
7f275b91 441 if (abbrev_option)
0025dde7 442 return get_value(p, abbrev_option, abbrev_flags);
f41179f1 443 return PARSE_OPT_UNKNOWN;
4a59fd13
PH
444}
445
68611f51
ÆAB
446static enum parse_opt_result parse_nodash_opt(struct parse_opt_ctx_t *p,
447 const char *arg,
448 const struct option *options)
51a9949e
RS
449{
450 for (; options->type != OPTION_END; options++) {
451 if (!(options->flags & PARSE_OPT_NODASH))
452 continue;
51a9949e 453 if (options->short_name == arg[0] && arg[1] == '\0')
0025dde7 454 return get_value(p, options, OPT_SHORT);
51a9949e 455 }
68611f51 456 return PARSE_OPT_ERROR;
51a9949e
RS
457}
458
fa83cc83
SG
459static enum parse_opt_result parse_subcommand(const char *arg,
460 const struct option *options)
461{
462 for (; options->type != OPTION_END; options++)
463 if (options->type == OPTION_SUBCOMMAND &&
464 !strcmp(options->long_name, arg)) {
465 *(parse_opt_subcommand_fn **)options->value = options->subcommand_fn;
466 return PARSE_OPT_SUBCOMMAND;
467 }
468
469 return PARSE_OPT_UNKNOWN;
470}
471
1121a878 472static void check_typos(const char *arg, const struct option *options)
3a9f0f41
PH
473{
474 if (strlen(arg) < 3)
475 return;
476
59556548 477 if (starts_with(arg, "no-")) {
395518cf 478 error(_("did you mean `--%s` (with two dashes)?"), arg);
3a9f0f41
PH
479 exit(129);
480 }
481
482 for (; options->type != OPTION_END; options++) {
483 if (!options->long_name)
484 continue;
59556548 485 if (starts_with(options->long_name, arg)) {
395518cf 486 error(_("did you mean `--%s` (with two dashes)?"), arg);
3a9f0f41
PH
487 exit(129);
488 }
489 }
490}
491
cb9d398c
PH
492static void parse_options_check(const struct option *opts)
493{
af465af8 494 char short_opts[128];
fa83cc83 495 void *subcommand_value = NULL;
cb9d398c 496
af465af8 497 memset(short_opts, '\0', sizeof(short_opts));
cb9d398c
PH
498 for (; opts->type != OPTION_END; opts++) {
499 if ((opts->flags & PARSE_OPT_LASTARG_DEFAULT) &&
1e5ce570 500 (opts->flags & PARSE_OPT_OPTARG))
53ca5694
ÆAB
501 optbug(opts, "uses incompatible flags "
502 "LASTARG_DEFAULT and OPTARG");
af465af8
JH
503 if (opts->short_name) {
504 if (0x7F <= opts->short_name)
53ca5694 505 optbug(opts, "invalid short name");
af465af8 506 else if (short_opts[opts->short_name]++)
53ca5694 507 optbug(opts, "short name already used");
af465af8 508 }
a02dd4ff
JN
509 if (opts->flags & PARSE_OPT_NODASH &&
510 ((opts->flags & PARSE_OPT_OPTARG) ||
511 !(opts->flags & PARSE_OPT_NOARG) ||
512 !(opts->flags & PARSE_OPT_NONEG) ||
513 opts->long_name))
53ca5694
ÆAB
514 optbug(opts, "uses feature "
515 "not supported for dashless options");
3284b938
RS
516 if (opts->type == OPTION_SET_INT && !opts->defval &&
517 opts->long_name && !(opts->flags & PARSE_OPT_NONEG))
518 optbug(opts, "OPTION_SET_INT 0 should not be negatable");
5c400ed2 519 switch (opts->type) {
b04ba2bb 520 case OPTION_COUNTUP:
5c400ed2
JN
521 case OPTION_BIT:
522 case OPTION_NEGBIT:
523 case OPTION_SET_INT:
5c400ed2
JN
524 case OPTION_NUMBER:
525 if ((opts->flags & PARSE_OPT_OPTARG) ||
526 !(opts->flags & PARSE_OPT_NOARG))
53ca5694 527 optbug(opts, "should not accept an argument");
bf3ff338
NTND
528 break;
529 case OPTION_CALLBACK:
3ebbe289 530 if (!opts->callback && !opts->ll_callback)
5b2f5d92
ÆAB
531 optbug(opts, "OPTION_CALLBACK needs one callback");
532 else if (opts->callback && opts->ll_callback)
533 optbug(opts, "OPTION_CALLBACK can't have two callbacks");
bf3ff338
NTND
534 break;
535 case OPTION_LOWLEVEL_CALLBACK:
536 if (!opts->ll_callback)
5b2f5d92 537 optbug(opts, "OPTION_LOWLEVEL_CALLBACK needs a callback");
bf3ff338 538 if (opts->callback)
5b2f5d92 539 optbug(opts, "OPTION_LOWLEVEL_CALLBACK needs no high level callback");
bf3ff338 540 break;
5c387428 541 case OPTION_ALIAS:
5b2f5d92
ÆAB
542 optbug(opts, "OPT_ALIAS() should not remain at this point. "
543 "Are you using parse_options_step() directly?\n"
544 "That case is not supported yet.");
545 break;
fa83cc83
SG
546 case OPTION_SUBCOMMAND:
547 if (!opts->value || !opts->subcommand_fn)
548 optbug(opts, "OPTION_SUBCOMMAND needs a value and a subcommand function");
549 if (!subcommand_value)
550 subcommand_value = opts->value;
551 else if (subcommand_value != opts->value)
552 optbug(opts, "all OPTION_SUBCOMMANDs need the same value");
553 break;
5c400ed2
JN
554 default:
555 ; /* ok. (usually accepts an argument) */
556 }
b6c2a0d4
JH
557 if (opts->argh &&
558 strcspn(opts->argh, " _") != strlen(opts->argh))
53ca5694 559 optbug(opts, "multi-word argh should use dash to separate words");
cb9d398c 560 }
53ca5694 561 BUG_if_bug("invalid 'struct option'");
cb9d398c
PH
562}
563
fa83cc83
SG
564static int has_subcommands(const struct option *options)
565{
566 for (; options->type != OPTION_END; options++)
567 if (options->type == OPTION_SUBCOMMAND)
568 return 1;
569 return 0;
570}
571
5c387428
NTND
572static void parse_options_start_1(struct parse_opt_ctx_t *ctx,
573 int argc, const char **argv, const char *prefix,
3f9ab7cc
ÆAB
574 const struct option *options,
575 enum parse_opt_flags flags)
7e7bbcb4 576{
202fbb33
NTND
577 ctx->argc = argc;
578 ctx->argv = argv;
579 if (!(flags & PARSE_OPT_ONE_SHOT)) {
580 ctx->argc--;
581 ctx->argv++;
582 }
583 ctx->total = ctx->argc;
584 ctx->out = argv;
37782920 585 ctx->prefix = prefix;
a32a4eaa 586 ctx->cpidx = ((flags & PARSE_OPT_KEEP_ARGV0) != 0);
7e7bbcb4 587 ctx->flags = flags;
fa83cc83
SG
588 ctx->has_subcommands = has_subcommands(options);
589 if (!ctx->has_subcommands && (flags & PARSE_OPT_SUBCOMMAND_OPTIONAL))
590 BUG("Using PARSE_OPT_SUBCOMMAND_OPTIONAL without subcommands");
591 if (ctx->has_subcommands) {
592 if (flags & PARSE_OPT_STOP_AT_NON_OPTION)
593 BUG("subcommands are incompatible with PARSE_OPT_STOP_AT_NON_OPTION");
594 if (!(flags & PARSE_OPT_SUBCOMMAND_OPTIONAL)) {
595 if (flags & PARSE_OPT_KEEP_UNKNOWN_OPT)
596 BUG("subcommands are incompatible with PARSE_OPT_KEEP_UNKNOWN_OPT unless in combination with PARSE_OPT_SUBCOMMAND_OPTIONAL");
597 if (flags & PARSE_OPT_KEEP_DASHDASH)
598 BUG("subcommands are incompatible with PARSE_OPT_KEEP_DASHDASH unless in combination with PARSE_OPT_SUBCOMMAND_OPTIONAL");
599 }
600 }
99d86d60 601 if ((flags & PARSE_OPT_KEEP_UNKNOWN_OPT) &&
202fbb33
NTND
602 (flags & PARSE_OPT_STOP_AT_NON_OPTION) &&
603 !(flags & PARSE_OPT_ONE_SHOT))
48a5499e 604 BUG("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
202fbb33
NTND
605 if ((flags & PARSE_OPT_ONE_SHOT) &&
606 (flags & PARSE_OPT_KEEP_ARGV0))
607 BUG("Can't keep argv0 if you don't have it");
9ca1169f 608 parse_options_check(options);
0025dde7 609 build_cmdmode_list(ctx, options);
7e7bbcb4
PH
610}
611
5c387428
NTND
612void parse_options_start(struct parse_opt_ctx_t *ctx,
613 int argc, const char **argv, const char *prefix,
3f9ab7cc
ÆAB
614 const struct option *options,
615 enum parse_opt_flags flags)
5c387428
NTND
616{
617 memset(ctx, 0, sizeof(*ctx));
618 parse_options_start_1(ctx, argc, argv, prefix, options, flags);
619}
620
a0abe5e3
RZ
621static void show_negated_gitcomp(const struct option *opts, int show_all,
622 int nr_noopts)
b221b5ab
NTND
623{
624 int printed_dashdash = 0;
625
626 for (; opts->type != OPTION_END; opts++) {
627 int has_unset_form = 0;
628 const char *name;
629
630 if (!opts->long_name)
631 continue;
a0abe5e3
RZ
632 if (!show_all &&
633 (opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE)))
b221b5ab
NTND
634 continue;
635 if (opts->flags & PARSE_OPT_NONEG)
636 continue;
637
638 switch (opts->type) {
639 case OPTION_STRING:
640 case OPTION_FILENAME:
641 case OPTION_INTEGER:
642 case OPTION_MAGNITUDE:
643 case OPTION_CALLBACK:
644 case OPTION_BIT:
645 case OPTION_NEGBIT:
646 case OPTION_COUNTUP:
647 case OPTION_SET_INT:
648 has_unset_form = 1;
649 break;
650 default:
651 break;
652 }
653 if (!has_unset_form)
654 continue;
655
656 if (skip_prefix(opts->long_name, "no-", &name)) {
657 if (nr_noopts < 0)
658 printf(" --%s", name);
659 } else if (nr_noopts >= 0) {
660 if (nr_noopts && !printed_dashdash) {
661 printf(" --");
662 printed_dashdash = 1;
663 }
664 printf(" --no-%s", opts->long_name);
665 nr_noopts++;
666 }
667 }
668}
669
a0abe5e3 670static int show_gitcomp(const struct option *opts, int show_all)
b9d7f4b4 671{
b221b5ab
NTND
672 const struct option *original_opts = opts;
673 int nr_noopts = 0;
674
b9d7f4b4 675 for (; opts->type != OPTION_END; opts++) {
fa83cc83 676 const char *prefix = "--";
b9d7f4b4
NTND
677 const char *suffix = "";
678
679 if (!opts->long_name)
680 continue;
a0abe5e3 681 if (!show_all &&
ca2d62b7 682 (opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE | PARSE_OPT_FROM_ALIAS)))
b9d7f4b4
NTND
683 continue;
684
685 switch (opts->type) {
fa83cc83
SG
686 case OPTION_SUBCOMMAND:
687 prefix = "";
688 break;
b9d7f4b4
NTND
689 case OPTION_GROUP:
690 continue;
691 case OPTION_STRING:
692 case OPTION_FILENAME:
693 case OPTION_INTEGER:
694 case OPTION_MAGNITUDE:
695 case OPTION_CALLBACK:
696 if (opts->flags & PARSE_OPT_NOARG)
697 break;
698 if (opts->flags & PARSE_OPT_OPTARG)
699 break;
700 if (opts->flags & PARSE_OPT_LASTARG_DEFAULT)
701 break;
702 suffix = "=";
703 break;
704 default:
705 break;
706 }
ebc4a04e
NTND
707 if (opts->flags & PARSE_OPT_COMP_ARG)
708 suffix = "=";
b221b5ab
NTND
709 if (starts_with(opts->long_name, "no-"))
710 nr_noopts++;
fa83cc83
SG
711 printf("%s%s%s%s", opts == original_opts ? "" : " ",
712 prefix, opts->long_name, suffix);
b9d7f4b4 713 }
a0abe5e3
RZ
714 show_negated_gitcomp(original_opts, show_all, -1);
715 show_negated_gitcomp(original_opts, show_all, nr_noopts);
b9d7f4b4 716 fputc('\n', stdout);
a92ec7ef 717 return PARSE_OPT_COMPLETE;
b9d7f4b4
NTND
718}
719
5c387428
NTND
720/*
721 * Scan and may produce a new option[] array, which should be used
722 * instead of the original 'options'.
723 *
15beaaa3 724 * Right now this is only used to preprocess and substitute
5c387428 725 * OPTION_ALIAS.
64cc539f
AH
726 *
727 * The returned options should be freed using free_preprocessed_options.
5c387428
NTND
728 */
729static struct option *preprocess_options(struct parse_opt_ctx_t *ctx,
730 const struct option *options)
731{
732 struct option *newopt;
733 int i, nr, alias;
734 int nr_aliases = 0;
735
736 for (nr = 0; options[nr].type != OPTION_END; nr++) {
737 if (options[nr].type == OPTION_ALIAS)
738 nr_aliases++;
739 }
740
741 if (!nr_aliases)
742 return NULL;
743
6e578410 744 DUP_ARRAY(newopt, options, nr + 1);
5c387428
NTND
745
746 /* each alias has two string pointers and NULL */
747 CALLOC_ARRAY(ctx->alias_groups, 3 * (nr_aliases + 1));
748
749 for (alias = 0, i = 0; i < nr; i++) {
750 int short_name;
751 const char *long_name;
752 const char *source;
7c280589 753 struct strbuf help = STRBUF_INIT;
5c387428
NTND
754 int j;
755
756 if (newopt[i].type != OPTION_ALIAS)
757 continue;
758
759 short_name = newopt[i].short_name;
760 long_name = newopt[i].long_name;
761 source = newopt[i].value;
762
763 if (!long_name)
764 BUG("An alias must have long option name");
7c280589 765 strbuf_addf(&help, _("alias of --%s"), source);
5c387428
NTND
766
767 for (j = 0; j < nr; j++) {
768 const char *name = options[j].long_name;
769
770 if (!name || strcmp(name, source))
771 continue;
772
773 if (options[j].type == OPTION_ALIAS)
774 BUG("No please. Nested aliases are not supported.");
775
5c387428
NTND
776 memcpy(newopt + i, options + j, sizeof(*newopt));
777 newopt[i].short_name = short_name;
778 newopt[i].long_name = long_name;
7c280589 779 newopt[i].help = strbuf_detach(&help, NULL);
64cc539f 780 newopt[i].flags |= PARSE_OPT_FROM_ALIAS;
5c387428
NTND
781 break;
782 }
783
784 if (j == nr)
785 BUG("could not find source option '%s' of alias '%s'",
786 source, newopt[i].long_name);
787 ctx->alias_groups[alias * 3 + 0] = newopt[i].long_name;
788 ctx->alias_groups[alias * 3 + 1] = options[j].long_name;
789 ctx->alias_groups[alias * 3 + 2] = NULL;
790 alias++;
791 }
792
793 return newopt;
794}
795
64cc539f
AH
796static void free_preprocessed_options(struct option *options)
797{
798 int i;
799
800 if (!options)
801 return;
802
803 for (i = 0; options[i].type != OPTION_END; i++) {
804 if (options[i].flags & PARSE_OPT_FROM_ALIAS)
805 free((void *)options[i].help);
806 }
807 free(options);
808}
809
352e7613
ÆAB
810static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t *,
811 const char * const *,
812 const struct option *,
813 int, int);
dd3bf0f4 814
352e7613
ÆAB
815enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
816 const struct option *options,
817 const char * const usagestr[])
4a59fd13 818{
b92891f9
RS
819 int internal_help = !(ctx->flags & PARSE_OPT_NO_INTERNAL_HELP);
820
26141b5b
PH
821 /* we must reset ->opt, unknown short option leave it dangling */
822 ctx->opt = NULL;
823
ff43ec3e
PH
824 for (; ctx->argc; ctx->argc--, ctx->argv++) {
825 const char *arg = ctx->argv[0];
4a59fd13 826
202fbb33
NTND
827 if (ctx->flags & PARSE_OPT_ONE_SHOT &&
828 ctx->argc != ctx->total)
829 break;
830
4a59fd13 831 if (*arg != '-' || !arg[1]) {
51a9949e
RS
832 if (parse_nodash_opt(ctx, arg, options) == 0)
833 continue;
fa83cc83
SG
834 if (!ctx->has_subcommands) {
835 if (ctx->flags & PARSE_OPT_STOP_AT_NON_OPTION)
836 return PARSE_OPT_NON_OPTION;
837 ctx->out[ctx->cpidx++] = ctx->argv[0];
838 continue;
839 }
840 switch (parse_subcommand(arg, options)) {
841 case PARSE_OPT_SUBCOMMAND:
842 return PARSE_OPT_SUBCOMMAND;
843 case PARSE_OPT_UNKNOWN:
844 if (ctx->flags & PARSE_OPT_SUBCOMMAND_OPTIONAL)
845 /*
846 * arg is neither a short or long
847 * option nor a subcommand. Since
848 * this command has a default
849 * operation mode, we have to treat
850 * this arg and all remaining args
851 * as args meant to that default
852 * operation mode.
853 * So we are done parsing.
854 */
855 return PARSE_OPT_DONE;
856 error(_("unknown subcommand: `%s'"), arg);
857 usage_with_options(usagestr, options);
858 case PARSE_OPT_COMPLETE:
859 case PARSE_OPT_HELP:
860 case PARSE_OPT_ERROR:
861 case PARSE_OPT_DONE:
862 case PARSE_OPT_NON_OPTION:
863 /* Impossible. */
864 BUG("parse_subcommand() cannot return these");
865 }
4a59fd13
PH
866 }
867
5ad0d3d5
RS
868 /* lone -h asks for help */
869 if (internal_help && ctx->total == 1 && !strcmp(arg + 1, "h"))
870 goto show_usage;
871
a0abe5e3
RZ
872 /*
873 * lone --git-completion-helper and --git-completion-helper-all
874 * are asked by git-completion.bash
875 */
876 if (ctx->total == 1 && !strcmp(arg, "--git-completion-helper"))
877 return show_gitcomp(options, 0);
878 if (ctx->total == 1 && !strcmp(arg, "--git-completion-helper-all"))
879 return show_gitcomp(options, 1);
b9d7f4b4 880
4a59fd13 881 if (arg[1] != '-') {
ff43ec3e 882 ctx->opt = arg + 1;
07fe54db 883 switch (parse_short_opt(ctx, options)) {
f41179f1 884 case PARSE_OPT_ERROR:
3bb0923f 885 return PARSE_OPT_ERROR;
f41179f1 886 case PARSE_OPT_UNKNOWN:
38916c5b
RS
887 if (ctx->opt)
888 check_typos(arg + 1, options);
5ad0d3d5
RS
889 if (internal_help && *ctx->opt == 'h')
890 goto show_usage;
b5ce3a54 891 goto unknown;
f41179f1 892 case PARSE_OPT_NON_OPTION:
fa83cc83 893 case PARSE_OPT_SUBCOMMAND:
f41179f1
NTND
894 case PARSE_OPT_HELP:
895 case PARSE_OPT_COMPLETE:
896 BUG("parse_short_opt() cannot return these");
897 case PARSE_OPT_DONE:
898 break;
07fe54db 899 }
ff43ec3e 900 if (ctx->opt)
3a9f0f41 901 check_typos(arg + 1, options);
ff43ec3e 902 while (ctx->opt) {
07fe54db 903 switch (parse_short_opt(ctx, options)) {
f41179f1 904 case PARSE_OPT_ERROR:
3bb0923f 905 return PARSE_OPT_ERROR;
f41179f1 906 case PARSE_OPT_UNKNOWN:
5ad0d3d5
RS
907 if (internal_help && *ctx->opt == 'h')
908 goto show_usage;
909
26141b5b
PH
910 /* fake a short option thing to hide the fact that we may have
911 * started to parse aggregated stuff
912 *
913 * This is leaky, too bad.
914 */
915 ctx->argv[0] = xstrdup(ctx->opt - 1);
916 *(char *)ctx->argv[0] = '-';
b5ce3a54 917 goto unknown;
f41179f1 918 case PARSE_OPT_NON_OPTION:
fa83cc83 919 case PARSE_OPT_SUBCOMMAND:
f41179f1
NTND
920 case PARSE_OPT_COMPLETE:
921 case PARSE_OPT_HELP:
922 BUG("parse_short_opt() cannot return these");
923 case PARSE_OPT_DONE:
924 break;
07fe54db 925 }
3a9f0f41 926 }
4a59fd13
PH
927 continue;
928 }
929
51b4594b
JK
930 if (!arg[2] /* "--" */ ||
931 !strcmp(arg + 2, "end-of-options")) {
ff43ec3e
PH
932 if (!(ctx->flags & PARSE_OPT_KEEP_DASHDASH)) {
933 ctx->argc--;
934 ctx->argv++;
4a59fd13
PH
935 }
936 break;
937 }
938
b92891f9 939 if (internal_help && !strcmp(arg + 2, "help-all"))
47e9cd28 940 return usage_with_options_internal(ctx, usagestr, options, 1, 0);
b92891f9 941 if (internal_help && !strcmp(arg + 2, "help"))
ac20ff6d 942 goto show_usage;
07fe54db 943 switch (parse_long_opt(ctx, arg + 2, options)) {
f41179f1 944 case PARSE_OPT_ERROR:
3bb0923f 945 return PARSE_OPT_ERROR;
f41179f1 946 case PARSE_OPT_UNKNOWN:
b5ce3a54 947 goto unknown;
f41179f1 948 case PARSE_OPT_HELP:
3bb0923f 949 goto show_usage;
f41179f1 950 case PARSE_OPT_NON_OPTION:
fa83cc83 951 case PARSE_OPT_SUBCOMMAND:
f41179f1
NTND
952 case PARSE_OPT_COMPLETE:
953 BUG("parse_long_opt() cannot return these");
954 case PARSE_OPT_DONE:
955 break;
07fe54db 956 }
b5ce3a54
RS
957 continue;
958unknown:
202fbb33
NTND
959 if (ctx->flags & PARSE_OPT_ONE_SHOT)
960 break;
fa83cc83
SG
961 if (ctx->has_subcommands &&
962 (ctx->flags & PARSE_OPT_SUBCOMMAND_OPTIONAL) &&
963 (ctx->flags & PARSE_OPT_KEEP_UNKNOWN_OPT)) {
964 /*
965 * Found an unknown option given to a command with
966 * subcommands that has a default operation mode:
967 * we treat this option and all remaining args as
968 * arguments meant to that default operation mode.
969 * So we are done parsing.
970 */
971 return PARSE_OPT_DONE;
972 }
99d86d60 973 if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN_OPT))
b5ce3a54
RS
974 return PARSE_OPT_UNKNOWN;
975 ctx->out[ctx->cpidx++] = ctx->argv[0];
976 ctx->opt = NULL;
ff43ec3e
PH
977 }
978 return PARSE_OPT_DONE;
ac20ff6d 979
ac20ff6d 980 show_usage:
3bb0923f 981 return usage_with_options_internal(ctx, usagestr, options, 0, 0);
ff43ec3e
PH
982}
983
984int parse_options_end(struct parse_opt_ctx_t *ctx)
985{
202fbb33
NTND
986 if (ctx->flags & PARSE_OPT_ONE_SHOT)
987 return ctx->total - ctx->argc;
988
f919ffeb 989 MOVE_ARRAY(ctx->out + ctx->cpidx, ctx->argv, ctx->argc);
ff43ec3e
PH
990 ctx->out[ctx->cpidx + ctx->argc] = NULL;
991 return ctx->cpidx + ctx->argc;
992}
993
06a199f3
ÆAB
994int parse_options(int argc, const char **argv,
995 const char *prefix,
996 const struct option *options,
997 const char * const usagestr[],
998 enum parse_opt_flags flags)
ff43ec3e
PH
999{
1000 struct parse_opt_ctx_t ctx;
5c387428 1001 struct option *real_options;
ff43ec3e 1002
b02e7d5d
JS
1003 disallow_abbreviated_options =
1004 git_env_bool("GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS", 0);
1005
5c387428
NTND
1006 memset(&ctx, 0, sizeof(ctx));
1007 real_options = preprocess_options(&ctx, options);
1008 if (real_options)
1009 options = real_options;
1010 parse_options_start_1(&ctx, argc, argv, prefix, options, flags);
ff43ec3e
PH
1011 switch (parse_options_step(&ctx, options, usagestr)) {
1012 case PARSE_OPT_HELP:
3bb0923f 1013 case PARSE_OPT_ERROR:
ff43ec3e 1014 exit(129);
a92ec7ef
NTND
1015 case PARSE_OPT_COMPLETE:
1016 exit(0);
979240fe 1017 case PARSE_OPT_NON_OPTION:
fa83cc83
SG
1018 case PARSE_OPT_SUBCOMMAND:
1019 break;
ff43ec3e 1020 case PARSE_OPT_DONE:
fa83cc83
SG
1021 if (ctx.has_subcommands &&
1022 !(flags & PARSE_OPT_SUBCOMMAND_OPTIONAL)) {
1023 error(_("need a subcommand"));
1024 usage_with_options(usagestr, options);
1025 }
ff43ec3e 1026 break;
1b887353 1027 case PARSE_OPT_UNKNOWN:
07fe54db 1028 if (ctx.argv[0][1] == '-') {
89003426 1029 error(_("unknown option `%s'"), ctx.argv[0] + 2);
b141a478 1030 } else if (isascii(*ctx.opt)) {
89003426 1031 error(_("unknown switch `%c'"), *ctx.opt);
b141a478 1032 } else {
89003426 1033 error(_("unknown non-ascii option in string: `%s'"),
b141a478 1034 ctx.argv[0]);
07fe54db
PH
1035 }
1036 usage_with_options(usagestr, options);
4a59fd13
PH
1037 }
1038
5c327502 1039 precompose_argv_prefix(argc, argv, NULL);
64cc539f 1040 free_preprocessed_options(real_options);
5c387428 1041 free(ctx.alias_groups);
0025dde7
RS
1042 for (struct parse_opt_cmdmode_list *elem = ctx.cmdmode_list; elem;) {
1043 struct parse_opt_cmdmode_list *next = elem->next;
1044 free(elem);
1045 elem = next;
1046 }
7e7bbcb4 1047 return parse_options_end(&ctx);
4a59fd13 1048}
d7a38c54 1049
9c7304e3 1050static int usage_argh(const struct option *opts, FILE *outfile)
29f25d49
SB
1051{
1052 const char *s;
5f0df44c
RS
1053 int literal = (opts->flags & PARSE_OPT_LITERAL_ARGHELP) ||
1054 !opts->argh || !!strpbrk(opts->argh, "()<>[]|");
29f25d49
SB
1055 if (opts->flags & PARSE_OPT_OPTARG)
1056 if (opts->long_name)
1057 s = literal ? "[=%s]" : "[=<%s>]";
1058 else
1059 s = literal ? "[%s]" : "[<%s>]";
1060 else
1061 s = literal ? " %s" : " <%s>";
c0821965 1062 return utf8_fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
29f25d49
SB
1063}
1064
652a6b15
RS
1065static int usage_indent(FILE *outfile)
1066{
1067 return fprintf(outfile, " ");
1068}
1069
311c8ff1 1070#define USAGE_OPTS_WIDTH 26
d7a38c54 1071
652a6b15
RS
1072static void usage_padding(FILE *outfile, size_t pos)
1073{
311c8ff1
RS
1074 if (pos < USAGE_OPTS_WIDTH)
1075 fprintf(outfile, "%*s", USAGE_OPTS_WIDTH - (int)pos, "");
1076 else
1077 fprintf(outfile, "\n%*s", USAGE_OPTS_WIDTH, "");
652a6b15
RS
1078}
1079
2a409a1d
RS
1080static const struct option *find_option_by_long_name(const struct option *opts,
1081 const char *long_name)
1082{
1083 for (; opts->type != OPTION_END; opts++) {
1084 if (opts->long_name && !strcmp(opts->long_name, long_name))
1085 return opts;
1086 }
1087 return NULL;
1088}
d7a38c54 1089
352e7613
ÆAB
1090static enum parse_opt_result usage_with_options_internal(struct parse_opt_ctx_t *ctx,
1091 const char * const *usagestr,
1092 const struct option *opts,
1093 int full, int err)
d7a38c54 1094{
2a409a1d 1095 const struct option *all_opts = opts;
9c7304e3 1096 FILE *outfile = err ? stderr : stdout;
a6304fa4 1097 int need_newline;
9c7304e3 1098
4631cfc2
ÆAB
1099 const char *usage_prefix = _("usage: %s");
1100 /*
1101 * The translation could be anything, but we can count on
1102 * msgfmt(1)'s --check option to have asserted that "%s" is in
1103 * the translation. So compute the length of the "usage: "
1104 * part. We are assuming that the translator wasn't overly
1105 * clever and used e.g. "%1$s" instead of "%s", there's only
1106 * one "%s" in "usage_prefix" above, so there's no reason to
1107 * do so even with a RTL language.
1108 */
1109 size_t usage_len = strlen(usage_prefix) - strlen("%s");
1110 /*
1111 * TRANSLATORS: the colon here should align with the
1112 * one in "usage: %s" translation.
1113 */
1114 const char *or_prefix = _(" or: %s");
1115 /*
1116 * TRANSLATORS: You should only need to translate this format
1117 * string if your language is a RTL language (e.g. Arabic,
1118 * Hebrew etc.), not if it's a LTR language (e.g. German,
1119 * Russian, Chinese etc.).
1120 *
1121 * When a translated usage string has an embedded "\n" it's
1122 * because options have wrapped to the next line. The line
1123 * after the "\n" will then be padded to align with the
1124 * command name, such as N_("git cmd [opt]\n<8
1125 * spaces>[opt2]"), where the 8 spaces are the same length as
1126 * "git cmd ".
1127 *
1128 * This format string prints out that already-translated
1129 * line. The "%*s" is whitespace padding to account for the
1130 * padding at the start of the line that we add in this
1131 * function. The "%s" is a line in the (hopefully already
1132 * translated) N_() usage string, which contained embedded
1133 * newlines before we split it up.
1134 */
1135 const char *usage_continued = _("%*s%s");
1136 const char *prefix = usage_prefix;
1137 int saw_empty_line = 0;
1138
49b61802
RS
1139 if (!usagestr)
1140 return PARSE_OPT_HELP;
1141
47e9cd28
TR
1142 if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL)
1143 fprintf(outfile, "cat <<\\EOF\n");
1144
44d86e91 1145 while (*usagestr) {
4631cfc2
ÆAB
1146 const char *str = _(*usagestr++);
1147 struct string_list list = STRING_LIST_INIT_DUP;
1148 unsigned int j;
1149
1150 if (!saw_empty_line && !*str)
1151 saw_empty_line = 1;
1152
1153 string_list_split(&list, str, '\n', -1);
1154 for (j = 0; j < list.nr; j++) {
1155 const char *line = list.items[j].string;
1156
1157 if (saw_empty_line && *line)
1158 fprintf_ln(outfile, _(" %s"), line);
1159 else if (saw_empty_line)
1160 fputc('\n', outfile);
1161 else if (!j)
1162 fprintf_ln(outfile, prefix, line);
1163 else
1164 fprintf_ln(outfile, usage_continued,
1165 (int)usage_len, "", line);
1166 }
1167 string_list_clear(&list, 0);
1168
1169 prefix = or_prefix;
44d86e91 1170 }
d7a38c54 1171
a6304fa4 1172 need_newline = 1;
d7a38c54
PH
1173
1174 for (; opts->type != OPTION_END; opts++) {
1175 size_t pos;
448abbba 1176 const char *cp, *np;
2a409a1d 1177 const char *positive_name = NULL;
d7a38c54 1178
fa83cc83
SG
1179 if (opts->type == OPTION_SUBCOMMAND)
1180 continue;
d7a38c54 1181 if (opts->type == OPTION_GROUP) {
9c7304e3 1182 fputc('\n', outfile);
a6304fa4 1183 need_newline = 0;
d7a38c54 1184 if (*opts->help)
54e6dc7d 1185 fprintf(outfile, "%s\n", _(opts->help));
d7a38c54
PH
1186 continue;
1187 }
dd3bf0f4
PH
1188 if (!full && (opts->flags & PARSE_OPT_HIDDEN))
1189 continue;
d7a38c54 1190
a6304fa4
BC
1191 if (need_newline) {
1192 fputc('\n', outfile);
1193 need_newline = 0;
1194 }
1195
652a6b15 1196 pos = usage_indent(outfile);
cbb08c2e 1197 if (opts->short_name) {
51a9949e 1198 if (opts->flags & PARSE_OPT_NODASH)
9c7304e3 1199 pos += fprintf(outfile, "%c", opts->short_name);
51a9949e 1200 else
9c7304e3 1201 pos += fprintf(outfile, "-%c", opts->short_name);
51a9949e 1202 }
d7a38c54 1203 if (opts->long_name && opts->short_name)
9c7304e3 1204 pos += fprintf(outfile, ", ");
e8e5d294
RS
1205 if (opts->long_name) {
1206 const char *long_name = opts->long_name;
2a409a1d
RS
1207 if ((opts->flags & PARSE_OPT_NONEG) ||
1208 skip_prefix(long_name, "no-", &positive_name))
e8e5d294
RS
1209 pos += fprintf(outfile, "--%s", long_name);
1210 else
1211 pos += fprintf(outfile, "--[no-]%s", long_name);
1212 }
1213
e0319ff5 1214 if (opts->type == OPTION_NUMBER)
c0821965 1215 pos += utf8_fprintf(outfile, _("-NUM"));
d7a38c54 1216
b57c68a6
JN
1217 if ((opts->flags & PARSE_OPT_LITERAL_ARGHELP) ||
1218 !(opts->flags & PARSE_OPT_NOARG))
9c7304e3 1219 pos += usage_argh(opts, outfile);
d7a38c54 1220
5c387428 1221 if (opts->type == OPTION_ALIAS) {
652a6b15 1222 usage_padding(outfile, pos);
5c387428
NTND
1223 fprintf_ln(outfile, _("alias of --%s"),
1224 (const char *)opts->value);
1225 continue;
1226 }
448abbba 1227
cd52d9e9 1228 for (cp = opts->help ? _(opts->help) : ""; *cp; cp = np) {
448abbba 1229 np = strchrnul(cp, '\n');
448abbba
JH
1230 if (*np)
1231 np++;
cd52d9e9
RS
1232 usage_padding(outfile, pos);
1233 fwrite(cp, 1, np - cp, outfile);
652a6b15 1234 pos = 0;
448abbba 1235 }
cd52d9e9 1236 fputc('\n', outfile);
2a409a1d
RS
1237
1238 if (positive_name) {
1239 if (find_option_by_long_name(all_opts, positive_name))
1240 continue;
1241 pos = usage_indent(outfile);
1242 pos += fprintf(outfile, "--%s", positive_name);
1243 usage_padding(outfile, pos);
1244 fprintf_ln(outfile, _("opposite of --no-%s"),
1245 positive_name);
448abbba 1246 }
d7a38c54 1247 }
9c7304e3 1248 fputc('\n', outfile);
f389c808 1249
47e9cd28
TR
1250 if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL)
1251 fputs("EOF\n", outfile);
1252
ee68b87a 1253 return PARSE_OPT_HELP;
d7a38c54 1254}
0ce865b1 1255
c2e86add 1256void NORETURN usage_with_options(const char * const *usagestr,
ff43ec3e 1257 const struct option *opts)
dd3bf0f4 1258{
47e9cd28 1259 usage_with_options_internal(NULL, usagestr, opts, 0, 1);
ff43ec3e 1260 exit(129);
dd3bf0f4
PH
1261}
1262
c2e86add 1263void NORETURN usage_msg_opt(const char *msg,
451bb210
CC
1264 const char * const *usagestr,
1265 const struct option *options)
1266{
e081a7c3 1267 die_message("%s\n", msg); /* The extra \n is intentional */
451bb210
CC
1268 usage_with_options(usagestr, options);
1269}
fa476be8
ÆAB
1270
1271void NORETURN usage_msg_optf(const char * const fmt,
1272 const char * const *usagestr,
1273 const struct option *options, ...)
1274{
1275 struct strbuf msg = STRBUF_INIT;
1276 va_list ap;
1277 va_start(ap, options);
1278 strbuf_vaddf(&msg, fmt, ap);
1279 va_end(ap);
1280
1281 usage_msg_opt(msg.buf, usagestr, options);
1282}
d21d5ddf 1283
a699367b
JNA
1284void die_for_incompatible_opt4(int opt1, const char *opt1_name,
1285 int opt2, const char *opt2_name,
1286 int opt3, const char *opt3_name,
1287 int opt4, const char *opt4_name)
1288{
1289 int count = 0;
1290 const char *options[4];
1291
1292 if (opt1)
1293 options[count++] = opt1_name;
1294 if (opt2)
1295 options[count++] = opt2_name;
1296 if (opt3)
1297 options[count++] = opt3_name;
1298 if (opt4)
1299 options[count++] = opt4_name;
1300 switch (count) {
1301 case 4:
1302 die(_("options '%s', '%s', '%s', and '%s' cannot be used together"),
1303 opt1_name, opt2_name, opt3_name, opt4_name);
1304 break;
1305 case 3:
1306 die(_("options '%s', '%s', and '%s' cannot be used together"),
1307 options[0], options[1], options[2]);
1308 break;
1309 case 2:
1310 die(_("options '%s' and '%s' cannot be used together"),
1311 options[0], options[1]);
1312 break;
1313 default:
1314 break;
1315 }
1316}