From: Phillip Wood Date: Fri, 03 Oct 2025 13:41:35 GMT Subject: Re: [PATCH] add-patch: roll over to next undecided hunk Message-ID: <8fdfb03a-6bbc-46a0-a8fe-9ad75aba555a@gmail.com> In-Reply-To: <76665b6f-cb92-4694-bc89-5eb21197df34@web.de> 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 > @@ -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" 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" hunks && > + test_cmp expect hunks > +' > + > test_expect_success 'set up base for -p color tests' ' > echo commit >file && > git commit -am "commit state" &&