builtin: also setup gently for --help-all
Git experts often check the help summary of a command to make sure they
spell options right when suggesting advice to colleagues. Further, they
might check hidden options when responding to queries about deprecated
options like git-rebase(1)'s "preserve merges" option. But some commands
don't support "--help-all" outside of a git directory. Running (for
example)
    git rebase --help-all
outside a directory fails in "setup_git_directory", erroring with the
localized form of
    fatal: not a git repository (or any of the parent directories): .git
Like 99caeed05d (Let 'git <command> -h' show usage without a git dir,
2009-11-09), we want to show the "--help-all" output even without a git
dir. Make "--help-all" where we expect "-h" to mean
"setup_git_directory_gently", and interpose early in the natural place
("show_usage_with_options_if_asked").
Do the same for usage callers with show_usage_if_asked.
The exception is merge-recursive, whose help block doesn't use newer
APIs.
Best-viewed-with: --ignore-space-change
Signed-off-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
			
			
				main
			
			
		
							parent
							
								
									fe54b9ef02
								
							
						
					
					
						commit
						129b3632f3
					
				|  | @ -38,7 +38,8 @@ int cmd_merge_recursive(int argc, | ||||||
| 	if (argv[0] && ends_with(argv[0], "-subtree")) | 	if (argv[0] && ends_with(argv[0], "-subtree")) | ||||||
| 		o.subtree_shift = ""; | 		o.subtree_shift = ""; | ||||||
|  |  | ||||||
| 	if (argc == 2 && !strcmp(argv[1], "-h")) { | 	if (argc == 2 && (!strcmp(argv[1], "-h") || | ||||||
|  | 			  !strcmp(argv[1], "--help-all"))) { | ||||||
| 		struct strbuf msg = STRBUF_INIT; | 		struct strbuf msg = STRBUF_INIT; | ||||||
| 		strbuf_addf(&msg, builtin_merge_recursive_usage, argv[0]); | 		strbuf_addf(&msg, builtin_merge_recursive_usage, argv[0]); | ||||||
| 		show_usage_if_asked(argc, argv, msg.buf); | 		show_usage_if_asked(argc, argv, msg.buf); | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								git.c
								
								
								
								
							
							
						
						
									
										2
									
								
								git.c
								
								
								
								
							|  | @ -445,7 +445,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv, struct | ||||||
| 	const char *prefix; | 	const char *prefix; | ||||||
| 	int run_setup = (p->option & (RUN_SETUP | RUN_SETUP_GENTLY)); | 	int run_setup = (p->option & (RUN_SETUP | RUN_SETUP_GENTLY)); | ||||||
|  |  | ||||||
| 	help = argc == 2 && !strcmp(argv[1], "-h"); | 	help = argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help-all")); | ||||||
| 	if (help && (run_setup & RUN_SETUP)) | 	if (help && (run_setup & RUN_SETUP)) | ||||||
| 		/* demote to GENTLY to allow 'git cmd -h' outside repo */ | 		/* demote to GENTLY to allow 'git cmd -h' outside repo */ | ||||||
| 		run_setup = RUN_SETUP_GENTLY; | 		run_setup = RUN_SETUP_GENTLY; | ||||||
|  |  | ||||||
|  | @ -1461,10 +1461,16 @@ void show_usage_with_options_if_asked(int ac, const char **av, | ||||||
| 				      const char * const *usagestr, | 				      const char * const *usagestr, | ||||||
| 				      const struct option *opts) | 				      const struct option *opts) | ||||||
| { | { | ||||||
| 	if (ac == 2 && !strcmp(av[1], "-h")) { | 	if (ac == 2) { | ||||||
|  | 		if (!strcmp(av[1], "-h")) { | ||||||
| 			usage_with_options_internal(NULL, usagestr, opts, | 			usage_with_options_internal(NULL, usagestr, opts, | ||||||
| 						    USAGE_NORMAL, USAGE_TO_STDOUT); | 						    USAGE_NORMAL, USAGE_TO_STDOUT); | ||||||
| 			exit(129); | 			exit(129); | ||||||
|  | 		} else if (!strcmp(av[1], "--help-all")) { | ||||||
|  | 			usage_with_options_internal(NULL, usagestr, opts, | ||||||
|  | 						    USAGE_FULL, USAGE_TO_STDOUT); | ||||||
|  | 			exit(129); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -133,6 +133,10 @@ do | ||||||
| 		test_expect_code 129 nongit git $cmd -h >usage && | 		test_expect_code 129 nongit git $cmd -h >usage && | ||||||
| 		test_grep "[Uu]sage: git $cmd " usage | 		test_grep "[Uu]sage: git $cmd " usage | ||||||
| 	' | 	' | ||||||
|  | 	test_$expect_outcome $prereq "'git $cmd --help-all' outside a repository" ' | ||||||
|  | 		test_expect_code 129 nongit git $cmd --help-all >usage && | ||||||
|  | 		test_grep "[Uu]sage: git $cmd " usage | ||||||
|  | 	' | ||||||
| done | done | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								usage.c
								
								
								
								
							
							
						
						
									
										3
									
								
								usage.c
								
								
								
								
							|  | @ -192,7 +192,8 @@ static void show_usage_if_asked_helper(const char *err, ...) | ||||||
|  |  | ||||||
| void show_usage_if_asked(int ac, const char **av, const char *err) | void show_usage_if_asked(int ac, const char **av, const char *err) | ||||||
| { | { | ||||||
| 	if (ac == 2 && !strcmp(av[1], "-h")) | 	if (ac == 2 && (!strcmp(av[1], "-h") || | ||||||
|  | 			!strcmp(av[1], "--help-all"))) | ||||||
| 		show_usage_if_asked_helper(err); | 		show_usage_if_asked_helper(err); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 D. Ben Knoble
						D. Ben Knoble