Merge branch 'rt/help-unknown'
"git nosuchcommand --help" said "No manual entry for gitnosuchcommand", which was not intuitive, given that "git nosuchcommand" said "git: 'nosuchcommand' is not a git command". * rt/help-unknown: help: make option --help open man pages only for Git commands help: introduce option --exclude-guides
This commit is contained in:
commit
d7ed183a91
@ -37,8 +37,10 @@ static int show_all = 0;
|
|||||||
static int show_guides = 0;
|
static int show_guides = 0;
|
||||||
static unsigned int colopts;
|
static unsigned int colopts;
|
||||||
static enum help_format help_format = HELP_FORMAT_NONE;
|
static enum help_format help_format = HELP_FORMAT_NONE;
|
||||||
|
static int exclude_guides;
|
||||||
static struct option builtin_help_options[] = {
|
static struct option builtin_help_options[] = {
|
||||||
OPT_BOOL('a', "all", &show_all, N_("print all available commands")),
|
OPT_BOOL('a', "all", &show_all, N_("print all available commands")),
|
||||||
|
OPT_HIDDEN_BOOL(0, "exclude-guides", &exclude_guides, N_("exclude guides")),
|
||||||
OPT_BOOL('g', "guides", &show_guides, N_("print list of useful guides")),
|
OPT_BOOL('g', "guides", &show_guides, N_("print list of useful guides")),
|
||||||
OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
|
OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
|
||||||
OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
|
OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
|
||||||
@ -426,10 +428,29 @@ static void list_common_guides_help(void)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *check_git_cmd(const char* cmd)
|
||||||
|
{
|
||||||
|
char *alias;
|
||||||
|
|
||||||
|
if (is_git_command(cmd))
|
||||||
|
return cmd;
|
||||||
|
|
||||||
|
alias = alias_lookup(cmd);
|
||||||
|
if (alias) {
|
||||||
|
printf_ln(_("`git %s' is aliased to `%s'"), cmd, alias);
|
||||||
|
free(alias);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exclude_guides)
|
||||||
|
return help_unknown_cmd(cmd);
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_help(int argc, const char **argv, const char *prefix)
|
int cmd_help(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int nongit;
|
int nongit;
|
||||||
char *alias;
|
|
||||||
enum help_format parsed_help_format;
|
enum help_format parsed_help_format;
|
||||||
|
|
||||||
argc = parse_options(argc, argv, prefix, builtin_help_options,
|
argc = parse_options(argc, argv, prefix, builtin_help_options,
|
||||||
@ -469,12 +490,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
|
|||||||
if (help_format == HELP_FORMAT_NONE)
|
if (help_format == HELP_FORMAT_NONE)
|
||||||
help_format = parse_help_format(DEFAULT_HELP_FORMAT);
|
help_format = parse_help_format(DEFAULT_HELP_FORMAT);
|
||||||
|
|
||||||
alias = alias_lookup(argv[0]);
|
argv[0] = check_git_cmd(argv[0]);
|
||||||
if (alias && !is_git_command(argv[0])) {
|
|
||||||
printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
|
|
||||||
free(alias);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (help_format) {
|
switch (help_format) {
|
||||||
case HELP_FORMAT_NONE:
|
case HELP_FORMAT_NONE:
|
||||||
|
15
git.c
15
git.c
@ -522,21 +522,34 @@ static void strip_extension(const char **argv)
|
|||||||
|
|
||||||
static void handle_builtin(int argc, const char **argv)
|
static void handle_builtin(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
|
struct argv_array args = ARGV_ARRAY_INIT;
|
||||||
const char *cmd;
|
const char *cmd;
|
||||||
struct cmd_struct *builtin;
|
struct cmd_struct *builtin;
|
||||||
|
|
||||||
strip_extension(argv);
|
strip_extension(argv);
|
||||||
cmd = argv[0];
|
cmd = argv[0];
|
||||||
|
|
||||||
/* Turn "git cmd --help" into "git help cmd" */
|
/* Turn "git cmd --help" into "git help --exclude-guides cmd" */
|
||||||
if (argc > 1 && !strcmp(argv[1], "--help")) {
|
if (argc > 1 && !strcmp(argv[1], "--help")) {
|
||||||
|
int i;
|
||||||
|
|
||||||
argv[1] = argv[0];
|
argv[1] = argv[0];
|
||||||
argv[0] = cmd = "help";
|
argv[0] = cmd = "help";
|
||||||
|
|
||||||
|
for (i = 0; i < argc; i++) {
|
||||||
|
argv_array_push(&args, argv[i]);
|
||||||
|
if (!i)
|
||||||
|
argv_array_push(&args, "--exclude-guides");
|
||||||
|
}
|
||||||
|
|
||||||
|
argc++;
|
||||||
|
argv = args.argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
builtin = get_builtin(cmd);
|
builtin = get_builtin(cmd);
|
||||||
if (builtin)
|
if (builtin)
|
||||||
exit(run_builtin(builtin, argc, argv));
|
exit(run_builtin(builtin, argc, argv));
|
||||||
|
argv_array_clear(&args);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void execv_dashed_external(const char **argv)
|
static void execv_dashed_external(const char **argv)
|
||||||
|
52
t/t0012-help.sh
Executable file
52
t/t0012-help.sh
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='help'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
configure_help () {
|
||||||
|
test_config help.format html &&
|
||||||
|
|
||||||
|
# Unless the path has "://" in it, Git tries to make sure
|
||||||
|
# the documentation directory locally exists. Avoid it as
|
||||||
|
# we are only interested in seeing an attempt to correctly
|
||||||
|
# invoke a help browser in this test.
|
||||||
|
test_config help.htmlpath test://html &&
|
||||||
|
|
||||||
|
# Name a custom browser
|
||||||
|
test_config browser.test.cmd ./test-browser &&
|
||||||
|
test_config help.browser test
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success "setup" '
|
||||||
|
# Just write out which page gets requested
|
||||||
|
write_script test-browser <<-\EOF
|
||||||
|
echo "$*" >test-browser.log
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success "works for commands and guides by default" '
|
||||||
|
configure_help &&
|
||||||
|
git help status &&
|
||||||
|
echo "test://html/git-status.html" >expect &&
|
||||||
|
test_cmp expect test-browser.log &&
|
||||||
|
git help revisions &&
|
||||||
|
echo "test://html/gitrevisions.html" >expect &&
|
||||||
|
test_cmp expect test-browser.log
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success "--exclude-guides does not work for guides" '
|
||||||
|
>test-browser.log &&
|
||||||
|
test_must_fail git help --exclude-guides revisions &&
|
||||||
|
test_must_be_empty test-browser.log
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success "--help does not work for guides" "
|
||||||
|
cat <<-EOF >expect &&
|
||||||
|
git: 'revisions' is not a git command. See 'git --help'.
|
||||||
|
EOF
|
||||||
|
test_must_fail git revisions --help 2>actual &&
|
||||||
|
test_i18ncmp expect actual
|
||||||
|
"
|
||||||
|
|
||||||
|
test_done
|
Loading…
x
Reference in New Issue
Block a user