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

Re: [PATCH v2 2/5] add-patch: document that option J rolls over

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 5, 2025, 21:30 UTC
Message-ID
<xmqq7bx9rq7w.fsf@gitster.g>
In-Reply-To
<187aac4d-18b6-41df-a181-7f42e3cbc0d4@web.de>
René Scharfe <l.s.r@web.de> writes:
> The variable "permitted" is only not reset after moving to a different
"only not" -> "not".
Show 103 quoted lines
> hunk, so it only accumulates permission and doesn't necessarily reflect
> those of the current hunk.  This may be a bug, but is actually useful
> with the option J, which can be used at the last hunk to roll over to
> the first hunk.  Make this particular behavior official.
>
> Suggested-by: Junio C Hamano <gitster@pobox.com>
> Signed-off-by: René Scharfe <l.s.r@web.de>
> ---
>  Documentation/git-add.adoc |  2 +-
>  add-patch.c                |  4 ++--
>  t/t3701-add-interactive.sh | 18 ++++++++++++++----
>  3 files changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/Documentation/git-add.adoc b/Documentation/git-add.adoc
> index 3266ccf105..5c05a3a7f9 100644
> --- a/Documentation/git-add.adoc
> +++ b/Documentation/git-add.adoc
> @@ -343,7 +343,7 @@ patch::
>         g - select a hunk to go to
>         / - search for a hunk matching the given regex
>         j - go to the next undecided hunk
> -       J - go to the next hunk
> +       J - go to the next hunk, roll over at the bottom
>         k - go to the previous undecided hunk
>         K - go to the previous hunk
>         s - split the current hunk into smaller hunks
> diff --git a/add-patch.c b/add-patch.c
> index 912266a3f8..bef2ba7a25 100644
> --- a/add-patch.c
> +++ b/add-patch.c
> @@ -1398,7 +1398,7 @@ static size_t display_hunks(struct add_p_state *s,
>  
>  static const char help_patch_remainder[] =
>  N_("j - go to the next undecided hunk\n"
> -   "J - go to the next hunk\n"
> +   "J - go to the next hunk, roll over at the bottom\n"
>     "k - go to the previous undecided hunk\n"
>     "K - go to the previous hunk\n"
>     "g - select a hunk to go to\n"
> @@ -1493,7 +1493,7 @@ static int patch_update_file(struct add_p_state *s,
>  				permitted |= ALLOW_GOTO_NEXT_UNDECIDED_HUNK;
>  				strbuf_addstr(&s->buf, ",j");
>  			}
> -			if (hunk_index + 1 < file_diff->hunk_nr) {
> +			if (file_diff->hunk_nr > 1) {
>  				permitted |= ALLOW_GOTO_NEXT_HUNK;
>  				strbuf_addstr(&s->buf, ",J");
>  			}
> diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
> index d9fe289a7a..d5d2e120ab 100755
> --- a/t/t3701-add-interactive.sh
> +++ b/t/t3701-add-interactive.sh
> @@ -334,7 +334,7 @@ test_expect_success 'different prompts for mode change/deleted' '
>  	cat >expect <<-\EOF &&
>  	(1/1) Stage deletion [y,n,q,a,d,p,?]?
>  	(1/2) Stage mode change [y,n,q,a,d,j,J,g,/,p,?]?
> -	(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]?
> +	(2/2) Stage this hunk [y,n,q,a,d,K,J,g,/,e,p,?]?
>  	EOF
>  	test_cmp expect actual.filtered
>  '
> @@ -521,7 +521,7 @@ test_expect_success 'split hunk setup' '
>  test_expect_success 'goto hunk 1 with "g 1"' '
>  	test_when_finished "git reset" &&
>  	tr _ " " >expect <<-EOF &&
> -	(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? + 1:  -1,2 +1,3          +15
> +	(2/2) Stage this hunk [y,n,q,a,d,K,J,g,/,e,p,?]? + 1:  -1,2 +1,3          +15
>  	_ 2:  -2,4 +3,8          +21
>  	go to which hunk? @@ -1,2 +1,3 @@
>  	_10
> @@ -550,7 +550,7 @@ test_expect_success 'goto hunk 1 with "g1"' '
>  test_expect_success 'navigate to hunk via regex /pattern' '
>  	test_when_finished "git reset" &&
>  	tr _ " " >expect <<-EOF &&
> -	(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? @@ -1,2 +1,3 @@
> +	(2/2) Stage this hunk [y,n,q,a,d,K,J,g,/,e,p,?]? @@ -1,2 +1,3 @@
>  	_10
>  	+15
>  	_20
> @@ -805,7 +805,7 @@ test_expect_success 'colors can be overridden' '
>  	<YELLOW>(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? <RESET><MAGENTA>@@ -3 +3,2 @@<RESET>
>  	<CYAN> more-context<RESET>
>  	<BLUE>+<RESET><BLUE>another-one<RESET>
> -	<YELLOW>(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? <RESET><MAGENTA>@@ -1,3 +1,3 @@<RESET>
> +	<YELLOW>(2/2) Stage this hunk [y,n,q,a,d,K,J,g,/,e,p,?]? <RESET><MAGENTA>@@ -1,3 +1,3 @@<RESET>
>  	<CYAN> context<RESET>
>  	<BOLD>-old<RESET>
>  	<BLUE>+new<RESET>
> @@ -1354,4 +1354,14 @@ do
>  	'
>  done
>  
> +test_expect_success 'option J rolls over' '
> +	test_write_lines a b c d e f g h i >file &&
> +	git add file &&
> +	test_write_lines X b c d e f g h X >file &&
> +	test_write_lines J J q | git add -p >out &&
> +	test_write_lines 1 2 1 >expect &&
> +	sed -n -e "s-/.*--" -e "s/^(//p" <out >actual &&
> +	test_cmp expect actual
> +'
> +
>  test_done
Previous: René ScharfeNext: René Scharfe
Message 21 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.