These commands need more than just git_config() before parsing commmand line arguments. Some of these activities will unconditionally look into a repository. When startup_info->help is TRUE, no repository is set up and the caller expects callees to print help usage and exit, no more. Do as expected. --- builtin/branch.c | 3 +++ builtin/checkout-index.c | 3 +++ builtin/commit.c | 6 ++++++ builtin/gc.c | 3 +++ builtin/ls-files.c | 3 +++ builtin/merge.c | 3 +++ builtin/update-index.c | 3 +++ builtin/upload-archive.c | 7 ++++--- t/t3905-help.sh | 20 ++++++++++++++++++++ 9 files changed, 48 insertions(+), 3 deletions(-) create mode 100755 t/t3905-help.sh diff --git a/builtin/branch.c b/builtin/branch.c index 87976f0..9f152ed 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -667,6 +667,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix) OPT_END(), }; + if (startup_info->help) + usage_with_options(builtin_branch_usage, options); + git_config(git_branch_config, NULL); if (branch_use_color == -1) diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index a7a5ee1..7f25cd7 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -241,6 +241,9 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) OPT_END() }; + if (startup_info->help) + usage_with_options(builtin_checkout_index_usage, builtin_checkout_index_options); + git_config(git_default_config, NULL); state.base_dir = ""; prefix_length = prefix ? strlen(prefix) : 0; diff --git a/builtin/commit.c b/builtin/commit.c index 66fdd22..8b086f2 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1070,6 +1070,9 @@ int cmd_status(int argc, const char **argv, const char *prefix) OPT_END(), }; + if (startup_info->help) + usage_with_options(builtin_status_usage, builtin_status_options); + if (null_termination && status_format == STATUS_FORMAT_LONG) status_format = STATUS_FORMAT_PORCELAIN; @@ -1255,6 +1258,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix) int allow_fast_forward = 1; struct wt_status s; + if (startup_info->help) + usage_with_options(builtin_commit_usage, builtin_commit_options); + wt_status_prepare(&s); git_config(git_commit_config, &s); in_merge = file_exists(git_path("MERGE_HEAD")); diff --git a/builtin/gc.c b/builtin/gc.c index c304638..f040171 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -191,6 +191,9 @@ int cmd_gc(int argc, const char **argv, const char *prefix) git_config(gc_config, NULL); + if (startup_info->help) + usage_with_options(builtin_gc_usage, builtin_gc_options); + if (pack_refs < 0) pack_refs = !is_bare_repository(); diff --git a/builtin/ls-files.c b/builtin/ls-files.c index bb4f612..814da51 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -530,6 +530,9 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) OPT_END() }; + if (startup_info->help) + usage_with_options(ls_files_usage, builtin_ls_files_options); + memset(&dir, 0, sizeof(dir)); prefix = cmd_prefix; if (prefix) diff --git a/builtin/merge.c b/builtin/merge.c index 2dba3b9..0169694 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -917,6 +917,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix) const char *best_strategy = NULL, *wt_strategy = NULL; struct commit_list **remotes = &remoteheads; + if (startup_info->help) + usage_with_options(builtin_merge_usage, builtin_merge_options); + if (read_cache_unmerged()) { die_resolve_conflict("merge"); } diff --git a/builtin/update-index.c b/builtin/update-index.c index 3ab214d..46a53f5 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -589,6 +589,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) int lock_error = 0; struct lock_file *lock_file; + if (startup_info->help) + usage(update_index_usage); + git_config(git_default_config, NULL); /* We can't free this memory, it becomes part of a linked list parsed atexit() */ diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c index 73f788e..d4f4741 100644 --- a/builtin/upload-archive.c +++ b/builtin/upload-archive.c @@ -26,9 +26,6 @@ static int run_upload_archive(int argc, const char **argv, const char *prefix) int sent_argc; int len; - if (argc != 2) - usage(upload_archive_usage); - if (strlen(argv[1]) + 1 > sizeof(buf)) die("insanely long repository name"); @@ -98,6 +95,10 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix) { pid_t writer; int fd1[2], fd2[2]; + + if (startup_info->help || argc != 2) + usage(upload_archive_usage); + /* * Set up sideband subprocess. * diff --git a/t/t3905-help.sh b/t/t3905-help.sh new file mode 100755 index 0000000..c7e80c5 --- /dev/null +++ b/t/t3905-help.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +test_description='tests that git foo -h should work even in broken repos' + +. ./test-lib.sh + +test_expect_success 'setup' ' + git config core.repositoryformatversion 99 && + test_must_fail git rev-parse HEAD +' + +CMDS="branch checkout-index commit gc ls-files merge update-index upload-archive" +for cmd in $CMDS; do + test_expect_success "$cmd -h" " + test_must_fail git $cmd -h && + test \$exit_code = 129 + " +done + +test_done -- 1.7.0.2.445.gcbdb3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html