1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-28 04:36:10 +02:00

Merge branch 'rj/add-p-explicit-reshow'

"git add -p" and other "interactive hunk selection" UI has learned to
skip showing the hunk immediately after it has already been shown, and
an additional action to explicitly ask to reshow the current hunk.

* rj/add-p-explicit-reshow:
  add-patch: do not print hunks repeatedly
  add-patch: introduce 'p' in interactive-patch
This commit is contained in:
Junio C Hamano 2024-04-09 14:31:44 -07:00
commit 989bf45394
3 changed files with 27 additions and 17 deletions

View File

@ -348,6 +348,7 @@ patch::
K - leave this hunk undecided, see previous hunk K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks s - split the current hunk into smaller hunks
e - manually edit the current hunk e - manually edit the current hunk
p - print the current hunk
? - print help ? - print help
+ +
After deciding the fate for all hunks, if there is any hunk After deciding the fate for all hunks, if there is any hunk

View File

@ -1388,13 +1388,14 @@ N_("j - leave this hunk undecided, see next undecided hunk\n"
"/ - search for a hunk matching the given regex\n" "/ - search for a hunk matching the given regex\n"
"s - split the current hunk into smaller hunks\n" "s - split the current hunk into smaller hunks\n"
"e - manually edit the current hunk\n" "e - manually edit the current hunk\n"
"p - print the current hunk\n"
"? - print help\n"); "? - print help\n");
static int patch_update_file(struct add_p_state *s, static int patch_update_file(struct add_p_state *s,
struct file_diff *file_diff) struct file_diff *file_diff)
{ {
size_t hunk_index = 0; size_t hunk_index = 0;
ssize_t i, undecided_previous, undecided_next; ssize_t i, undecided_previous, undecided_next, rendered_hunk_index = -1;
struct hunk *hunk; struct hunk *hunk;
char ch; char ch;
struct child_process cp = CHILD_PROCESS_INIT; struct child_process cp = CHILD_PROCESS_INIT;
@ -1447,8 +1448,11 @@ static int patch_update_file(struct add_p_state *s,
strbuf_reset(&s->buf); strbuf_reset(&s->buf);
if (file_diff->hunk_nr) { if (file_diff->hunk_nr) {
render_hunk(s, hunk, 0, colored, &s->buf); if (rendered_hunk_index != hunk_index) {
fputs(s->buf.buf, stdout); render_hunk(s, hunk, 0, colored, &s->buf);
fputs(s->buf.buf, stdout);
rendered_hunk_index = hunk_index;
}
strbuf_reset(&s->buf); strbuf_reset(&s->buf);
if (undecided_previous >= 0) { if (undecided_previous >= 0) {
@ -1480,6 +1484,7 @@ static int patch_update_file(struct add_p_state *s,
permitted |= ALLOW_EDIT; permitted |= ALLOW_EDIT;
strbuf_addstr(&s->buf, ",e"); strbuf_addstr(&s->buf, ",e");
} }
strbuf_addstr(&s->buf, ",p");
} }
if (file_diff->deleted) if (file_diff->deleted)
prompt_mode_type = PROMPT_DELETION; prompt_mode_type = PROMPT_DELETION;
@ -1644,13 +1649,15 @@ static int patch_update_file(struct add_p_state *s,
hunk_index = i; hunk_index = i;
} else if (s->answer.buf[0] == 's') { } else if (s->answer.buf[0] == 's') {
size_t splittable_into = hunk->splittable_into; size_t splittable_into = hunk->splittable_into;
if (!(permitted & ALLOW_SPLIT)) if (!(permitted & ALLOW_SPLIT)) {
err(s, _("Sorry, cannot split this hunk")); err(s, _("Sorry, cannot split this hunk"));
else if (!split_hunk(s, file_diff, } else if (!split_hunk(s, file_diff,
hunk - file_diff->hunk)) hunk - file_diff->hunk)) {
color_fprintf_ln(stdout, s->s.header_color, color_fprintf_ln(stdout, s->s.header_color,
_("Split into %d hunks."), _("Split into %d hunks."),
(int)splittable_into); (int)splittable_into);
rendered_hunk_index = -1;
}
} else if (s->answer.buf[0] == 'e') { } else if (s->answer.buf[0] == 'e') {
if (!(permitted & ALLOW_EDIT)) if (!(permitted & ALLOW_EDIT))
err(s, _("Sorry, cannot edit this hunk")); err(s, _("Sorry, cannot edit this hunk"));
@ -1658,6 +1665,8 @@ static int patch_update_file(struct add_p_state *s,
hunk->use = USE_HUNK; hunk->use = USE_HUNK;
goto soft_increment; goto soft_increment;
} }
} else if (s->answer.buf[0] == 'p') {
rendered_hunk_index = -1;
} else { } else {
const char *p = _(help_patch_remainder), *eol = p; const char *p = _(help_patch_remainder), *eol = p;

View File

@ -325,9 +325,9 @@ test_expect_success 'different prompts for mode change/deleted' '
git -c core.filemode=true add -p >actual && git -c core.filemode=true add -p >actual &&
sed -n "s/^\(([0-9/]*) Stage .*?\).*/\1/p" actual >actual.filtered && sed -n "s/^\(([0-9/]*) Stage .*?\).*/\1/p" actual >actual.filtered &&
cat >expect <<-\EOF && cat >expect <<-\EOF &&
(1/1) Stage deletion [y,n,q,a,d,?]? (1/1) Stage deletion [y,n,q,a,d,p,?]?
(1/2) Stage mode change [y,n,q,a,d,j,J,g,/,?]? (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,?]? (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]?
EOF EOF
test_cmp expect actual.filtered test_cmp expect actual.filtered
' '
@ -514,13 +514,13 @@ test_expect_success 'split hunk setup' '
test_expect_success 'goto hunk' ' test_expect_success 'goto hunk' '
test_when_finished "git reset" && test_when_finished "git reset" &&
tr _ " " >expect <<-EOF && tr _ " " >expect <<-EOF &&
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? + 1: -1,2 +1,3 +15 (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? + 1: -1,2 +1,3 +15
_ 2: -2,4 +3,8 +21 _ 2: -2,4 +3,8 +21
go to which hunk? @@ -1,2 +1,3 @@ go to which hunk? @@ -1,2 +1,3 @@
_10 _10
+15 +15
_20 _20
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?_ (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]?_
EOF EOF
test_write_lines s y g 1 | git add -p >actual && test_write_lines s y g 1 | git add -p >actual &&
tail -n 7 <actual >actual.trimmed && tail -n 7 <actual >actual.trimmed &&
@ -530,11 +530,11 @@ test_expect_success 'goto hunk' '
test_expect_success 'navigate to hunk via regex' ' test_expect_success 'navigate to hunk via regex' '
test_when_finished "git reset" && test_when_finished "git reset" &&
tr _ " " >expect <<-EOF && tr _ " " >expect <<-EOF &&
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? @@ -1,2 +1,3 @@ (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? @@ -1,2 +1,3 @@
_10 _10
+15 +15
_20 _20
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?_ (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]?_
EOF EOF
test_write_lines s y /1,2 | git add -p >actual && test_write_lines s y /1,2 | git add -p >actual &&
tail -n 5 <actual >actual.trimmed && tail -n 5 <actual >actual.trimmed &&
@ -715,21 +715,21 @@ test_expect_success 'colors can be overridden' '
<BLUE>+<RESET><BLUE>new<RESET> <BLUE>+<RESET><BLUE>new<RESET>
<CYAN> more-context<RESET> <CYAN> more-context<RESET>
<BLUE>+<RESET><BLUE>another-one<RESET> <BLUE>+<RESET><BLUE>another-one<RESET>
<YELLOW>(1/1) Stage this hunk [y,n,q,a,d,s,e,?]? <RESET><BOLD>Split into 2 hunks.<RESET> <YELLOW>(1/1) Stage this hunk [y,n,q,a,d,s,e,p,?]? <RESET><BOLD>Split into 2 hunks.<RESET>
<MAGENTA>@@ -1,3 +1,3 @@<RESET> <MAGENTA>@@ -1,3 +1,3 @@<RESET>
<CYAN> context<RESET> <CYAN> context<RESET>
<BOLD>-old<RESET> <BOLD>-old<RESET>
<BLUE>+<RESET><BLUE>new<RESET> <BLUE>+<RESET><BLUE>new<RESET>
<CYAN> more-context<RESET> <CYAN> more-context<RESET>
<YELLOW>(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? <RESET><MAGENTA>@@ -3 +3,2 @@<RESET> <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> <CYAN> more-context<RESET>
<BLUE>+<RESET><BLUE>another-one<RESET> <BLUE>+<RESET><BLUE>another-one<RESET>
<YELLOW>(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? <RESET><MAGENTA>@@ -1,3 +1,3 @@<RESET> <YELLOW>(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? <RESET><MAGENTA>@@ -1,3 +1,3 @@<RESET>
<CYAN> context<RESET> <CYAN> context<RESET>
<BOLD>-old<RESET> <BOLD>-old<RESET>
<BLUE>+new<RESET> <BLUE>+new<RESET>
<CYAN> more-context<RESET> <CYAN> more-context<RESET>
<YELLOW>(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? <RESET> <YELLOW>(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? <RESET>
EOF EOF
test_cmp expect actual test_cmp expect actual
' '