mbox series

[v2,0/4] use the pager in 'add -p'

Message ID ebcba08f-3fbb-4130-93eb-d0e62bfe0a8a@gmail.com (mailing list archive)
Headers show
Series use the pager in 'add -p' | expand

Message

Rubén Justo July 13, 2024, 4:26 p.m. UTC
Rubén Justo (4):
  add-patch: test for 'p' command
  pager: do not close fd 2 unnecessarily
  pager: introduce wait_for_pager
  add-patch: render hunks through the pager

 add-patch.c                | 18 ++++++++++++---
 pager.c                    | 45 +++++++++++++++++++++++++++++++++-----
 pager.h                    |  1 +
 t/t3701-add-interactive.sh | 44 +++++++++++++++++++++++++++++++++++++
 4 files changed, 100 insertions(+), 8 deletions(-)

Range-diff against v1:
1:  4a5b6e6815 = 1:  6b37507ddd add-patch: test for 'p' command
2:  bf8a68ac37 = 2:  5497fa020b pager: do not close fd 2 unnecessarily
3:  aabd7da4d6 = 3:  30e772cf7c pager: introduce wait_for_pager
4:  ff51cc32bd ! 4:  f7cb00b654 add-patch: render hunks through the pager
    @@ Metadata
      ## Commit message ##
         add-patch: render hunks through the pager
     
    -    Make the print command to trigger the pager when invoked using a capital
    +    Make the print command trigger the pager when invoked using a capital
         'P', to make it easier for the user to review long hunks.
     
    +    Note that if the PAGER ends unexpectedly before we've been able to send
    +    the payload, perhaps because the user is not interested in the whole
    +    thing, we might receive a SIGPIPE, which would abruptly and unexpectedly
    +    terminate the interactive session for the user.
    +
    +    Therefore, we need to ignore a possible SIGPIPE signal.  Add a test for
    +    this, in addition to the test for normal operation.
    +
    +    For the SIGPIPE test, we need to make sure that we completely fill the
    +    operating system's buffer, otherwise we might not trigger the SIGPIPE
    +    signal.  The normal size of this buffer in different OSs varies from a
    +    few KBs to 1MB.  Use a payload large enough to guarantee that we exceed
    +    this limit.
    +
         Signed-off-by: Rubén Justo <rjusto@gmail.com>
     
      ## add-patch.c ##
    @@ t/t3701-add-interactive.sh: test_expect_success 'print again the hunk' '
     +	test_cmp expect actual.trimmed
     +'
     +
    -+test_expect_success TTY 'P does not break if pager ends unexpectly' '
    ++test_expect_success TTY 'P does not break if pager ends unexpectedly' '
     +	test_when_finished "rm -f huge_file; git reset" &&
     +	printf "%2500000s" Y >huge_file &&
     +	git add -N huge_file &&
    -+	cat >expect <<-EOF &&
    -+	<GREEN>+<RESET><GREEN>22<RESET>
    -+	<GREEN>+<RESET><GREEN>23<RESET>
    -+	<GREEN>+<RESET><GREEN>24<RESET>
    -+	 30<RESET>
    -+	 40<RESET>
    -+	 50<RESET>
    -+	<BOLD;BLUE>(1/1) Stage this hunk [y,n,q,a,d,s,e,p,?]? <RESET>
    -+	EOF
    -+	test_write_lines P |
    -+	(
    -+		GIT_PAGER="head -1" &&
    -+		export GIT_PAGER &&
    -+		test_terminal git add -p >actual
    -+	) &&
    -+	tail -n 7 <actual | test_decode_color >actual.trimmed &&
    -+	test_cmp expect actual.trimmed
    ++	test_write_lines P q | GIT_PAGER="head -c 1" test_terminal git add -p >actual
     +'
     +
      test_expect_success 'split hunk "add -p (edit)"' '

Comments

Junio C Hamano July 13, 2024, 5:08 p.m. UTC | #1
Rubén Justo <rjusto@gmail.com> writes:

>     -+	test_write_lines P |
>     -+	(
>     -+		GIT_PAGER="head -1" &&
>     -+		export GIT_PAGER &&
>     -+		test_terminal git add -p >actual
>     -+	) &&
>     -+	tail -n 7 <actual | test_decode_color >actual.trimmed &&
>     -+	test_cmp expect actual.trimmed
>     ++	test_write_lines P q | GIT_PAGER="head -c 1" test_terminal git add -p >actual
>      +'

"make test" has this to say:

t3701-add-interactive.sh:619: error: head -c is not portable (use test_copy_bytes BYTES <file >out): test_write_lines P q | GIT_PAGER="head -c 1" test_terminal git add -p >actual
gmake[1]: *** [Makefile:132: test-lint-shell-syntax] Error 1
Rubén Justo July 13, 2024, 11:21 p.m. UTC | #2
On Sat, Jul 13, 2024 at 10:08:22AM -0700, Junio C Hamano wrote:
> Rubén Justo <rjusto@gmail.com> writes:
> 
> >     -+	test_write_lines P |
> >     -+	(
> >     -+		GIT_PAGER="head -1" &&
> >     -+		export GIT_PAGER &&
> >     -+		test_terminal git add -p >actual
> >     -+	) &&
> >     -+	tail -n 7 <actual | test_decode_color >actual.trimmed &&
> >     -+	test_cmp expect actual.trimmed
> >     ++	test_write_lines P q | GIT_PAGER="head -c 1" test_terminal git add -p >actual
> >      +'
> 
> "make test" has this to say:
> 
> t3701-add-interactive.sh:619: error: head -c is not portable (use test_copy_bytes BYTES <file >out): test_write_lines P q | GIT_PAGER="head -c 1" test_terminal git add -p >actual
> gmake[1]: *** [Makefile:132: test-lint-shell-syntax] Error 1

Ouch. I'll fix it.  I think I'll go back to "head -1".  But I'll wait to
hear comments about the change in the message.
Junio C Hamano July 14, 2024, 1:18 a.m. UTC | #3
Rubén Justo <rjusto@gmail.com> writes:

> Ouch. I'll fix it.  I think I'll go back to "head -1".

I think "head -<n>" is deprecated, too.  

Say "head -n 1" probably, if you really wanted to take the first
line and quit.