From: Junio C Hamano Date: Sun, 05 Oct 2025 21:30:43 GMT Subject: Re: [PATCH v2 2/5] add-patch: document that option J rolls over Message-ID: In-Reply-To: <187aac4d-18b6-41df-a181-7f42e3cbc0d4@web.de> René Scharfe writes: > The variable "permitted" is only not reset after moving to a different "only not" -> "not". > 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 > Signed-off-by: René Scharfe > --- > 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' ' > (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? @@ -3 +3,2 @@ > more-context > +another-one > - (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? @@ -1,3 +1,3 @@ > + (2/2) Stage this hunk [y,n,q,a,d,K,J,g,/,e,p,?]? @@ -1,3 +1,3 @@ > context > -old > +new > @@ -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" actual && > + test_cmp expect actual > +' > + > test_done