On 21/04/18 17:56, Duy Nguyen wrote: > On Sat, Apr 21, 2018 at 06:54:08PM +0200, Nguyễn Thái Ngọc Duy wrote: >> Changes: >> >> - remove the deprecated column in command-list.txt. My change break it >> anyway if anyone uses it. >> - fix up failed tests that I marked in the RFC and kinda forgot about it. >> - fix bashisms in generate-cmdlist.sh >> - fix segfaul in "git help" > > Sorry I forgot the interdiff > [snip] > diff --git a/t/t0012-help.sh b/t/t0012-help.sh > index fd2a7f27dc..53208ab20e 100755 > --- a/t/t0012-help.sh > +++ b/t/t0012-help.sh > @@ -25,6 +25,15 @@ test_expect_success "setup" ' > EOF > ' > > +# make sure to exercise these code paths, the output is a bit tricky > +# to verify > +test_expect_success 'basic help commands' ' > + git help >/dev/null && > + git help -a >/dev/null && > + git help -g >/dev/null && > + git help -av >/dev/null > +' > + I think you need to try a little harder than this! ;-) This test would not have noticed the recent failure (what annoyed me was that git build without error and then the test-suite sailed through with nary a squeak of complaint). Viz: $ ./git help usage: git [--version] [--help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>] These are common Git commands used in various situations: 'git help -a' and 'git help -g' list available subcommands and some concept guides. See 'git help <command>' or 'git help <concept>' to read about a specific subcommand or concept. $ echo $? 0 $ $ ./git help -g The common Git guides are: 'git help -a' and 'git help -g' list available subcommands and some concept guides. See 'git help <command>' or 'git help <concept>' to read about a specific subcommand or concept. $ echo $? 0 $ $ ./git help -av Main Porcelain Commands Ancillary Commands / Manipulators Ancillary Commands / Interrogators Interacting with Others Low-level Commands / Manipulators Low-level Commands / Interrogators Low-level Commands / Synching Repositories Low-level Commands / Internal Helpers $ echo $? 0 $ I started to add some tests, like so: diff --git a/t/t0012-help.sh b/t/t0012-help.sh index fd2a7f27d..7e10c2862 100755 --- a/t/t0012-help.sh +++ b/t/t0012-help.sh @@ -49,6 +49,22 @@ test_expect_success "--help does not work for guides" " test_i18ncmp expect actual " +test_expect_success 'git help' ' + git help >help.output && + test_i18ngrep "^ clone " help.output && + test_i18ngrep "^ add " help.output && + test_i18ngrep "^ log " help.output && + test_i18ngrep "^ commit " help.output && + test_i18ngrep "^ fetch " help.output +' + +test_expect_success 'git help -g' ' + git help -g >help.output && + test_i18ngrep "^ attributes " help.output && + test_i18ngrep "^ everyday " help.output && + test_i18ngrep "^ tutorial " help.output +' + test_expect_success 'generate builtin list' ' git --list-cmds=builtins >builtins ' These tests, while not rigorous, did at least correctly catch the bad build for me. I was about to add the obvious one for 'git help -av', when I decided to catch the problem 'at source', viz: diff --git a/help.c b/help.c index a47f7e2c4..13790bb54 100644 --- a/help.c +++ b/help.c @@ -196,6 +196,9 @@ static void extract_common_cmds(struct cmdname_help **p_common_cmds, int i, nr = 0; struct cmdname_help *common_cmds; + if (ARRAY_SIZE(command_list) == 0) + BUG("empty command_list"); + ALLOC_ARRAY(common_cmds, ARRAY_SIZE(command_list)); for (i = 0; i < ARRAY_SIZE(command_list); i++) { @@ -279,6 +282,9 @@ void list_porcelain_cmds(void) int i, nr = ARRAY_SIZE(command_list); struct cmdname_help *cmds = command_list; + if (nr == 0) + BUG("empty command_list"); + for (i = 0; i < nr; i++) { if (cmds[i].category != CAT_mainporcelain) continue; @@ -321,6 +327,9 @@ void list_common_guides_help(void) int nr = ARRAY_SIZE(command_list); struct cmdname_help *cmds = command_list; + if (nr == 0) + BUG("empty command_list"); + QSORT(cmds, nr, cmd_category_cmp); for (i = 0; i < nr; i++) { @@ -343,6 +352,9 @@ void list_all_cmds_help(void) int nr = ARRAY_SIZE(command_list); struct cmdname_help *cmds = command_list; + if (nr == 0) + BUG("empty command_list"); + for (i = 0; i < nr; i++) { struct cmdname_help *cmd = cmds + i; This had a very dramatic effect on the test-suite, since every single test file failed while sourcing 'test-lib.sh'. [The test for having built git ('"$GIT_BUILD_DIR/git" >/dev/null') tries to output help, because you haven't given a command, and hits BUG - core dump!] I haven't tried this patch series yet (I will hopefully find some time tonight), but it looks like it will fix the problem. ATB, Ramsay Jones