Sync with Git 2.20.1

* maint:
  Git 2.20.1
  .gitattributes: ensure t/oid-info/* has eol=lf
  t9902: 'send-email' test case requires PERL
  t4256: mark support files as LF-only
  parse-options: fix SunCC compiler warning
  help -a: handle aliases with long names gracefully
  help.h: fix coding style
  run-command: report exec failure
This commit is contained in:
Junio C Hamano 2018-12-15 13:00:25 +09:00
commit b21ebb671b
13 changed files with 51 additions and 7 deletions

1
.gitattributes vendored
View File

@ -9,6 +9,7 @@
/command-list.txt eol=lf /command-list.txt eol=lf
/GIT-VERSION-GEN eol=lf /GIT-VERSION-GEN eol=lf
/mergetools/* eol=lf /mergetools/* eol=lf
/t/oid-info/* eol=lf
/Documentation/git-merge.txt conflict-marker-size=32 /Documentation/git-merge.txt conflict-marker-size=32
/Documentation/gitk.txt conflict-marker-size=32 /Documentation/gitk.txt conflict-marker-size=32
/Documentation/user-manual.txt conflict-marker-size=32 /Documentation/user-manual.txt conflict-marker-size=32

View File

@ -0,0 +1,20 @@
Git v2.20.1 Release Notes
=========================
This release is primarily to fix brown-paper-bag breakages in the
2.20.0 release.
Fixes since v2.20
-----------------
* A few newly added tests were not portable and caused minority
platforms to report false breakages, which have been fixed.
* Portability fix for a recent update to parse-options API.
* "git help -a" did not work well when an overly long alias is
defined, which has been corrected.
* A recent update accidentally squelched an error message when the
run_command API failed to run a missing command, which has been
corrected.

View File

@ -850,6 +850,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
case PARSE_OPT_HELP: case PARSE_OPT_HELP:
case PARSE_OPT_ERROR: case PARSE_OPT_ERROR:
exit(129); exit(129);
case PARSE_OPT_COMPLETE:
exit(0);
case PARSE_OPT_DONE: case PARSE_OPT_DONE:
if (ctx.argv[0]) if (ctx.argv[0])
dashdash_pos = ctx.cpidx; dashdash_pos = ctx.cpidx;

View File

@ -287,6 +287,8 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
case PARSE_OPT_HELP: case PARSE_OPT_HELP:
case PARSE_OPT_ERROR: case PARSE_OPT_ERROR:
exit(129); exit(129);
case PARSE_OPT_COMPLETE:
exit(0);
case PARSE_OPT_DONE: case PARSE_OPT_DONE:
goto parse_done; goto parse_done;
} }

View File

@ -1086,6 +1086,8 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
case PARSE_OPT_HELP: case PARSE_OPT_HELP:
case PARSE_OPT_ERROR: case PARSE_OPT_ERROR:
exit(129); exit(129);
case PARSE_OPT_COMPLETE:
exit(0);
case PARSE_OPT_NON_OPTION: case PARSE_OPT_NON_OPTION:
case PARSE_OPT_DONE: case PARSE_OPT_DONE:
{ {

10
help.c
View File

@ -83,8 +83,9 @@ static void print_command_list(const struct cmdname_help *cmds,
for (i = 0; cmds[i].name; i++) { for (i = 0; cmds[i].name; i++) {
if (cmds[i].category & mask) { if (cmds[i].category & mask) {
size_t len = strlen(cmds[i].name);
printf(" %s ", cmds[i].name); printf(" %s ", cmds[i].name);
mput_char(' ', longest - strlen(cmds[i].name)); mput_char(' ', longest > len ? longest - len : 1);
puts(_(cmds[i].help)); puts(_(cmds[i].help));
} }
} }
@ -526,6 +527,13 @@ void list_all_cmds_help(void)
git_config(get_alias, &alias_list); git_config(get_alias, &alias_list);
string_list_sort(&alias_list); string_list_sort(&alias_list);
for (i = 0; i < alias_list.nr; i++) {
size_t len = strlen(alias_list.items[i].string);
if (longest < len)
longest = len;
}
if (alias_list.nr) { if (alias_list.nr) {
printf("\n%s\n", _("Command aliases")); printf("\n%s\n", _("Command aliases"));
ALLOC_ARRAY(aliases, alias_list.nr + 1); ALLOC_ARRAY(aliases, alias_list.nr + 1);

2
help.h
View File

@ -15,7 +15,7 @@ struct cmdnames {
static inline void mput_char(char c, unsigned int num) static inline void mput_char(char c, unsigned int num)
{ {
while(num--) while (num--)
putchar(c); putchar(c);
} }

View File

@ -516,7 +516,7 @@ static int show_gitcomp(struct parse_opt_ctx_t *ctx,
show_negated_gitcomp(original_opts, -1); show_negated_gitcomp(original_opts, -1);
show_negated_gitcomp(original_opts, nr_noopts); show_negated_gitcomp(original_opts, nr_noopts);
fputc('\n', stdout); fputc('\n', stdout);
exit(0); return PARSE_OPT_COMPLETE;
} }
static int usage_with_options_internal(struct parse_opt_ctx_t *, static int usage_with_options_internal(struct parse_opt_ctx_t *,
@ -638,6 +638,8 @@ int parse_options(int argc, const char **argv, const char *prefix,
case PARSE_OPT_HELP: case PARSE_OPT_HELP:
case PARSE_OPT_ERROR: case PARSE_OPT_ERROR:
exit(129); exit(129);
case PARSE_OPT_COMPLETE:
exit(0);
case PARSE_OPT_NON_OPTION: case PARSE_OPT_NON_OPTION:
case PARSE_OPT_DONE: case PARSE_OPT_DONE:
break; break;

View File

@ -208,6 +208,7 @@ extern int opterror(const struct option *opt, const char *reason, int flags);
/*----- incremental advanced APIs -----*/ /*----- incremental advanced APIs -----*/
enum { enum {
PARSE_OPT_COMPLETE = -2,
PARSE_OPT_HELP = -1, PARSE_OPT_HELP = -1,
PARSE_OPT_DONE, PARSE_OPT_DONE,
PARSE_OPT_NON_OPTION, PARSE_OPT_NON_OPTION,

View File

@ -728,6 +728,8 @@ fail_pipe:
if (prepare_cmd(&argv, cmd) < 0) { if (prepare_cmd(&argv, cmd) < 0) {
failed_errno = errno; failed_errno = errno;
cmd->pid = -1; cmd->pid = -1;
if (!cmd->silent_exec_failure)
error_errno("cannot run %s", cmd->argv[0]);
goto end_of_spawn; goto end_of_spawn;
} }

1
t/.gitattributes vendored
View File

@ -16,6 +16,7 @@ t[0-9][0-9][0-9][0-9]/* -whitespace
/t4135/* eol=lf /t4135/* eol=lf
/t4211/* eol=lf /t4211/* eol=lf
/t4252/* eol=lf /t4252/* eol=lf
/t4256/1/* eol=lf
/t5100/* eol=lf /t5100/* eol=lf
/t5515/* eol=lf /t5515/* eol=lf
/t556x_common eol=lf /t556x_common eol=lf

View File

@ -13,11 +13,13 @@ cat >hello-script <<-EOF
EOF EOF
test_expect_success 'start_command reports ENOENT (slash)' ' test_expect_success 'start_command reports ENOENT (slash)' '
test-tool run-command start-command-ENOENT ./does-not-exist test-tool run-command start-command-ENOENT ./does-not-exist 2>err &&
test_i18ngrep "\./does-not-exist" err
' '
test_expect_success 'start_command reports ENOENT (no slash)' ' test_expect_success 'start_command reports ENOENT (no slash)' '
test-tool run-command start-command-ENOENT does-not-exist test-tool run-command start-command-ENOENT does-not-exist 2>err &&
test_i18ngrep "does-not-exist" err
' '
test_expect_success 'run_command can run a command' ' test_expect_success 'run_command can run a command' '
@ -33,7 +35,8 @@ test_expect_success 'run_command is restricted to PATH' '
write_script should-not-run <<-\EOF && write_script should-not-run <<-\EOF &&
echo yikes echo yikes
EOF EOF
test_must_fail test-tool run-command run-command should-not-run test_must_fail test-tool run-command run-command should-not-run 2>err &&
test_i18ngrep "should-not-run" err
' '
test_expect_success !MINGW 'run_command can run a script without a #! line' ' test_expect_success !MINGW 'run_command can run a script without a #! line' '

View File

@ -1539,7 +1539,7 @@ test_expect_success 'complete tree filename with metacharacters' '
EOF EOF
' '
test_expect_success 'send-email' ' test_expect_success PERL 'send-email' '
test_completion "git send-email --cov" "--cover-letter " && test_completion "git send-email --cov" "--cover-letter " &&
test_completion "git send-email ma" "master " test_completion "git send-email ma" "master "
' '