Thread (20 messages) 20 messages, 3 authors, 2025-10-31

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" &&
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help