Hi, Gerfried Fuchs wrote: > I really wonder why "git <command> -h" depends on being inside a > repository. I noticed it with "git diff -h" (add, branch does that, too): > > #v+ > ~/git> git tag -h > usage: git-tag [-n [<num>]] -l [<pattern>] | [-a | -s | -u <key-id>] [-f | -d | -v] [-m <msg> | -F <file>] <tagname> [<head>] > ~/git> cd > ~> git tag -h > fatal: Not a git repository > ~> > #v- This is a nuisance, I agree. So how about something like this patch? This just avoids looking for a .git directory if the only option to a subcommand is '-h'. -- %< -- Subject: [PATCH] Let 'git <command> -h' show usage without a git dir There is no need for "git <command> -h" to depend on being inside a repository. Reported by Gerfried Fuchs through http://bugs.debian.org/462557 Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- Tested with all builtins and non-builtins written in C. Some commands do not show usage with '-h' and have been left unchanged. git.c | 48 ++++++++++++++++++++++++++++++------------------ http-fetch.c | 13 ++++++++++++- index-pack.c | 5 +++++ pack-redundant.c | 5 +++++ 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/git.c b/git.c index bd2c5fe..bfa9518 100644 --- a/git.c +++ b/git.c @@ -220,6 +220,11 @@ const char git_version_string[] = GIT_VERSION; * RUN_SETUP for reading from the configuration file. */ #define NEED_WORK_TREE (1<<2) +/* + * Let RUN_SETUP, USE_PAGER, and NEED_WORK_TREE take effect even if + * passed the -h option. + */ +#define H_IS_NOT_HELP (1<<3) struct cmd_struct { const char *cmd; @@ -229,21 +234,25 @@ struct cmd_struct { static int run_builtin(struct cmd_struct *p, int argc, const char **argv) { - int status; + int status, help; struct stat st; const char *prefix; prefix = NULL; - if (p->option & RUN_SETUP) - prefix = setup_git_directory(); - - if (use_pager == -1 && p->option & RUN_SETUP) - use_pager = check_pager_config(p->cmd); - if (use_pager == -1 && p->option & USE_PAGER) - use_pager = 1; + help = argc == 2 && !(p->option & H_IS_NOT_HELP) && + !strcmp(argv[1], "-h"); + if (!help) { + if (p->option & RUN_SETUP && !help) + prefix = setup_git_directory(); + + if (use_pager == -1 && p->option & RUN_SETUP) + use_pager = check_pager_config(p->cmd); + if (use_pager == -1 && p->option & USE_PAGER) + use_pager = 1; + } commit_pager_choice(); - if (p->option & NEED_WORK_TREE) + if (!help && p->option & NEED_WORK_TREE) setup_work_tree(); trace_argv_printf(argv, "trace: built-in: git"); @@ -278,7 +287,8 @@ static void handle_internal_command(int argc, const char **argv) { "annotate", cmd_annotate, RUN_SETUP }, { "apply", cmd_apply }, { "archive", cmd_archive }, - { "bisect--helper", cmd_bisect__helper, RUN_SETUP | NEED_WORK_TREE }, + { "bisect--helper", cmd_bisect__helper, + RUN_SETUP | NEED_WORK_TREE }, { "blame", cmd_blame, RUN_SETUP }, { "branch", cmd_branch, RUN_SETUP }, { "bundle", cmd_bundle }, @@ -288,12 +298,12 @@ static void handle_internal_command(int argc, const char **argv) RUN_SETUP | NEED_WORK_TREE}, { "check-ref-format", cmd_check_ref_format }, { "check-attr", cmd_check_attr, RUN_SETUP }, - { "cherry", cmd_cherry, RUN_SETUP }, + { "cherry", cmd_cherry, RUN_SETUP | H_IS_NOT_HELP }, { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE }, { "clone", cmd_clone }, { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE }, { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, - { "commit-tree", cmd_commit_tree, RUN_SETUP }, + { "commit-tree", cmd_commit_tree, RUN_SETUP | H_IS_NOT_HELP }, { "config", cmd_config }, { "count-objects", cmd_count_objects, RUN_SETUP }, { "describe", cmd_describe, RUN_SETUP }, @@ -304,7 +314,7 @@ static void handle_internal_command(int argc, const char **argv) { "fast-export", cmd_fast_export, RUN_SETUP }, { "fetch", cmd_fetch, RUN_SETUP }, { "fetch-pack", cmd_fetch_pack, RUN_SETUP }, - { "fetch--tool", cmd_fetch__tool, RUN_SETUP }, + { "fetch--tool", cmd_fetch__tool, RUN_SETUP | H_IS_NOT_HELP }, { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP }, { "for-each-ref", cmd_for_each_ref, RUN_SETUP }, { "format-patch", cmd_format_patch, RUN_SETUP }, @@ -312,7 +322,7 @@ static void handle_internal_command(int argc, const char **argv) { "fsck-objects", cmd_fsck, RUN_SETUP }, { "gc", cmd_gc, RUN_SETUP }, { "get-tar-commit-id", cmd_get_tar_commit_id }, - { "grep", cmd_grep, RUN_SETUP | USE_PAGER }, + { "grep", cmd_grep, RUN_SETUP | USE_PAGER | H_IS_NOT_HELP }, { "help", cmd_help }, { "init", cmd_init_db }, { "init-db", cmd_init_db }, @@ -325,9 +335,11 @@ static void handle_internal_command(int argc, const char **argv) { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE }, { "merge-base", cmd_merge_base, RUN_SETUP }, { "merge-file", cmd_merge_file }, - { "merge-ours", cmd_merge_ours, RUN_SETUP }, - { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, - { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, + { "merge-ours", cmd_merge_ours, RUN_SETUP | H_IS_NOT_HELP }, + { "merge-recursive", cmd_merge_recursive, + RUN_SETUP | NEED_WORK_TREE | H_IS_NOT_HELP }, + { "merge-subtree", cmd_merge_recursive, + RUN_SETUP | NEED_WORK_TREE | H_IS_NOT_HELP }, { "mktree", cmd_mktree, RUN_SETUP }, { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE }, { "name-rev", cmd_name_rev, RUN_SETUP }, @@ -368,7 +380,7 @@ static void handle_internal_command(int argc, const char **argv) { "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER }, { "write-tree", cmd_write_tree, RUN_SETUP }, { "verify-pack", cmd_verify_pack }, - { "show-ref", cmd_show_ref, RUN_SETUP }, + { "show-ref", cmd_show_ref, RUN_SETUP | H_IS_NOT_HELP }, { "pack-refs", cmd_pack_refs, RUN_SETUP }, }; int i; diff --git a/http-fetch.c b/http-fetch.c index e8f44ba..85f5338 100644 --- a/http-fetch.c +++ b/http-fetch.c @@ -1,6 +1,10 @@ #include "cache.h" +#include "exec_cmd.h" #include "walker.h" +static const char http_fetch_usage[] = "git http-fetch " + "[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url"; + int main(int argc, const char **argv) { const char *prefix; @@ -19,6 +23,13 @@ int main(int argc, const char **argv) int get_verbosely = 0; int get_recover = 0; + git_extract_argv0_path(argv[0]); + + if (argc == 2 && !strcmp(argv[1], "-h")) { + fprintf(stderr, "%s\n", http_fetch_usage); + return 0; + } + prefix = setup_git_directory(); git_config(git_default_config, NULL); @@ -45,7 +56,7 @@ int main(int argc, const char **argv) arg++; } if (argc < arg + 2 - commits_on_stdin) { - usage("git http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url"); + usage(http_fetch_usage); return 1; } if (commits_on_stdin) { diff --git a/index-pack.c b/index-pack.c index b4f8278..4a7d405 100644 --- a/index-pack.c +++ b/index-pack.c @@ -882,6 +882,11 @@ int main(int argc, char **argv) git_extract_argv0_path(argv[0]); + if (argc == 2 && !strcmp(argv[1], "-h")) { + fprintf(stderr, "usage: %s\n", index_pack_usage); + return 0; + } + /* * We wish to read the repository's config file if any, and * for that it is necessary to call setup_git_directory_gently(). diff --git a/pack-redundant.c b/pack-redundant.c index 69a7ab2..24d59f9 100644 --- a/pack-redundant.c +++ b/pack-redundant.c @@ -603,6 +603,11 @@ int main(int argc, char **argv) git_extract_argv0_path(argv[0]); + if (argc == 2 && !strcmp(argv[1], "-h")) { + fprintf(stderr, "usage: %s\n", pack_redundant_usage); + return 0; + } + setup_git_directory(); for (i = 1; i < argc; i++) { -- 1.6.5.2 -- 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