Merge branch 'ah/sequencer-rewrite-todo-fix'

When the user edits "rebase -i" todo file so that it starts with a
"fixup", which would make it invalid, the command truncated the
rest of the file before giving an error and returning the control
back to the user.  Stop truncating to make it easier to correct
such a malformed todo file.

* ah/sequencer-rewrite-todo-fix:
  sequencer: finish parsing the todo list despite an invalid first line
This commit is contained in:
Junio C Hamano 2023-08-02 09:37:23 -07:00
commit 8bfb359844
2 changed files with 27 additions and 1 deletions

View file

@ -2702,7 +2702,7 @@ int todo_list_parse_insn_buffer(struct repository *r, char *buf,
if (fixup_okay)
; /* do nothing */
else if (is_fixup(item->command))
return error(_("cannot '%s' without a previous commit"),
res = error(_("cannot '%s' without a previous commit"),
command_to_string(item->command));
else if (!is_noop(item->command))
fixup_okay = 1;

View file

@ -1596,6 +1596,32 @@ test_expect_success 'static check of bad command' '
test C = $(git cat-file commit HEAD^ | sed -ne \$p)
'
test_expect_success 'the first command cannot be a fixup' '
rebase_setup_and_clean fixup-first &&
cat >orig <<-EOF &&
fixup $(git log -1 --format="%h %s" B)
pick $(git log -1 --format="%h %s" C)
EOF
(
set_replace_editor orig &&
test_must_fail git rebase -i A 2>actual
) &&
grep "cannot .fixup. without a previous commit" actual &&
grep "You can fix this with .git rebase --edit-todo.." actual &&
# verify that the todo list has not been truncated
grep -v "^#" .git/rebase-merge/git-rebase-todo >actual &&
test_cmp orig actual &&
test_must_fail git rebase --edit-todo 2>actual &&
grep "cannot .fixup. without a previous commit" actual &&
grep "You can fix this with .git rebase --edit-todo.." actual &&
# verify that the todo list has not been truncated
grep -v "^#" .git/rebase-merge/git-rebase-todo >actual &&
test_cmp orig actual
'
test_expect_success 'tabs and spaces are accepted in the todolist' '
rebase_setup_and_clean indented-comment &&
write_script add-indent.sh <<-\EOF &&