Raw
1 #ifndef PARSE_OPTIONS_H
2 #define PARSE_OPTIONS_H
3
4 #include "gettext.h"
5
6 struct repository;
7
8 /**
9 * Refer to Documentation/technical/api-parse-options.adoc for the API doc.
10 */
11
12 enum parse_opt_type {
13 /* special types */
14 OPTION_END,
15 OPTION_GROUP,
16 OPTION_NUMBER,
17 OPTION_ALIAS,
18 OPTION_SUBCOMMAND,
19 /* options with no arguments */
20 OPTION_BIT,
21 OPTION_NEGBIT,
22 OPTION_BITOP,
23 OPTION_COUNTUP,
24 OPTION_SET_INT,
25 /* options with arguments (usually) */
26 OPTION_STRING,
27 OPTION_INTEGER,
28 OPTION_UNSIGNED,
29 OPTION_CALLBACK,
30 OPTION_LOWLEVEL_CALLBACK,
31 OPTION_FILENAME
32 };
33
34 enum parse_opt_flags {
35 PARSE_OPT_KEEP_DASHDASH = 1 << 0,
36 PARSE_OPT_STOP_AT_NON_OPTION = 1 << 1,
37 PARSE_OPT_KEEP_ARGV0 = 1 << 2,
38 PARSE_OPT_KEEP_UNKNOWN_OPT = 1 << 3,
39 PARSE_OPT_NO_INTERNAL_HELP = 1 << 4,
40 PARSE_OPT_ONE_SHOT = 1 << 5,
41 PARSE_OPT_SHELL_EVAL = 1 << 6,
42 PARSE_OPT_SUBCOMMAND_OPTIONAL = 1 << 7,
43 };
44
45 enum parse_opt_option_flags {
46 PARSE_OPT_OPTARG = 1 << 0,
47 PARSE_OPT_NOARG = 1 << 1,
48 PARSE_OPT_NONEG = 1 << 2,
49 PARSE_OPT_HIDDEN = 1 << 3,
50 PARSE_OPT_LASTARG_DEFAULT = 1 << 4,
51 PARSE_OPT_NODASH = 1 << 5,
52 PARSE_OPT_LITERAL_ARGHELP = 1 << 6,
53 PARSE_OPT_FROM_ALIAS = 1 << 7,
54 PARSE_OPT_NOCOMPLETE = 1 << 9,
55 PARSE_OPT_COMP_ARG = 1 << 10,
56 PARSE_OPT_CMDMODE = 1 << 11,
57 };
58
59 enum parse_opt_result {
60 PARSE_OPT_COMPLETE = -3,
61 PARSE_OPT_HELP = -2,
62 PARSE_OPT_ERROR = -1, /* must be the same as error() */
63 PARSE_OPT_DONE = 0, /* fixed so that "return 0" works */
64 PARSE_OPT_NON_OPTION,
65 PARSE_OPT_SUBCOMMAND,
66 PARSE_OPT_UNKNOWN
67 };
68
69 struct option;
70 typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
71
72 struct parse_opt_ctx_t;
73 typedef enum parse_opt_result parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
74 const struct option *opt,
75 const char *arg, int unset);
76
77 typedef int parse_opt_subcommand_fn(int argc, const char **argv,
78 const char *prefix, struct repository *repo);
79
80 /*
81 * `type`::
82 * holds the type of the option, you must have an OPTION_END last in your
83 * array.
84 *
85 * `short_name`::
86 * the character to use as a short option name, '\0' if none.
87 *
88 * `long_name`::
89 * the long option (without the leading dashes) or subcommand name,
90 * NULL if none.
91 *
92 * `value`::
93 * stores pointers to the values to be filled.
94 *
95 * `precision`::
96 * precision of the integer pointed to by `value` in number of bytes. Should
97 * typically be its `sizeof()`.
98 *
99 * `argh`::
100 * token to explain the kind of argument this option wants. Does not
101 * begin in capital letter, and does not end with a full stop.
102 * Should be wrapped by N_() for translation.
103 * Is automatically enclosed in brackets when printed, unless it
104 * contains any of the following characters: ()<>[]|
105 * E.g. "name" is shown as "<name>" to indicate that a name value
106 * needs to be supplied, not the literal string "name", but
107 * "<start>,<end>" and "(this|that)" are printed verbatim.
108 *
109 * `help`::
110 * the short help associated to what the option does.
111 * Must never be NULL (except for OPTION_END and OPTION_SUBCOMMAND).
112 * OPTION_GROUP uses this pointer to store the group header.
113 * Should be wrapped by N_() for translation.
114 *
115 * `flags`::
116 * mask of parse_opt_option_flags.
117 * PARSE_OPT_OPTARG: says that the argument is optional (not for BOOLEANs)
118 * PARSE_OPT_NOARG: says that this option does not take an argument
119 * PARSE_OPT_NONEG: says that this option cannot be negated
120 * (i.e. rejects "--no-<option>")
121 * PARSE_OPT_HIDDEN: this option is skipped in the default usage, and
122 * shown only in the full usage.
123 * PARSE_OPT_LASTARG_DEFAULT: says that this option will take the default
124 * value if no argument is given when the option
125 * is last on the command line. If the option is
126 * not last it will require an argument.
127 * Should not be used with PARSE_OPT_OPTARG.
128 * PARSE_OPT_NODASH: this option doesn't start with a dash; can only be a
129 * short option and can't accept arguments.
130 * PARSE_OPT_LITERAL_ARGHELP: says that argh shouldn't be enclosed in brackets
131 * (i.e. '<argh>') in the help message.
132 * Useful for options with multiple parameters.
133 * PARSE_OPT_NOCOMPLETE: by default all visible options are completable
134 * by git-completion.bash. This option suppresses that.
135 * PARSE_OPT_COMP_ARG: this option forces to git-completion.bash to
136 * complete an option as --name= not --name even if
137 * the option takes optional argument.
138 *
139 * `callback`::
140 * pointer to the callback to use for OPTION_CALLBACK
141 *
142 * `defval`::
143 * default value to fill (*->value) with for PARSE_OPT_OPTARG.
144 * OPTION_{BIT,SET_INT} store the {mask,integer} to put in the value when met.
145 * CALLBACKS can use it like they want.
146 *
147 * `ll_callback`::
148 * pointer to the callback to use for OPTION_LOWLEVEL_CALLBACK
149 *
150 * `subcommand_fn`::
151 * pointer to a function to use for OPTION_SUBCOMMAND.
152 * It will be put in value when the subcommand is given on the command line.
153 */
154 struct option {
155 enum parse_opt_type type;
156 int short_name;
157 const char *long_name;
158 void *value;
159 size_t precision;
160 const char *argh;
161 const char *help;
162
163 enum parse_opt_option_flags flags;
164 parse_opt_cb *callback;
165 intptr_t defval;
166 parse_opt_ll_cb *ll_callback;
167 intptr_t extra;
168 parse_opt_subcommand_fn *subcommand_fn;
169 };
170
171 #define OPT_BIT_F(s, l, v, h, b, f) { \
172 .type = OPTION_BIT, \
173 .short_name = (s), \
174 .long_name = (l), \
175 .value = (v), \
176 .precision = sizeof(*v), \
177 .help = (h), \
178 .flags = PARSE_OPT_NOARG|(f), \
179 .callback = NULL, \
180 .defval = (b), \
181 }
182 #define OPT_COUNTUP_F(s, l, v, h, f) { \
183 .type = OPTION_COUNTUP, \
184 .short_name = (s), \
185 .long_name = (l), \
186 .value = (v), \
187 .precision = sizeof(*v), \
188 .help = (h), \
189 .flags = PARSE_OPT_NOARG|(f), \
190 }
191 #define OPT_SET_INT_F(s, l, v, h, i, f) { \
192 .type = OPTION_SET_INT, \
193 .short_name = (s), \
194 .long_name = (l), \
195 .value = (v), \
196 .precision = sizeof(*v), \
197 .help = (h), \
198 .flags = PARSE_OPT_NOARG | (f), \
199 .defval = (i), \
200 }
201 #define OPT_BOOL_F(s, l, v, h, f) OPT_SET_INT_F(s, l, v, h, 1, f)
202 #define OPT_CALLBACK_F(s, l, v, a, h, f, cb) { \
203 .type = OPTION_CALLBACK, \
204 .short_name = (s), \
205 .long_name = (l), \
206 .value = (v), \
207 .argh = (a), \
208 .help = (h), \
209 .flags = (f), \
210 .callback = (cb), \
211 }
212 #define OPT_STRING_F(s, l, v, a, h, f) { \
213 .type = OPTION_STRING, \
214 .short_name = (s), \
215 .long_name = (l), \
216 .value = (v), \
217 .argh = (a), \
218 .help = (h), \
219 .flags = (f), \
220 }
221 #define OPT_INTEGER_F(s, l, v, h, f) { \
222 .type = OPTION_INTEGER, \
223 .short_name = (s), \
224 .long_name = (l), \
225 .value = (v) + BARF_UNLESS_SIGNED(*(v)), \
226 .precision = sizeof(*v), \
227 .argh = N_("n"), \
228 .help = (h), \
229 .flags = (f), \
230 }
231
232 #define OPT_END() { \
233 .type = OPTION_END, \
234 }
235 #define OPT_GROUP(h) { \
236 .type = OPTION_GROUP, \
237 .help = (h), \
238 }
239 #define OPT_BIT(s, l, v, h, b) OPT_BIT_F(s, l, v, h, b, 0)
240 #define OPT_BITOP(s, l, v, h, set, clear) { \
241 .type = OPTION_BITOP, \
242 .short_name = (s), \
243 .long_name = (l), \
244 .value = (v), \
245 .precision = sizeof(*v), \
246 .help = (h), \
247 .flags = PARSE_OPT_NOARG|PARSE_OPT_NONEG, \
248 .defval = (set), \
249 .extra = (clear), \
250 }
251 #define OPT_NEGBIT(s, l, v, h, b) { \
252 .type = OPTION_NEGBIT, \
253 .short_name = (s), \
254 .long_name = (l), \
255 .value = (v), \
256 .precision = sizeof(*v), \
257 .help = (h), \
258 .flags = PARSE_OPT_NOARG, \
259 .defval = (b), \
260 }
261 #define OPT_COUNTUP(s, l, v, h) OPT_COUNTUP_F(s, l, v, h, 0)
262 #define OPT_SET_INT(s, l, v, h, i) OPT_SET_INT_F(s, l, v, h, i, 0)
263 #define OPT_BOOL(s, l, v, h) OPT_BOOL_F(s, l, v, h, 0)
264 #define OPT_HIDDEN_BOOL(s, l, v, h) { \
265 .type = OPTION_SET_INT, \
266 .short_name = (s), \
267 .long_name = (l), \
268 .value = (v), \
269 .precision = sizeof(*v), \
270 .help = (h), \
271 .flags = PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, \
272 .defval = 1, \
273 }
274 #define OPT_CMDMODE_F(s, l, v, h, i, f) { \
275 .type = OPTION_SET_INT, \
276 .short_name = (s), \
277 .long_name = (l), \
278 .value = (v), \
279 .precision = sizeof(*v), \
280 .help = (h), \
281 .flags = PARSE_OPT_CMDMODE|PARSE_OPT_NOARG|PARSE_OPT_NONEG | (f), \
282 .defval = (i), \
283 }
284 #define OPT_CMDMODE(s, l, v, h, i) OPT_CMDMODE_F(s, l, v, h, i, 0)
285
286 #define OPT_INTEGER(s, l, v, h) OPT_INTEGER_F(s, l, v, h, 0)
287 #define OPT_UNSIGNED(s, l, v, h) { \
288 .type = OPTION_UNSIGNED, \
289 .short_name = (s), \
290 .long_name = (l), \
291 .value = (v) + BARF_UNLESS_UNSIGNED(*(v)), \
292 .precision = sizeof(*v), \
293 .argh = N_("n"), \
294 .help = (h), \
295 .flags = PARSE_OPT_NONEG, \
296 }
297 #define OPT_STRING(s, l, v, a, h) OPT_STRING_F(s, l, v, a, h, 0)
298 #define OPT_STRING_LIST(s, l, v, a, h) { \
299 .type = OPTION_CALLBACK, \
300 .short_name = (s), \
301 .long_name = (l), \
302 .value = (v), \
303 .argh = (a), \
304 .help = (h), \
305 .callback = &parse_opt_string_list, \
306 }
307 #define OPT_STRVEC(s, l, v, a, h) { \
308 .type = OPTION_CALLBACK, \
309 .short_name = (s), \
310 .long_name = (l), \
311 .value = (v), \
312 .argh = (a), \
313 .help = (h), \
314 .callback = &parse_opt_strvec, \
315 }
316 #define OPT_UYN(s, l, v, h) { \
317 .type = OPTION_CALLBACK, \
318 .short_name = (s), \
319 .long_name = (l), \
320 .value = (v), \
321 .help = (h), \
322 .flags = PARSE_OPT_NOARG, \
323 .callback = &parse_opt_tertiary, \
324 }
325 #define OPT_EXPIRY_DATE(s, l, v, h) { \
326 .type = OPTION_CALLBACK, \
327 .short_name = (s), \
328 .long_name = (l), \
329 .value = (v), \
330 .argh = N_("expiry-date"), \
331 .help = (h), \
332 .callback = parse_opt_expiry_date_cb, \
333 }
334 #define OPT_CALLBACK(s, l, v, a, h, cb) OPT_CALLBACK_F(s, l, v, a, h, 0, cb)
335 #define OPT_NUMBER_CALLBACK(v, h, cb) { \
336 .type = OPTION_NUMBER, \
337 .value = (v), \
338 .help = (h), \
339 .flags = PARSE_OPT_NOARG | PARSE_OPT_NONEG, \
340 .callback = (cb), \
341 }
342 #define OPT_FILENAME(s, l, v, h) { \
343 .type = OPTION_FILENAME, \
344 .short_name = (s), \
345 .long_name = (l), \
346 .value = (v), \
347 .argh = N_("file"), \
348 .help = (h), \
349 }
350 #define OPT_COLOR_FLAG(s, l, v, h) { \
351 .type = OPTION_CALLBACK, \
352 .short_name = (s), \
353 .long_name = (l), \
354 .value = (v), \
355 .argh = N_("when"), \
356 .help = (h), \
357 .flags = PARSE_OPT_OPTARG, \
358 .callback = parse_opt_color_flag_cb, \
359 .defval = (intptr_t)"always", \
360 }
361
362 #define OPT_NOOP_NOARG(s, l) { \
363 .type = OPTION_CALLBACK, \
364 .short_name = (s), \
365 .long_name = (l), \
366 .help = N_("no-op (backward compatibility)"), \
367 .flags = PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, \
368 .callback = parse_opt_noop_cb, \
369 }
370
371 static char *parse_options_noop_ignored_value MAYBE_UNUSED;
372 #define OPT_NOOP_ARG(s, l) { \
373 .type = OPTION_CALLBACK, \
374 .short_name = (s), \
375 .long_name = (l), \
376 .value = &parse_options_noop_ignored_value, \
377 .argh = "ignored", \
378 .help = N_("no-op (backward compatibility)"), \
379 .flags = PARSE_OPT_HIDDEN, \
380 .callback = parse_opt_noop_cb, \
381 }
382
383 #define OPT_ALIAS(s, l, source_long_name) { \
384 .type = OPTION_ALIAS, \
385 .short_name = (s), \
386 .long_name = (l), \
387 .value = (char *)(source_long_name), \
388 }
389
390 #define OPT_SUBCOMMAND_F(l, v, fn, f) { \
391 .type = OPTION_SUBCOMMAND, \
392 .long_name = (l), \
393 .value = (v), \
394 .flags = (f), \
395 .subcommand_fn = (fn), \
396 }
397 #define OPT_SUBCOMMAND(l, v, fn) OPT_SUBCOMMAND_F((l), (v), (fn), 0)
398
399 /*
400 * parse_options() will filter out the processed options and leave the
401 * non-option arguments in argv[]. argv0 is assumed program name and
402 * skipped.
403 *
404 * usagestr strings should be marked for translation with N_().
405 *
406 * Returns the number of arguments left in argv[].
407 *
408 * In one-shot mode, argv0 is not a program name, argv[] is left
409 * untouched and parse_options() returns the number of options
410 * processed.
411 */
412 int parse_options(int argc, const char **argv, const char *prefix,
413 const struct option *options,
414 const char * const usagestr[],
415 enum parse_opt_flags flags);
416
417 NORETURN void usage_with_options(const char * const *usagestr,
418 const struct option *options);
419
420 void show_usage_with_options_if_asked(int ac, const char **av,
421 const char * const *usage,
422 const struct option *options);
423
424 NORETURN void usage_msg_opt(const char *msg,
425 const char * const *usagestr,
426 const struct option *options);
427
428 /**
429 * usage_msg_optf() is like usage_msg_opt() except that the first
430 * argument is a format string, and optional format arguments follow
431 * after the 3rd option.
432 */
433 __attribute__((format (printf,1,4)))
434 void NORETURN usage_msg_optf(const char *fmt,
435 const char * const *usagestr,
436 const struct option *options, ...);
437
438 void die_for_incompatible_opt4(int opt1, const char *opt1_name,
439 int opt2, const char *opt2_name,
440 int opt3, const char *opt3_name,
441 int opt4, const char *opt4_name);
442
443
444 static inline void die_for_incompatible_opt3(int opt1, const char *opt1_name,
445 int opt2, const char *opt2_name,
446 int opt3, const char *opt3_name)
447 {
448 die_for_incompatible_opt4(opt1, opt1_name,
449 opt2, opt2_name,
450 opt3, opt3_name,
451 0, "");
452 }
453
454 static inline void die_for_incompatible_opt2(int opt1, const char *opt1_name,
455 int opt2, const char *opt2_name)
456 {
457 die_for_incompatible_opt4(opt1, opt1_name,
458 opt2, opt2_name,
459 0, "",
460 0, "");
461 }
462
463 /*
464 * Use these assertions for callbacks that expect to be called with NONEG and
465 * NOARG respectively, and do not otherwise handle the "unset" and "arg"
466 * parameters.
467 */
468 #define BUG_ON_OPT_NEG(unset) do { \
469 if ((unset)) \
470 BUG("option callback does not expect negation"); \
471 } while (0)
472 #define BUG_ON_OPT_ARG(arg) do { \
473 if ((arg)) \
474 BUG("option callback does not expect an argument"); \
475 } while (0)
476
477 /*
478 * Similar to the assertions above, but checks that "arg" is always non-NULL.
479 * This assertion also implies BUG_ON_OPT_NEG(), letting you declare both
480 * assertions in a single line.
481 */
482 #define BUG_ON_OPT_NEG_NOARG(unset, arg) do { \
483 BUG_ON_OPT_NEG(unset); \
484 if(!(arg)) \
485 BUG("option callback expects an argument"); \
486 } while(0)
487
488 /*----- incremental advanced APIs -----*/
489
490 struct parse_opt_cmdmode_list;
491
492 /*
493 * It's okay for the caller to consume argv/argc in the usual way.
494 * Other fields of that structure are private to parse-options and should not
495 * be modified in any way.
496 */
497 struct parse_opt_ctx_t {
498 const char **argv;
499 const char **out;
500 int argc, cpidx, total;
501 const char *opt;
502 enum parse_opt_flags flags;
503 unsigned has_subcommands;
504 const char *prefix;
505 const char **alias_groups; /* must be in groups of 3 elements! */
506 struct parse_opt_cmdmode_list *cmdmode_list;
507 };
508
509 void parse_options_start(struct parse_opt_ctx_t *ctx,
510 int argc, const char **argv, const char *prefix,
511 const struct option *options,
512 enum parse_opt_flags flags);
513
514 enum parse_opt_result parse_options_step(struct parse_opt_ctx_t *ctx,
515 const struct option *options,
516 const char * const usagestr[]);
517
518 int parse_options_end(struct parse_opt_ctx_t *ctx);
519
520 struct option *parse_options_dup(const struct option *a);
521 struct option *parse_options_concat(const struct option *a, const struct option *b);
522
523 /*----- some often used options -----*/
524 int parse_opt_abbrev_cb(const struct option *, const char *, int);
525 int parse_opt_expiry_date_cb(const struct option *, const char *, int);
526 int parse_opt_color_flag_cb(const struct option *, const char *, int);
527 int parse_opt_verbosity_cb(const struct option *, const char *, int);
528 /* value is struct oid_array* */
529 int parse_opt_object_name(const struct option *, const char *, int);
530 /* value is struct object_id* */
531 int parse_opt_object_id(const struct option *, const char *, int);
532 int parse_opt_commits(const struct option *, const char *, int);
533 int parse_opt_commit(const struct option *, const char *, int);
534 int parse_opt_tertiary(const struct option *, const char *, int);
535 int parse_opt_string_list(const struct option *, const char *, int);
536 int parse_opt_strvec(const struct option *, const char *, int);
537 int parse_opt_noop_cb(const struct option *, const char *, int);
538 int parse_opt_passthru(const struct option *, const char *, int);
539 int parse_opt_passthru_argv(const struct option *, const char *, int);
540 /* value is enum branch_track* */
541 int parse_opt_tracking_mode(const struct option *, const char *, int);
542
543 #define OPT__VERBOSE(var, h) OPT_COUNTUP('v', "verbose", (var), (h))
544 #define OPT__QUIET(var, h) OPT_COUNTUP('q', "quiet", (var), (h))
545 #define OPT__VERBOSITY(var) { \
546 .type = OPTION_CALLBACK, \
547 .short_name = 'v', \
548 .long_name = "verbose", \
549 .value = (var), \
550 .help = N_("be more verbose"), \
551 .flags = PARSE_OPT_NOARG, \
552 .callback = &parse_opt_verbosity_cb, \
553 }, { \
554 .type = OPTION_CALLBACK, \
555 .short_name = 'q', \
556 .long_name = "quiet", \
557 .value = (var), \
558 .help = N_("be more quiet"), \
559 .flags = PARSE_OPT_NOARG, \
560 .callback = &parse_opt_verbosity_cb, \
561 }
562 #define OPT__DRY_RUN(var, h) OPT_BOOL('n', "dry-run", (var), (h))
563 #define OPT__FORCE(var, h, f) OPT_COUNTUP_F('f', "force", (var), (h), (f))
564 #define OPT__ABBREV(var) { \
565 .type = OPTION_CALLBACK, \
566 .long_name = "abbrev", \
567 .value = (var), \
568 .argh = N_("n"), \
569 .help = N_("use <n> digits to display object names"), \
570 .flags = PARSE_OPT_OPTARG, \
571 .callback = &parse_opt_abbrev_cb, \
572 }
573 #define OPT__SUPER_PREFIX(var) \
574 OPT_STRING_F(0, "super-prefix", (var), N_("prefix"), \
575 N_("prefixed path to initial superproject"), PARSE_OPT_HIDDEN)
576
577 #define OPT__COLOR(var, h) \
578 OPT_COLOR_FLAG(0, "color", (var), (h))
579 #define OPT_COLUMN(s, l, v, h) { \
580 .type = OPTION_CALLBACK, \
581 .short_name = (s), \
582 .long_name = (l), \
583 .value = (v), \
584 .argh = N_("style"), \
585 .help = (h), \
586 .flags = PARSE_OPT_OPTARG, \
587 .callback = parseopt_column_callback, \
588 }
589 #define OPT_PASSTHRU(s, l, v, a, h, f) { \
590 .type = OPTION_CALLBACK, \
591 .short_name = (s), \
592 .long_name = (l), \
593 .value = (v), \
594 .argh = (a), \
595 .help = (h), \
596 .flags = (f), \
597 .callback = parse_opt_passthru, \
598 }
599 #define OPT_PASSTHRU_ARGV(s, l, v, a, h, f) { \
600 .type = OPTION_CALLBACK, \
601 .short_name = (s), \
602 .long_name = (l), \
603 .value = (v), \
604 .argh = (a), \
605 .help = (h), \
606 .flags = (f), \
607 .callback = parse_opt_passthru_argv, \
608 }
609 #define _OPT_CONTAINS_OR_WITH(l, v, h, f) { \
610 .type = OPTION_CALLBACK, \
611 .long_name = (l), \
612 .value = (v), \
613 .argh = N_("commit"), \
614 .help = (h), \
615 .flags = PARSE_OPT_LASTARG_DEFAULT | (f), \
616 .callback = parse_opt_commits, \
617 .defval = (intptr_t) "HEAD", \
618 }
619 #define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, PARSE_OPT_NONEG)
620 #define OPT_NO_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("no-contains", v, h, PARSE_OPT_NONEG)
621 #define OPT_WITH(v, h) _OPT_CONTAINS_OR_WITH("with", v, h, PARSE_OPT_HIDDEN | PARSE_OPT_NONEG)
622 #define OPT_WITHOUT(v, h) _OPT_CONTAINS_OR_WITH("without", v, h, PARSE_OPT_HIDDEN | PARSE_OPT_NONEG)
623 #define OPT_CLEANUP(v) OPT_STRING(0, "cleanup", v, N_("mode"), N_("how to strip spaces and #comments from message"))
624 #define OPT_PATHSPEC_FROM_FILE(v) OPT_FILENAME(0, "pathspec-from-file", v, N_("read pathspec from file"))
625 #define OPT_PATHSPEC_FILE_NUL(v) OPT_BOOL(0, "pathspec-file-nul", v, N_("with --pathspec-from-file, pathspec elements are separated with NUL character"))
626 #define OPT_AUTOSTASH(v) OPT_BOOL(0, "autostash", v, N_("automatically stash/stash pop before and after"))
627 #define OPT_DIFF_UNIFIED(v) OPT_INTEGER_F('U', "unified", v, N_("generate diffs with <n> lines context"), PARSE_OPT_NONEG)
628 #define OPT_DIFF_INTERHUNK_CONTEXT(v) OPT_INTEGER_F(0, "inter-hunk-context", v, N_("show context between diff hunks up to the specified number of lines"), PARSE_OPT_NONEG)
629
630 #define OPT_IPVERSION(v) \
631 OPT_SET_INT_F('4', "ipv4", (v), N_("use IPv4 addresses only"), \
632 TRANSPORT_FAMILY_IPV4, PARSE_OPT_NONEG), \
633 OPT_SET_INT_F('6', "ipv6", (v), N_("use IPv6 addresses only"), \
634 TRANSPORT_FAMILY_IPV6, PARSE_OPT_NONEG)
635
636 #endif