Junio C Hamano <gitster@xxxxxxxxx> writes: > For now, I will mix this in when queuing the whole thing in 'pu', as > I hate to push out something that does not even work for me to the > general public. > > -- >8 -- > Subject: [PATCH] diff- and log- family: handle "git cmd -h" early > ... And then the check_help_option() thing may look like this. I am not proud of the way it "unifies" the two styles of usage strings, obviously. One benefit this patch has is that it makes it easier to highlight what it does *not* touch. $ git grep -A2 -E -e 'a(rg)?c [!=]= 2 .*strcmp.*-h' shows there are somewhat curious construct if (argc != 2 || !strcmp(argv[1], "-h")) usage(...); left in the code. Upon closer inspection, they all happen to be doing the right thing for their current set of options and arguments, but they are somewhat ugly. builtin/am.c | 3 +-- builtin/branch.c | 3 +-- builtin/check-ref-format.c | 3 +-- builtin/checkout-index.c | 7 ++++--- builtin/commit.c | 6 ++---- builtin/diff-files.c | 3 +-- builtin/diff-index.c | 3 +-- builtin/diff-tree.c | 3 +-- builtin/gc.c | 3 +-- builtin/index-pack.c | 3 +-- builtin/ls-files.c | 3 +-- builtin/merge-ours.c | 3 +-- builtin/merge.c | 3 +-- builtin/pack-redundant.c | 3 +-- builtin/rev-list.c | 3 +-- builtin/update-index.c | 3 +-- builtin/upload-archive.c | 3 +-- fast-import.c | 3 +-- git-compat-util.h | 3 +++ usage.c | 11 +++++++++++ 20 files changed, 36 insertions(+), 39 deletions(-) diff --git a/builtin/am.c b/builtin/am.c index 8881d73615..12b7298907 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -2307,8 +2307,7 @@ int cmd_am(int argc, const char **argv, const char *prefix) OPT_END() }; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(usage, options); + check_help_option(argc, argv, usage, options); git_config(git_am_config, NULL); diff --git a/builtin/branch.c b/builtin/branch.c index 83fcda43dc..8c4465f0e4 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -599,8 +599,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) filter.kind = FILTER_REFS_BRANCHES; filter.abbrev = -1; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(builtin_branch_usage, options); + check_help_option(argc, argv, builtin_branch_usage, options); git_config(git_branch_config, NULL); diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c index eac499450f..aab5776dd5 100644 --- a/builtin/check-ref-format.c +++ b/builtin/check-ref-format.c @@ -55,8 +55,7 @@ int cmd_check_ref_format(int argc, const char **argv, const char *prefix) int flags = 0; const char *refname; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(builtin_check_ref_format_usage); + check_help_option(argc, argv, builtin_check_ref_format_usage, NULL); if (argc == 3 && !strcmp(argv[1], "--branch")) return check_ref_format_branch(argv[2]); diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index 07631d0c9c..8dd28ae8ba 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -179,9 +179,10 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) OPT_END() }; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(builtin_checkout_index_usage, - builtin_checkout_index_options); + check_help_option(argc, argv, + builtin_checkout_index_usage, + builtin_checkout_index_options); + git_config(git_default_config, NULL); prefix_length = prefix ? strlen(prefix) : 0; diff --git a/builtin/commit.c b/builtin/commit.c index 66c9ac587b..05c2f61e33 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1376,8 +1376,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) OPT_END(), }; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(builtin_status_usage, builtin_status_options); + check_help_option(argc, argv, builtin_status_usage, builtin_status_options); status_init_config(&s, git_status_config); argc = parse_options(argc, argv, prefix, @@ -1661,8 +1660,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) struct ref_transaction *transaction; struct strbuf err = STRBUF_INIT; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(builtin_commit_usage, builtin_commit_options); + check_help_option(argc, argv, builtin_commit_usage, builtin_commit_options); status_init_config(&s, git_commit_config); status_format = STATUS_FORMAT_NONE; /* Ignore status.short */ diff --git a/builtin/diff-files.c b/builtin/diff-files.c index c97069a714..ff52edb46c 100644 --- a/builtin/diff-files.c +++ b/builtin/diff-files.c @@ -20,8 +20,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix) int result; unsigned options = 0; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(diff_files_usage); + check_help_option(argc, argv, diff_files_usage, NULL); git_config(git_diff_basic_config, NULL); /* no "diff" UI options */ init_revisions(&rev, prefix); diff --git a/builtin/diff-index.c b/builtin/diff-index.c index d59bf6cf5f..518482850e 100644 --- a/builtin/diff-index.c +++ b/builtin/diff-index.c @@ -17,8 +17,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix) int i; int result; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(diff_cache_usage); + check_help_option(argc, argv, diff_cache_usage, NULL); git_config(git_diff_basic_config, NULL); /* no "diff" UI options */ init_revisions(&rev, prefix); diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c index a4e7398b4b..aa12c02203 100644 --- a/builtin/diff-tree.c +++ b/builtin/diff-tree.c @@ -105,8 +105,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix) struct setup_revision_opt s_r_opt; int read_stdin = 0; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(diff_tree_usage); + check_help_option(argc, argv, diff_tree_usage, NULL); git_config(git_diff_basic_config, NULL); /* no "diff" UI options */ init_revisions(opt, prefix); diff --git a/builtin/gc.c b/builtin/gc.c index f484eda43c..b1a6163347 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -363,8 +363,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix) OPT_END() }; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(builtin_gc_usage, builtin_gc_options); + check_help_option(argc, argv, builtin_gc_usage, builtin_gc_options); argv_array_pushl(&pack_refs_cmd, "pack-refs", "--all", "--prune", NULL); argv_array_pushl(&reflog, "reflog", "expire", "--all", NULL); diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 04b9dcaf0f..2be24276d6 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1640,8 +1640,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) unsigned foreign_nr = 1; /* zero is a "good" value, assume bad */ int report_end_of_input = 0; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(index_pack_usage); + check_help_option(argc, argv, index_pack_usage, NULL); check_replace_refs = 0; fsck_options.walk = mark_link; diff --git a/builtin/ls-files.c b/builtin/ls-files.c index b376afc312..6d5334aae5 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -587,8 +587,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) OPT_END() }; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(ls_files_usage, builtin_ls_files_options); + check_help_option(argc, argv, ls_files_usage, builtin_ls_files_options); memset(&dir, 0, sizeof(dir)); prefix = cmd_prefix; diff --git a/builtin/merge-ours.c b/builtin/merge-ours.c index 684411694f..52be2fa2f4 100644 --- a/builtin/merge-ours.c +++ b/builtin/merge-ours.c @@ -20,8 +20,7 @@ static const char *diff_index_args[] = { int cmd_merge_ours(int argc, const char **argv, const char *prefix) { - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(builtin_merge_ours_usage); + check_help_option(argc, argv, builtin_merge_ours_usage, NULL); /* * We need to exit with 2 if the index does not match our HEAD tree, diff --git a/builtin/merge.c b/builtin/merge.c index eab03a026d..446eb0f3fb 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1108,8 +1108,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) void *branch_to_free; int orig_argc = argc; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(builtin_merge_usage, builtin_merge_options); + check_help_option(argc, argv, builtin_merge_usage, builtin_merge_options); /* * Check if we are _not_ on a detached HEAD, i.e. if there is a diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c index cb1df1c761..80603b9b47 100644 --- a/builtin/pack-redundant.c +++ b/builtin/pack-redundant.c @@ -601,8 +601,7 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix) unsigned char *sha1; char buf[42]; /* 40 byte sha1 + \n + \0 */ - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(pack_redundant_usage); + check_help_option(argc, argv, pack_redundant_usage, NULL); for (i = 1; i < argc; i++) { const char *arg = argv[i]; diff --git a/builtin/rev-list.c b/builtin/rev-list.c index b250c515b1..ce6acf18c7 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -277,8 +277,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) int use_bitmap_index = 0; const char *show_progress = NULL; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(rev_list_usage); + check_help_option(argc, argv, rev_list_usage, NULL); git_config(git_default_config, NULL); init_revisions(&revs, prefix); diff --git a/builtin/update-index.c b/builtin/update-index.c index 32fd977b43..e6df968056 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -1009,8 +1009,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) OPT_END() }; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(update_index_usage, options); + check_help_option(argc, argv, update_index_usage, options); git_config(git_default_config, NULL); diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c index 84532ae9a9..0e097969db 100644 --- a/builtin/upload-archive.c +++ b/builtin/upload-archive.c @@ -76,8 +76,7 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix) { struct child_process writer = { argv }; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(upload_archive_usage); + check_help_option(argc, argv, upload_archive_usage, NULL); /* * Set up sideband subprocess. diff --git a/fast-import.c b/fast-import.c index 9a22fc92c0..fd7a4fb472 100644 --- a/fast-import.c +++ b/fast-import.c @@ -3447,8 +3447,7 @@ int cmd_main(int argc, const char **argv) { unsigned int i; - if (argc == 2 && !strcmp(argv[1], "-h")) - usage(fast_import_usage); + check_help_option(argc, argv, fast_import_usage, NULL); setup_git_directory(); reset_pack_idx_option(&pack_idx_opts); diff --git a/git-compat-util.h b/git-compat-util.h index 22b756ed51..c30b6b9a72 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -418,6 +418,9 @@ extern int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2))); extern void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2))); +struct option; +extern void check_help_option(int, const char **, const void *, struct option *); + #ifndef NO_OPENSSL #ifdef APPLE_COMMON_CRYPTO #include "compat/apple-common-crypto.h" diff --git a/usage.c b/usage.c index 2f87ca69a8..007d732094 100644 --- a/usage.c +++ b/usage.c @@ -5,6 +5,7 @@ */ #include "git-compat-util.h" #include "cache.h" +#include "parse-options.h" void vreportf(const char *prefix, const char *err, va_list params) { @@ -225,3 +226,13 @@ NORETURN void BUG(const char *fmt, ...) va_end(ap); } #endif + +void check_help_option(int argc, const char **argv, const void *help, struct option *opt) +{ + if (argc == 2 && !strcmp(argv[1], "-h")) { + if (opt) + usage_with_options((const char * const *)help, opt); + else + usage((const char *)help); + } +} -- 2.13.0-513-g1c0955652f