Merge branch 'pw/rebase-x-sanity-check'

"git rebase -x $cmd" did not reject multi-line command, even though
the command is incapable of handling such a command.  It now is
rejected upfront.

* pw/rebase-x-sanity-check:
  rebase -x: sanity check command
This commit is contained in:
Junio C Hamano 2019-02-06 22:05:26 -08:00
Родитель 57cbc53d3e c762aada1a
Коммит 96e6547c2e
2 изменённых файлов: 36 добавлений и 0 удалений

Просмотреть файл

@ -1005,6 +1005,19 @@ static void set_reflog_action(struct rebase_options *options)
strbuf_release(&buf); strbuf_release(&buf);
} }
static int check_exec_cmd(const char *cmd)
{
if (strchr(cmd, '\n'))
return error(_("exec commands cannot contain newlines"));
/* Does the command consist purely of whitespace? */
if (!cmd[strspn(cmd, " \t\r\f\v")])
return error(_("empty exec command"));
return 0;
}
int cmd_rebase(int argc, const char **argv, const char *prefix) int cmd_rebase(int argc, const char **argv, const char *prefix)
{ {
struct rebase_options options = { struct rebase_options options = {
@ -1348,6 +1361,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
} }
} }
for (i = 0; i < exec.nr; i++)
if (check_exec_cmd(exec.items[i].string))
exit(1);
if (!(options.flags & REBASE_NO_QUIET)) if (!(options.flags & REBASE_NO_QUIET))
argv_array_push(&options.git_am_opts, "-q"); argv_array_push(&options.git_am_opts, "-q");

Просмотреть файл

@ -147,6 +147,25 @@ test_expect_success 'rebase -i with the exec command checks tree cleanness' '
git rebase --continue git rebase --continue
' '
test_expect_success 'rebase -x with empty command fails' '
test_when_finished "git rebase --abort ||:" &&
test_must_fail git rebase -x "" @ 2>actual &&
test_write_lines "error: empty exec command" >expected &&
test_i18ncmp expected actual &&
test_must_fail git rebase -x " " @ 2>actual &&
test_i18ncmp expected actual
'
LF='
'
test_expect_success 'rebase -x with newline in command fails' '
test_when_finished "git rebase --abort ||:" &&
test_must_fail git rebase -x "a${LF}b" @ 2>actual &&
test_write_lines "error: exec commands cannot contain newlines" \
>expected &&
test_i18ncmp expected actual
'
test_expect_success 'rebase -i with exec of inexistent command' ' test_expect_success 'rebase -i with exec of inexistent command' '
git checkout master && git checkout master &&
test_when_finished "git rebase --abort" && test_when_finished "git rebase --abort" &&