git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 4/5] add-patch: let options k and K roll over like j and J

From
René Scharfe <l.s.r@web.de>
Date
Oct 6, 2025, 17:18 UTC
Message-ID
<0ea56923-2041-43bd-8c35-cc93c3c95c70@web.de>
In-Reply-To
<xmqqh5wdrrub.fsf@gitster.g>
On 10/5/25 10:55 PM, Junio C Hamano wrote:
Show 31 quoted lines
> René Scharfe <l.s.r@web.de> writes:
> 
>> @@ -1584,7 +1591,8 @@ static int patch_update_file(struct add_p_state *s,
>>  			}
>>  		} else if (s->answer.buf[0] == 'K') {
>>  			if (permitted & ALLOW_GOTO_PREVIOUS_HUNK)
>> -				hunk_index--;
>> +				hunk_index = dec_mod(hunk_index,
>> +						     file_diff->hunk_nr);
>>  			else
>>  				err(s, _("No previous hunk"));
> 
> I was wondering if we want to always allow J and K; even when you
> have only one hunk, you can still wrap around to come back to the
> current hunk, and that we can do without any extra checking logic.
> 
> But it is also OK to require 2 or more hunks to "switch" to the
> other hunk, which is what you do with
> 
> 			if (file_diff->hunk_nr > 1) {
> 				permitted |= ALLOW_GOTO_PREVIOUS_HUNK;
> 				strbuf_addstr(&s->buf, ",K");
> 			}
> 
> to require more than 1.  But the error message "No previous hunk"
> sounds somewhat awkward.  If user accepts the circular nature of how
> we decide what "previous" is, then when we have a single hunk, the
> current hunk itself _is_ the previous hunk, but because we insist
> that there are at least 2, that interpretation would not work.  With
> "wraparound" semantics, "No other hunk(s)", would be a better way to
> give the error, no?  The same comment applies to 'J'.
OK.
Show 11 quoted lines
>>  		} else if (s->answer.buf[0] == 'J') {
> 
> This makes perfect sense, but then, after this post-context we have this:
> 
> 			if (permitted & ALLOW_GOTO_NEXT_HUNK)
> 				hunk_index++;
> 			else
> 				err(s, _("No next hunk"));
> 
> and it sticks out that the post-increment of hunk_index here is not
> using inc_mod() for symmetry.

This symmetry _is_ tantalizing. Had the call originally, removed it because it was unnecessary and didn't fit the narrative.

Show 16 quoted lines
> I am wondering if with that updated (I would not say "fixed"), if we
> can lose the "oops we overflowed so let's wrap around" belt-and-suspender
> code at the beginning of the loop, i.e.
> 
> 	for (;;) {
> 		enum {
> 			ALLOW_GOTO_PREVIOUS_HUNK = 1 << 0,
> 			...
> 			ALLOW_EDIT = 1 << 6
> 		} permitted = 0;
> 
> 		if (hunk_index >= file_diff->hunk_nr)
> 			hunk_index = 0;
> 
> or if there still are other code that rely on this "oops we
> overflowed" adjustment?
Good question, gave me the idea that a and d should roll over as well.

Other than that there's just the so-called soft_increment, which would need something like this:

diff --git a/add-patch.c b/add-patch.c
index b0389c5d5b..59a9eb586d 100644
--- a/add-patch.c
+++ b/add-patch.c
@@ -1546,8 +1546,7 @@ static int patch_update_file(struct add_p_state *s,
 		if (ch == 'y') {
 			hunk->use = USE_HUNK;
 soft_increment:
-			hunk_index = undecided_next < 0 ?
-				file_diff->hunk_nr : undecided_next;
+			hunk_index = undecided_next < 0 ? 0 : undecided_next;
 		} else if (ch == 'n') {
 			hunk->use = SKIP_HUNK;
 			goto soft_increment;

Or undecided_next could be set to 0 before the if/else cascade, then
this becomes a simple assignment and we can get rid of the goto.

Couldn't find a way to remove the back-to-square-1 check that would be
significantly better overall and thus worth the hassle, though.

René
Previous: Junio C HamanoNext: René Scharfe
Message 24 of 37 in “Broken handling of "J" hunks for "add --interactive"?”
  1. Windl, UlrichOct 2, 2025
  2. add-patch: roll over to next undecided hunkRené Scharfe, Oct 3, 2025
  3. Phillip WoodOct 3, 2025
  4. René ScharfeOct 3, 2025
  5. Phillip WoodOct 8, 2025
  6. Junio C HamanoOct 3, 2025
  7. René ScharfeOct 3, 2025
  8. Junio C HamanoOct 3, 2025
  9. Junio C HamanoOct 3, 2025
  10. Junio C HamanoOct 3, 2025
  11. 0/5 add-patch: roll over to next undecided hunkRené Scharfe, Oct 5, 2025
  12. 1/5 add-patch: improve help for options j, J, k, and KRené Scharfe, Oct 5, 2025
  13. Junio C HamanoOct 5, 2025
  14. René ScharfeOct 6, 2025
  15. Junio C HamanoOct 6, 2025
  16. Windl, UlrichOct 31, 2025
  17. Junio C HamanoNov 1, 2025
  18. Windl, UlrichNov 3, 2025
  19. 3/5 add-patch: let options y, n, j, and e roll over to next undecidedRené Scharfe, Oct 5, 2025
  20. 2/5 add-patch: document that option J rolls overRené Scharfe, Oct 5, 2025
  21. Junio C HamanoOct 5, 2025
  22. 4/5 add-patch: let options k and K roll over like j and JRené Scharfe, Oct 5, 2025
  23. Junio C HamanoOct 5, 2025
  24. René ScharfeOct 6, 2025
  25. 5/5 add-patch: reset "permitted" at loop startRené Scharfe, Oct 5, 2025
  26. 0/6 add-patch: roll over to next undecided hunkRené Scharfe, Oct 6, 2025
  27. 1/6 add-patch: improve help for options j, J, k, and KRené Scharfe, Oct 6, 2025
  28. 2/6 add-patch: document that option J rolls overRené Scharfe, Oct 6, 2025
  29. 3/6 add-patch: let options y, n, j, and e roll over to next undecidedRené Scharfe, Oct 6, 2025
  30. 4/6 add-patch: let options k and K roll over like j and JRené Scharfe, Oct 6, 2025
  31. 5/6 add-patch: let options a and d roll over like y and nRené Scharfe, Oct 6, 2025
  32. 6/6 add-patch: reset "permitted" at loop startRené Scharfe, Oct 6, 2025
  33. Windl, UlrichOct 31, 2025
  34. Junio C HamanoOct 31, 2025
  35. Junio C HamanoOct 6, 2025
  36. René ScharfeOct 6, 2025
  37. Junio C HamanoOct 6, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.