Merge branch 'pw/rebase-i-validate-labels-early'
An invalid label or ref in the "rebase -i" todo file used to trigger an runtime error. SUch an error is now diagnosed while the todo file is parsed. * pw/rebase-i-validate-labels-early: rebase -i: check labels and refs when parsing todo list
This commit is contained in:
39
sequencer.c
39
sequencer.c
@ -2487,6 +2487,34 @@ static int is_command(enum todo_command command, const char **bol)
|
|||||||
(*bol = p));
|
(*bol = p));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int check_label_or_ref_arg(enum todo_command command, const char *arg)
|
||||||
|
{
|
||||||
|
switch (command) {
|
||||||
|
case TODO_LABEL:
|
||||||
|
/*
|
||||||
|
* '#' is not a valid label as the merge command uses it to
|
||||||
|
* separate merge parents from the commit subject.
|
||||||
|
*/
|
||||||
|
if (!strcmp(arg, "#") ||
|
||||||
|
check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
|
||||||
|
return error(_("'%s' is not a valid label"), arg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TODO_UPDATE_REF:
|
||||||
|
if (check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
|
||||||
|
return error(_("'%s' is not a valid refname"), arg);
|
||||||
|
if (check_refname_format(arg, 0))
|
||||||
|
return error(_("update-ref requires a fully qualified "
|
||||||
|
"refname e.g. refs/heads/%s"), arg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
BUG("unexpected todo_command");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_insn_line(struct repository *r, struct todo_item *item,
|
static int parse_insn_line(struct repository *r, struct todo_item *item,
|
||||||
const char *buf, const char *bol, char *eol)
|
const char *buf, const char *bol, char *eol)
|
||||||
{
|
{
|
||||||
@ -2535,10 +2563,19 @@ static int parse_insn_line(struct repository *r, struct todo_item *item,
|
|||||||
|
|
||||||
if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
|
if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
|
||||||
item->command == TODO_RESET || item->command == TODO_UPDATE_REF) {
|
item->command == TODO_RESET || item->command == TODO_UPDATE_REF) {
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
item->commit = NULL;
|
item->commit = NULL;
|
||||||
item->arg_offset = bol - buf;
|
item->arg_offset = bol - buf;
|
||||||
item->arg_len = (int)(eol - bol);
|
item->arg_len = (int)(eol - bol);
|
||||||
return 0;
|
if (item->command == TODO_LABEL ||
|
||||||
|
item->command == TODO_UPDATE_REF) {
|
||||||
|
saved = *eol;
|
||||||
|
*eol = '\0';
|
||||||
|
ret = check_label_or_ref_arg(item->command, bol);
|
||||||
|
*eol = saved;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->command == TODO_FIXUP) {
|
if (item->command == TODO_FIXUP) {
|
||||||
|
@ -2072,6 +2072,7 @@ test_expect_success '--update-refs: --edit-todo with no update-ref lines' '
|
|||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success '--update-refs: check failed ref update' '
|
test_expect_success '--update-refs: check failed ref update' '
|
||||||
|
test_when_finished "test_might_fail git rebase --abort" &&
|
||||||
git checkout -B update-refs-error no-conflict-branch &&
|
git checkout -B update-refs-error no-conflict-branch &&
|
||||||
git branch -f base HEAD~4 &&
|
git branch -f base HEAD~4 &&
|
||||||
git branch -f first HEAD~3 &&
|
git branch -f first HEAD~3 &&
|
||||||
@ -2123,6 +2124,28 @@ test_expect_success '--update-refs: check failed ref update' '
|
|||||||
test_cmp expect err.trimmed
|
test_cmp expect err.trimmed
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'bad labels and refs rejected when parsing todo list' '
|
||||||
|
test_when_finished "test_might_fail git rebase --abort" &&
|
||||||
|
cat >todo <<-\EOF &&
|
||||||
|
exec >execed
|
||||||
|
label #
|
||||||
|
label :invalid
|
||||||
|
update-ref :bad
|
||||||
|
update-ref topic
|
||||||
|
EOF
|
||||||
|
rm -f execed &&
|
||||||
|
(
|
||||||
|
set_replace_editor todo &&
|
||||||
|
test_must_fail git rebase -i HEAD 2>err
|
||||||
|
) &&
|
||||||
|
grep "'\''#'\'' is not a valid label" err &&
|
||||||
|
grep "'\'':invalid'\'' is not a valid label" err &&
|
||||||
|
grep "'\'':bad'\'' is not a valid refname" err &&
|
||||||
|
grep "update-ref requires a fully qualified refname e.g. refs/heads/topic" \
|
||||||
|
err &&
|
||||||
|
test_path_is_missing execed
|
||||||
|
'
|
||||||
|
|
||||||
# This must be the last test in this file
|
# This must be the last test in this file
|
||||||
test_expect_success '$EDITOR and friends are unchanged' '
|
test_expect_success '$EDITOR and friends are unchanged' '
|
||||||
test_editor_unchanged
|
test_editor_unchanged
|
||||||
|
Reference in New Issue
Block a user