git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] sequencer: finish parsing the todo list despite an invalid first line
@ 2023-07-19 14:43 Alex Henrie
  2023-07-19 21:32 ` Junio C Hamano
                   ` (2 more replies)
  0 siblings, 3 replies; 23+ messages in thread
From: Alex Henrie @ 2023-07-19 14:43 UTC (permalink / raw)
  To: git, alban.gruin, gitster; +Cc: Alex Henrie

ddb81e5072 (rebase-interactive: use todo_list_write_to_file() in
edit_todo_list(), 2019-03-05) made edit_todo_list more efficient by
replacing transform_todo_file with todo_list_parse_insn_buffer.
Unfortunately, that innocuous change caused a regression because
todo_list_parse_insn_buffer would stop parsing after encountering an
invalid 'fixup' line. If the user accidentally made the first line a
'fixup' and tried to recover from their mistake with `git rebase
--edit-todo`, all of the commands after the first would be lost.

To avoid throwing away important parts of the todo list, change
todo_list_parse_insn_buffer to keep going and not return early on error.

Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
---
 sequencer.c                   |  2 +-
 t/t3404-rebase-interactive.sh | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/sequencer.c b/sequencer.c
index cc9821ece2..adc9cfb4df 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -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;
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index ff0afad63e..d2801ffee4 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -1596,6 +1596,25 @@ 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' '
+	# When using `git rebase --edit-todo` to recover from this error, ensure
+	# that none of the original todo list is lost
+	rebase_setup_and_clean fixup-first &&
+	(
+		set_fake_editor &&
+		test_must_fail env FAKE_LINES="fixup 1 2 3 4 5" \
+			       git rebase -i --root 2>actual &&
+		test_i18ngrep "cannot .fixup. without a previous commit" \
+				actual &&
+		test_i18ngrep "You can fix this with .git rebase --edit-todo.." \
+				actual &&
+		grep -v "^#" .git/rebase-merge/git-rebase-todo >orig &&
+		test_must_fail git rebase --edit-todo &&
+		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 &&
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2023-07-24 20:08 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-19 14:43 [PATCH] sequencer: finish parsing the todo list despite an invalid first line Alex Henrie
2023-07-19 21:32 ` Junio C Hamano
2023-07-20  9:42 ` Phillip Wood
2023-07-20 22:37   ` Alex Henrie
2023-07-21  9:31     ` Phillip Wood
2023-07-21 13:08       ` Phillip Wood
2023-07-21 15:21         ` Junio C Hamano
2023-07-21  5:38 ` [PATCH v2 0/1] " Alex Henrie
2023-07-21  5:38   ` [PATCH v2 1/1] " Alex Henrie
2023-07-21  5:58   ` [PATCH v3 0/1] " Alex Henrie
2023-07-21  5:58     ` [PATCH v3 1/1] " Alex Henrie
2023-07-21  6:07     ` [PATCH v4 0/1] " Alex Henrie
2023-07-21  6:07       ` [PATCH v4 1/1] " Alex Henrie
2023-07-21 13:13       ` [PATCH v4 0/1] " Phillip Wood
2023-07-22 21:28       ` [PATCH v5 " Alex Henrie
2023-07-22 21:28         ` [PATCH v5 1/1] " Alex Henrie
2023-07-24 10:02           ` Phillip Wood
2023-07-24 15:26             ` Alex Henrie
2023-07-24 16:00               ` Phillip Wood
2023-07-24 16:40           ` Junio C Hamano
2023-07-24 17:39             ` Alex Henrie
2023-07-24 18:30             ` Junio C Hamano
2023-07-24 20:08               ` Alex Henrie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).