git.c: add hidden option --list-parseopt-builtins

This is another step to help automate git-completion.bash. This option gives a list of all builtin commands that do use parse_options(), which supports another hidden option --git-completion-helper. The output is prepared for easy consumption by git-completion.bash and separates items by spaces instead of \n Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Mar 24, 2018 at 21:35 UTC e9547947795472c07453d0551b0cabb4ae378b5f
1 file changed +49 -41
git.c
+49 -41
@@ -14,11 +14,12 @@
14 #define NEED_WORK_TREE (1<<3)
15 #define SUPPORT_SUPER_PREFIX (1<<4)
16 #define DELAY_PAGER_CONFIG (1<<5)
17 +#define NO_PARSEOPT (1<<6) /* parse-options is not used */
18
19 struct cmd_struct {
20 const char *cmd;
21 int (*fn)(int, const char **, const char *);
21 - int option;
22 + unsigned int option;
23 };
24
25 const char git_usage_string[] =
@@ -35,7 +36,7 @@ const char git_more_info_string[] =
36
37 static int use_pager = -1;
38
38 -static void list_builtins(void);
39 +static void list_builtins(unsigned int exclude_option, char sep);
40
41 static void commit_pager_choice(void) {
42 switch (use_pager) {
@@ -223,7 +224,10 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
224 (*argv)++;
225 (*argc)--;
226 } else if (!strcmp(cmd, "--list-builtins")) {
226 - list_builtins();
227 + list_builtins(0, '\n');
228 + exit(0);
229 + } else if (!strcmp(cmd, "--list-parseopt-builtins")) {
230 + list_builtins(NO_PARSEOPT, ' ');
231 exit(0);
232 } else {
233 fprintf(stderr, "Unknown option: %s\n", cmd);
@@ -367,18 +371,18 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
371 static struct cmd_struct commands[] = {
372 { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },
373 { "am", cmd_am, RUN_SETUP | NEED_WORK_TREE },
370 - { "annotate", cmd_annotate, RUN_SETUP },
374 + { "annotate", cmd_annotate, RUN_SETUP | NO_PARSEOPT },
375 { "apply", cmd_apply, RUN_SETUP_GENTLY },
376 { "archive", cmd_archive, RUN_SETUP_GENTLY },
377 { "bisect--helper", cmd_bisect__helper, RUN_SETUP },
378 { "blame", cmd_blame, RUN_SETUP },
379 { "branch", cmd_branch, RUN_SETUP | DELAY_PAGER_CONFIG },
376 - { "bundle", cmd_bundle, RUN_SETUP_GENTLY },
380 + { "bundle", cmd_bundle, RUN_SETUP_GENTLY | NO_PARSEOPT },
381 { "cat-file", cmd_cat_file, RUN_SETUP },
382 { "check-attr", cmd_check_attr, RUN_SETUP },
383 { "check-ignore", cmd_check_ignore, RUN_SETUP | NEED_WORK_TREE },
384 { "check-mailmap", cmd_check_mailmap, RUN_SETUP },
381 - { "check-ref-format", cmd_check_ref_format },
385 + { "check-ref-format", cmd_check_ref_format, NO_PARSEOPT },
386 { "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
387 { "checkout-index", cmd_checkout_index,
388 RUN_SETUP | NEED_WORK_TREE},
@@ -388,30 +392,30 @@ static struct cmd_struct commands[] = {
392 { "clone", cmd_clone },
393 { "column", cmd_column, RUN_SETUP_GENTLY },
394 { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
391 - { "commit-tree", cmd_commit_tree, RUN_SETUP },
395 + { "commit-tree", cmd_commit_tree, RUN_SETUP | NO_PARSEOPT },
396 { "config", cmd_config, RUN_SETUP_GENTLY },
397 { "count-objects", cmd_count_objects, RUN_SETUP },
394 - { "credential", cmd_credential, RUN_SETUP_GENTLY },
398 + { "credential", cmd_credential, RUN_SETUP_GENTLY | NO_PARSEOPT },
399 { "describe", cmd_describe, RUN_SETUP },
396 - { "diff", cmd_diff },
397 - { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },
398 - { "diff-index", cmd_diff_index, RUN_SETUP },
399 - { "diff-tree", cmd_diff_tree, RUN_SETUP },
400 + { "diff", cmd_diff, NO_PARSEOPT },
401 + { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
402 + { "diff-index", cmd_diff_index, RUN_SETUP | NO_PARSEOPT },
403 + { "diff-tree", cmd_diff_tree, RUN_SETUP | NO_PARSEOPT },
404 { "difftool", cmd_difftool, RUN_SETUP | NEED_WORK_TREE },
405 { "fast-export", cmd_fast_export, RUN_SETUP },
406 { "fetch", cmd_fetch, RUN_SETUP },
403 - { "fetch-pack", cmd_fetch_pack, RUN_SETUP },
407 + { "fetch-pack", cmd_fetch_pack, RUN_SETUP | NO_PARSEOPT },
408 { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
409 { "for-each-ref", cmd_for_each_ref, RUN_SETUP },
410 { "format-patch", cmd_format_patch, RUN_SETUP },
411 { "fsck", cmd_fsck, RUN_SETUP },
412 { "fsck-objects", cmd_fsck, RUN_SETUP },
413 { "gc", cmd_gc, RUN_SETUP },
410 - { "get-tar-commit-id", cmd_get_tar_commit_id },
414 + { "get-tar-commit-id", cmd_get_tar_commit_id, NO_PARSEOPT },
415 { "grep", cmd_grep, RUN_SETUP_GENTLY },
416 { "hash-object", cmd_hash_object },
417 { "help", cmd_help },
414 - { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
418 + { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY | NO_PARSEOPT },
419 { "init", cmd_init_db },
420 { "init-db", cmd_init_db },
421 { "interpret-trailers", cmd_interpret_trailers, RUN_SETUP_GENTLY },
@@ -419,27 +423,27 @@ static struct cmd_struct commands[] = {
423 { "ls-files", cmd_ls_files, RUN_SETUP },
424 { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY },
425 { "ls-tree", cmd_ls_tree, RUN_SETUP },
422 - { "mailinfo", cmd_mailinfo, RUN_SETUP_GENTLY },
423 - { "mailsplit", cmd_mailsplit },
426 + { "mailinfo", cmd_mailinfo, RUN_SETUP_GENTLY | NO_PARSEOPT },
427 + { "mailsplit", cmd_mailsplit, NO_PARSEOPT },
428 { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
429 { "merge-base", cmd_merge_base, RUN_SETUP },
430 { "merge-file", cmd_merge_file, RUN_SETUP_GENTLY },
427 - { "merge-index", cmd_merge_index, RUN_SETUP },
428 - { "merge-ours", cmd_merge_ours, RUN_SETUP },
429 - { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
430 - { "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
431 - { "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
432 - { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
433 - { "merge-tree", cmd_merge_tree, RUN_SETUP },
434 - { "mktag", cmd_mktag, RUN_SETUP },
431 + { "merge-index", cmd_merge_index, RUN_SETUP | NO_PARSEOPT },
432 + { "merge-ours", cmd_merge_ours, RUN_SETUP | NO_PARSEOPT },
433 + { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
434 + { "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
435 + { "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
436 + { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
437 + { "merge-tree", cmd_merge_tree, RUN_SETUP | NO_PARSEOPT },
438 + { "mktag", cmd_mktag, RUN_SETUP | NO_PARSEOPT },
439 { "mktree", cmd_mktree, RUN_SETUP },
440 { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
441 { "name-rev", cmd_name_rev, RUN_SETUP },
442 { "notes", cmd_notes, RUN_SETUP },
443 { "pack-objects", cmd_pack_objects, RUN_SETUP },
440 - { "pack-redundant", cmd_pack_redundant, RUN_SETUP },
444 + { "pack-redundant", cmd_pack_redundant, RUN_SETUP | NO_PARSEOPT },
445 { "pack-refs", cmd_pack_refs, RUN_SETUP },
442 - { "patch-id", cmd_patch_id, RUN_SETUP_GENTLY },
446 + { "patch-id", cmd_patch_id, RUN_SETUP_GENTLY | NO_PARSEOPT },
447 { "pickaxe", cmd_blame, RUN_SETUP },
448 { "prune", cmd_prune, RUN_SETUP },
449 { "prune-packed", cmd_prune_packed, RUN_SETUP },
@@ -450,14 +454,14 @@ static struct cmd_struct commands[] = {
454 { "receive-pack", cmd_receive_pack },
455 { "reflog", cmd_reflog, RUN_SETUP },
456 { "remote", cmd_remote, RUN_SETUP },
453 - { "remote-ext", cmd_remote_ext },
454 - { "remote-fd", cmd_remote_fd },
457 + { "remote-ext", cmd_remote_ext, NO_PARSEOPT },
458 + { "remote-fd", cmd_remote_fd, NO_PARSEOPT },
459 { "repack", cmd_repack, RUN_SETUP },
460 { "replace", cmd_replace, RUN_SETUP },
461 { "rerere", cmd_rerere, RUN_SETUP },
462 { "reset", cmd_reset, RUN_SETUP },
459 - { "rev-list", cmd_rev_list, RUN_SETUP },
460 - { "rev-parse", cmd_rev_parse },
463 + { "rev-list", cmd_rev_list, RUN_SETUP | NO_PARSEOPT },
464 + { "rev-parse", cmd_rev_parse, NO_PARSEOPT },
465 { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
466 { "rm", cmd_rm, RUN_SETUP },
467 { "send-pack", cmd_send_pack, RUN_SETUP },
@@ -468,23 +472,23 @@ static struct cmd_struct commands[] = {
472 { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
473 { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
474 { "stripspace", cmd_stripspace },
471 - { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX},
475 + { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },
476 { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
477 { "tag", cmd_tag, RUN_SETUP | DELAY_PAGER_CONFIG },
474 - { "unpack-file", cmd_unpack_file, RUN_SETUP },
475 - { "unpack-objects", cmd_unpack_objects, RUN_SETUP },
478 + { "unpack-file", cmd_unpack_file, RUN_SETUP | NO_PARSEOPT },
479 + { "unpack-objects", cmd_unpack_objects, RUN_SETUP | NO_PARSEOPT },
480 { "update-index", cmd_update_index, RUN_SETUP },
481 { "update-ref", cmd_update_ref, RUN_SETUP },
482 { "update-server-info", cmd_update_server_info, RUN_SETUP },
479 - { "upload-archive", cmd_upload_archive },
480 - { "upload-archive--writer", cmd_upload_archive_writer },
481 - { "var", cmd_var, RUN_SETUP_GENTLY },
483 + { "upload-archive", cmd_upload_archive, NO_PARSEOPT },
484 + { "upload-archive--writer", cmd_upload_archive_writer, NO_PARSEOPT },
485 + { "var", cmd_var, RUN_SETUP_GENTLY | NO_PARSEOPT },
486 { "verify-commit", cmd_verify_commit, RUN_SETUP },
487 { "verify-pack", cmd_verify_pack },
488 { "verify-tag", cmd_verify_tag, RUN_SETUP },
489 { "version", cmd_version },
490 { "whatchanged", cmd_whatchanged, RUN_SETUP },
487 - { "worktree", cmd_worktree, RUN_SETUP },
491 + { "worktree", cmd_worktree, RUN_SETUP | NO_PARSEOPT },
492 { "write-tree", cmd_write_tree, RUN_SETUP },
493 };
494
@@ -504,11 +508,15 @@ int is_builtin(const char *s)
508 return !!get_builtin(s);
509 }
510
507 -static void list_builtins(void)
511 +static void list_builtins(unsigned int exclude_option, char sep)
512 {
513 int i;
510 - for (i = 0; i < ARRAY_SIZE(commands); i++)
511 - printf("%s\n", commands[i].cmd);
514 + for (i = 0; i < ARRAY_SIZE(commands); i++) {
515 + if (exclude_option &&
516 + (commands[i].option & exclude_option))
517 + continue;
518 + printf("%s%c", commands[i].cmd, sep);
519 + }
520 }
521
522 #ifdef STRIP_EXTENSION