@ -7,40 +7,49 @@
@@ -7,40 +7,49 @@
#include "builtin.h"
#include "exec_cmd.h"
#include "common-cmds.h"
static const char *help_default_format;
static enum help_format {
man_format,
info_format,
web_format,
} help_format = man_format;
static void parse_help_format(const char *format)
#include "parse-options.h"
enum help_format {
HELP_FORMAT_MAN,
HELP_FORMAT_INFO,
HELP_FORMAT_WEB,
};
static int show_all = 0;
static enum help_format help_format = HELP_FORMAT_MAN;
static struct option builtin_help_options[] = {
OPT_BOOLEAN('a', "all", &show_all, "print all available commands"),
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 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) {
help_format = man_format;
return;
}
if (!strcmp(format, "man")) {
help_format = man_format;
return;
}
if (!strcmp(format, "info")) {
help_format = info_format;
return;
}
if (!strcmp(format, "web") || !strcmp(format, "html")) {
help_format = web_format;
return;
}
if (!strcmp(format, "man"))
return HELP_FORMAT_MAN;
if (!strcmp(format, "info"))
return HELP_FORMAT_INFO;
if (!strcmp(format, "web") || !strcmp(format, "html"))
return HELP_FORMAT_WEB;
die("unrecognized help format '%s'", format);
}
static int git_help_config(const char *var, const char *value)
{
if (!strcmp(var, "help.format"))
return git_config_string(&help_default_format, var, value);
if (!strcmp(var, "help.format")) {
if (!value)
return config_error_nonbool(var);
help_format = parse_help_format(value);
return 0;
}
return git_default_config(var, value);
}
@ -201,7 +210,7 @@ static unsigned int list_commands_in_dir(struct cmdnames *cmds,
@@ -201,7 +210,7 @@ static unsigned int list_commands_in_dir(struct cmdnames *cmds,
return longest;
}
static void list_commands(void)
static unsigned int load_command_list(void)
{
unsigned int longest = 0;
unsigned int len;
@ -241,6 +250,14 @@ static void list_commands(void)
@@ -241,6 +250,14 @@ static void list_commands(void)
uniq(&other_cmds);
exclude_cmds(&other_cmds, &main_cmds);
return longest;
}
static void list_commands(void)
{
unsigned int longest = load_command_list();
const char *exec_path = git_exec_path();
if (main_cmds.cnt) {
printf("available git commands in '%s'\n", exec_path);
printf("----------------------------");
@ -275,6 +292,22 @@ void list_common_cmds_help(void)
@@ -275,6 +292,22 @@ void list_common_cmds_help(void)
}
}
static int is_in_cmdlist(struct cmdnames *c, const char *s)
{
int i;
for (i = 0; i < c->cnt; i++)
if (!strcmp(s, c->names[i]->name))
return 1;
return 0;
}
static int is_git_command(const char *s)
{
load_command_list();
return is_in_cmdlist(&main_cmds, s) ||
is_in_cmdlist(&other_cmds, s);
}
static const char *cmd_to_page(const char *git_cmd)
{
if (!git_cmd)
@ -362,50 +395,43 @@ int cmd_version(int argc, const char **argv, const char *prefix)
@@ -362,50 +395,43 @@ int cmd_version(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;
const char *alias;
if (argc < 2) {
printf("usage: %s\n\n", git_usage_string);
list_common_cmds_help();
exit(0);
}
setup_git_directory_gently(&nongit);
git_config(git_help_config);
argc = parse_options(argc, argv, builtin_help_options,
builtin_help_usage, 0);
if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a")) {
if (show_all) {
printf("usage: %s\n\n", git_usage_string);
list_commands();
return 0;
}
else if (!strcmp(help_cmd, "--web") || !strcmp(help_cmd, "-w")) {
show_html_page(argc > 2 ? argv[2] : NULL);
}
else if (!strcmp(help_cmd, "--info") || !strcmp(help_cmd, "-i")) {
show_info_page(argc > 2 ? argv[2] : NULL);
if (!argv[0]) {
printf("usage: %s\n\n", git_usage_string);
list_common_cmds_help();
return 0;
}
else if (!strcmp(help_cmd, "--man") || !strcmp(help_cmd, "-m")) {
show_man_page(argc > 2 ? argv[2] : NULL);
alias = alias_lookup(argv[0]);
if (alias && !is_git_command(argv[0])) {
printf("`git %s' is aliased to `%s'\n", argv[0], alias);
return 0;
}
else {
int nongit;
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;
}
switch (help_format) {
case HELP_FORMAT_MAN:
show_man_page(argv[0]);
break;
case HELP_FORMAT_INFO:
show_info_page(argv[0]);
break;
case HELP_FORMAT_WEB:
show_html_page(argv[0]);
break;
}
return 0;