help: use parseopt
This patch converts cmd_help to use parseopt, along with a
few style cleanups, including:
  - enum constants are now ALL_CAPS
  - parse_help_format returns an enum value rather than
    setting a global as a side effect
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
			
			
				maint
			
			
		
							parent
							
								
									923d44aeb7
								
							
						
					
					
						commit
						41eb33bd0c
					
				
							
								
								
									
										117
									
								
								help.c
								
								
								
								
							
							
						
						
									
										117
									
								
								help.c
								
								
								
								
							|  | @ -7,40 +7,49 @@ | ||||||
| #include "builtin.h" | #include "builtin.h" | ||||||
| #include "exec_cmd.h" | #include "exec_cmd.h" | ||||||
| #include "common-cmds.h" | #include "common-cmds.h" | ||||||
|  | #include "parse-options.h" | ||||||
|  |  | ||||||
| static const char *help_default_format; | enum help_format { | ||||||
|  | 	HELP_FORMAT_MAN, | ||||||
|  | 	HELP_FORMAT_INFO, | ||||||
|  | 	HELP_FORMAT_WEB, | ||||||
|  | }; | ||||||
|  |  | ||||||
| static enum help_format { | static int show_all = 0; | ||||||
| 	man_format, | static enum help_format help_format = HELP_FORMAT_MAN; | ||||||
| 	info_format, | static struct option builtin_help_options[] = { | ||||||
| 	web_format, | 	OPT_BOOLEAN('a', "all", &show_all, "print all available commands"), | ||||||
| } help_format = man_format; | 	OPT_SET_INT('m', "man", &help_format, "show man page", HELP_FORMAT_MAN), | ||||||
|  | 	OPT_SET_INT('w', "web", &help_format, "show manual in web browser", | ||||||
|  | 			HELP_FORMAT_WEB), | ||||||
|  | 	OPT_SET_INT('i', "info", &help_format, "show info page", | ||||||
|  | 			HELP_FORMAT_INFO), | ||||||
|  | }; | ||||||
|  |  | ||||||
| static void parse_help_format(const char *format) | static const char * const builtin_help_usage[] = { | ||||||
|  | 	"git-help [--all] [--man|--web|--info] [command]", | ||||||
|  | 	NULL | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static enum help_format parse_help_format(const char *format) | ||||||
| { | { | ||||||
| 	if (!format) { | 	if (!strcmp(format, "man")) | ||||||
| 		help_format = man_format; | 		return HELP_FORMAT_MAN; | ||||||
| 		return; | 	if (!strcmp(format, "info")) | ||||||
| 	} | 		return HELP_FORMAT_INFO; | ||||||
| 	if (!strcmp(format, "man")) { | 	if (!strcmp(format, "web") || !strcmp(format, "html")) | ||||||
| 		help_format = man_format; | 		return HELP_FORMAT_WEB; | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 	if (!strcmp(format, "info")) { |  | ||||||
| 		help_format = info_format; |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 	if (!strcmp(format, "web") || !strcmp(format, "html")) { |  | ||||||
| 		help_format = web_format; |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 	die("unrecognized help format '%s'", format); | 	die("unrecognized help format '%s'", format); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int git_help_config(const char *var, const char *value) | static int git_help_config(const char *var, const char *value) | ||||||
| { | { | ||||||
| 	if (!strcmp(var, "help.format")) | 	if (!strcmp(var, "help.format")) { | ||||||
| 		return git_config_string(&help_default_format, var, value); | 		if (!value) | ||||||
|  | 			return config_error_nonbool(var); | ||||||
|  | 		help_format = parse_help_format(value); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
| 	return git_default_config(var, value); | 	return git_default_config(var, value); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -362,50 +371,36 @@ int cmd_version(int argc, const char **argv, const char *prefix) | ||||||
|  |  | ||||||
| int cmd_help(int argc, const char **argv, const char *prefix) | int cmd_help(int argc, const char **argv, const char *prefix) | ||||||
| { | { | ||||||
| 	const char *help_cmd = argv[1]; | 	int nongit; | ||||||
|  |  | ||||||
| 	if (argc < 2) { | 	setup_git_directory_gently(&nongit); | ||||||
| 		printf("usage: %s\n\n", git_usage_string); | 	git_config(git_help_config); | ||||||
| 		list_common_cmds_help(); |  | ||||||
| 		exit(0); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a")) { | 	argc = parse_options(argc, argv, builtin_help_options, | ||||||
|  | 			builtin_help_usage, 0); | ||||||
|  |  | ||||||
|  | 	if (show_all) { | ||||||
| 		printf("usage: %s\n\n", git_usage_string); | 		printf("usage: %s\n\n", git_usage_string); | ||||||
| 		list_commands(); | 		list_commands(); | ||||||
|  | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	else if (!strcmp(help_cmd, "--web") || !strcmp(help_cmd, "-w")) { | 	if (!argv[0]) { | ||||||
| 		show_html_page(argc > 2 ? argv[2] : NULL); | 		printf("usage: %s\n\n", git_usage_string); | ||||||
|  | 		list_common_cmds_help(); | ||||||
|  | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	else if (!strcmp(help_cmd, "--info") || !strcmp(help_cmd, "-i")) { | 	switch (help_format) { | ||||||
| 		show_info_page(argc > 2 ? argv[2] : NULL); | 	case HELP_FORMAT_MAN: | ||||||
| 	} | 		show_man_page(argv[0]); | ||||||
|  | 		break; | ||||||
| 	else if (!strcmp(help_cmd, "--man") || !strcmp(help_cmd, "-m")) { | 	case HELP_FORMAT_INFO: | ||||||
| 		show_man_page(argc > 2 ? argv[2] : NULL); | 		show_info_page(argv[0]); | ||||||
| 	} | 		break; | ||||||
|  | 	case HELP_FORMAT_WEB: | ||||||
| 	else { | 		show_html_page(argv[0]); | ||||||
| 		int nongit; | 		break; | ||||||
|  |  | ||||||
| 		setup_git_directory_gently(&nongit); |  | ||||||
| 		git_config(git_help_config); |  | ||||||
| 		if (help_default_format) |  | ||||||
| 			parse_help_format(help_default_format); |  | ||||||
|  |  | ||||||
| 		switch (help_format) { |  | ||||||
| 		case man_format: |  | ||||||
| 			show_man_page(help_cmd); |  | ||||||
| 			break; |  | ||||||
| 		case info_format: |  | ||||||
| 			show_info_page(help_cmd); |  | ||||||
| 			break; |  | ||||||
| 		case web_format: |  | ||||||
| 			show_html_page(help_cmd); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jeff King
						Jeff King