Re: [PATCH] add-patch: roll over to next undecided hunk
From: Phillip Wood <hidden>
Date: 2025-10-03 13:41:40
Hi René On 03/10/2025 13:16, René Scharfe wrote:
git add --patch presents diff hunks one after the other, asking whether to add them. If we mark some as undecided, e.g. with J, then it will start over after reaching the last hunk. It always starts over at the very first hunk, though, even if we already decided on it. Skip decided hunks when rolling over instead.
Nice
quoted hunk ↗ jump to hunk
@@ -1436,8 +1436,15 @@ static int patch_update_file(struct add_p_state *s, render_diff_header(s, file_diff, colored, &s->buf); fputs(s->buf.buf, stdout); for (;;) { - if (hunk_index >= file_diff->hunk_nr) + if (hunk_index >= file_diff->hunk_nr) { hunk_index = 0; + for (i = 0; i < file_diff->hunk_nr; i++) { + if (file_diff->hunk[i].use == UNDECIDED_HUNK) { + hunk_index = i; + break; + } + } + } hunk = file_diff->hunk_nr ? file_diff->hunk + hunk_index
If there were no undecided hunks then this will be out of bounds because hunk_index >= file_diff->hunk_nr. Are we absolutely certain that we cannot reach this point without at least one hunk being undecided?
+test_expect_success 'roll over to next undecided (1)' ' + test_write_lines a b c d e f g h i j k l m n o p q >file && + git add file && + test_write_lines X b c d e f g h X j k l m n o p X >file && + test_write_lines J y y q | git add -p >actual && + test_write_lines 1 2 3 1 >expect && + sed -ne "s-/.*--" -e "s-^(--p" <actual >hunks && + test_cmp expect hunks +'
I'm not sure what this first test adds, the one below checks that we find the first undecided hunk which seems to be the important thing to check. Thanks Phillip
+test_expect_success 'roll over to next undecided (2)' ' + test_write_lines a b c d e f g h i j k l m n o p q >file && + git add file && + test_write_lines X b c d e f g h X j k l m n o p X >file && + test_write_lines y J y q | git add -p >actual && + test_write_lines 1 2 3 2 >expect && + sed -ne "s-/.*--" -e "s-^(--p" <actual >hunks && + test_cmp expect hunks +' + test_expect_success 'set up base for -p color tests' ' echo commit >file && git commit -am "commit state" &&