All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
	"Vincent Lefevre" <vincent@vinc17.net>,
	"Chris Torek" <chris.torek@gmail.com>,
	"Denton Liu" <liu.denton@gmail.com>,
	"Jeff Hostetler" <jeffhost@microsoft.com>,
	"Johannes Sixt" <j6t@kdbg.org>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Subject: [PATCH v2 0/5] pager: test for exit behavior & trace2 bug fix
Date: Tue,  2 Feb 2021 02:59:56 +0100	[thread overview]
Message-ID: <20210202020001.31601-1-avarab@gmail.com> (raw)
In-Reply-To: <20210201144921.8664-1-avarab@gmail.com>

A v2 with better tests and some misc adjustments. As noted in v1 1-4
are just adding better test coverage for behavior we already have, and
fixing a small bug in trace2 output.

The 5/5 is a WIP start at respecting the pager's exit code and
ignoring the SIGPIPE. Junio had a suggestion to do that in
<xmqq8s87ld8y.fsf@gitster.c.googlers.com>, but as seen & noted there
it's quite a bit more complex when we have to deal with the atexit
sibling function.

Ævar Arnfjörð Bjarmason (5):
  pager: refactor wait_for_pager() function
  pager: test for exit code with and without SIGPIPE
  run-command: add braces for "if" block in wait_or_whine()
  pager: properly log pager exit code when signalled
  WIP pager: respect exit code of pager over SIGPIPE

 pager.c          |  24 +++++----
 run-command.c    |   7 ++-
 t/t7006-pager.sh | 130 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 148 insertions(+), 13 deletions(-)

Range-diff:
2:  6509ae44751 = 1:  aab89cc8619 pager: refactor wait_for_pager() function
1:  cba284dcf55 ! 2:  edf513bb174 pager: test for exit code
    @@ Metadata
     Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
     
      ## Commit message ##
    -    pager: test for exit code
    +    pager: test for exit code with and without SIGPIPE
     
         Add tests for how git behaves when the pager itself exits with
         non-zero, as well as for us exiting with 141 when we're killed with
    @@ Commit message
         current behavior.
     
         This test construct is stolen from 7559a1be8a0 (unblock and unignore
    -    SIGPIPE, 2014-09-18).
    +    SIGPIPE, 2014-09-18). The reason not to make the test itself depend on
    +    the MINGW prerequisite is to make a subsequent commit easier to read.
     
         1. https://lore.kernel.org/git/87o8h4omqa.fsf@evledraar.gmail.com/
     
    @@ t/t7006-pager.sh: test_expect_success TTY 'git tag with auto-columns ' '
      	test_cmp expect actual
      '
      
    -+test_expect_success TTY,!MINGW 'git returns SIGPIPE on early pager exit' '
    ++test_expect_success TTY 'git returns SIGPIPE on early pager exit' '
     +	test_when_finished "rm pager-used" &&
     +	test_config core.pager ">pager-used; head -n 1; exit 0" &&
     +
    -+	OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    -+	test_match_signal 13 "$OUT" &&
    ++	if test_have_prereq !MINGW
    ++	then
    ++		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    ++		test_match_signal 13 "$OUT"
    ++	else
    ++		test_terminal git log
    ++	fi &&
     +	test_path_is_file pager-used
     +'
     +
    -+test_expect_success TTY,!MINGW 'git returns SIGPIPE on early pager non-zero exit' '
    ++test_expect_success TTY 'git returns SIGPIPE on early pager non-zero exit' '
     +	test_when_finished "rm pager-used" &&
     +	test_config core.pager ">pager-used; head -n 1; exit 1" &&
     +
    -+	OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    -+	test_match_signal 13 "$OUT" &&
    ++	if test_have_prereq !MINGW
    ++	then
    ++		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    ++		test_match_signal 13 "$OUT"
    ++	else
    ++		test_terminal git log
    ++	fi &&
     +	test_path_is_file pager-used
     +'
     +
    -+test_expect_success TTY,!MINGW 'git discards pager non-zero exit' '
    ++test_expect_success TTY 'git discards pager non-zero exit without SIGPIPE' '
     +	test_when_finished "rm pager-used" &&
     +	test_config core.pager "wc >pager-used; exit 1" &&
     +
    -+	OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    -+	test "$OUT" -eq 0 &&
    ++	if test_have_prereq !MINGW
    ++	then
    ++		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    ++		test "$OUT" -eq 0
    ++	else
    ++		test_terminal git log
    ++	fi &&
    ++	test_path_is_file pager-used
    ++'
    ++
    ++test_expect_success TTY 'git discards nonexisting pager without SIGPIPE' '
    ++	test_when_finished "rm pager-used" &&
    ++	test_config core.pager "wc >pager-used; does-not-exist" &&
    ++
    ++	if test_have_prereq !MINGW
    ++	then
    ++		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    ++		test "$OUT" -eq 0
    ++	else
    ++		test_terminal git log
    ++	fi &&
    ++	test_path_is_file pager-used
    ++'
    ++
    ++test_expect_success TTY 'git attempts to page to nonexisting pager command, gets SIGPIPE' '
    ++	test_config core.pager "does-not-exist" &&
    ++
    ++	if test_have_prereq !MINGW
    ++	then
    ++		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    ++		test_match_signal 13 "$OUT"
    ++	else
    ++		test_terminal git log
    ++	fi
    ++'
    ++
    ++test_expect_success TTY 'git returns SIGPIPE on propagated signals from pager' '
    ++	test_when_finished "rm pager-used" &&
    ++	test_config core.pager ">pager-used; test-tool sigchain" &&
    ++
    ++	if test_have_prereq !MINGW
    ++	then
    ++		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    ++		test_match_signal 13 "$OUT"
    ++	else
    ++		test_terminal git log
    ++	fi &&
     +	test_path_is_file pager-used
     +'
     +
-:  ----------- > 3:  0e4cbf80fe1 run-command: add braces for "if" block in wait_or_whine()
3:  d5db936bd11 ! 4:  527f69cf581 pager: properly log pager exit code when signalled
    @@ Commit message
         The wait_or_whine() is only called with a true "in_signal" from from
         finish_command_in_signal(), which in turn is only used in pager.c.
     
    -    I'm not quite sure about that BUG() case. Can we have a true in_signal
    -    and not have a true WIFEXITED(status)? I haven't been able to think of
    -    a test case for it.
    +    The "in_signal && !WIFEXITED(status)" case is not covered by
    +    tests. Let's log the default -1 in that case for good measure.
     
         1. The incorrect logging of the exit code in was seemingly copy/pasted
            into finish_command_in_signal() in ee4512ed481 (trace2: create new
    @@ Commit message
     
      ## run-command.c ##
     @@ run-command.c: static int wait_or_whine(pid_t pid, const char *argv0, int in_signal)
    - 
      	while ((waiting = waitpid(pid, &status, 0)) < 0 && errno == EINTR)
      		;	/* nothing */
    --	if (in_signal)
    + 	if (in_signal) {
     -		return 0;
    -+	if (in_signal && WIFEXITED(status))
    -+		return WEXITSTATUS(status);
    -+	if (in_signal) {
    -+		BUG("was not expecting waitpid() status %d", status);
    -+		return -1;
    -+	}
    ++		if (WIFEXITED(status))
    ++			code = WEXITSTATUS(status);
    ++		return code;
    + 	}
      
      	if (waiting < 0) {
    - 		failed_errno = errno;
     
      ## t/t7006-pager.sh ##
     @@ t/t7006-pager.sh: test_expect_success TTY 'git tag with auto-columns ' '
      	test_cmp expect actual
      '
      
    --test_expect_success TTY,!MINGW 'git returns SIGPIPE on early pager exit' '
    -+test_expect_success TTY 'git returns SIGPIPE on early pager exit' '
    - 	test_when_finished "rm pager-used" &&
    ++test_expect_success 'setup trace2' '
    ++	GIT_TRACE2_BRIEF=1 &&
    ++	export GIT_TRACE2_BRIEF
    ++'
    ++
    + test_expect_success TTY 'git returns SIGPIPE on early pager exit' '
    +-	test_when_finished "rm pager-used" &&
    ++	test_when_finished "rm pager-used trace.normal" &&
      	test_config core.pager ">pager-used; head -n 1; exit 0" &&
     +	GIT_TRACE2="$(pwd)/trace.normal" &&
     +	export GIT_TRACE2 &&
     +	test_when_finished "unset GIT_TRACE2" &&
      
    --	OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    --	test_match_signal 13 "$OUT" &&
    -+	if test_have_prereq !MINGW
    -+	then
    -+		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    -+		test_match_signal 13 "$OUT"
    -+	else
    -+		test_terminal git log
    -+	fi &&
    -+	grep "child_exit.* code:0 " trace.normal &&
    + 	if test_have_prereq !MINGW
    + 	then
    +@@ t/t7006-pager.sh: test_expect_success TTY 'git returns SIGPIPE on early pager exit' '
    + 	else
    + 		test_terminal git log
    + 	fi &&
    ++
    ++	grep child_exit trace.normal >child-exits &&
    ++	test_line_count = 1 child-exits &&
    ++	grep " code:0 " child-exits &&
      	test_path_is_file pager-used
      '
      
    --test_expect_success TTY,!MINGW 'git returns SIGPIPE on early pager non-zero exit' '
    -+test_expect_success TTY 'git returns SIGPIPE on early pager non-zero exit' '
    - 	test_when_finished "rm pager-used" &&
    + test_expect_success TTY 'git returns SIGPIPE on early pager non-zero exit' '
    +-	test_when_finished "rm pager-used" &&
    ++	test_when_finished "rm pager-used trace.normal" &&
      	test_config core.pager ">pager-used; head -n 1; exit 1" &&
     +	GIT_TRACE2="$(pwd)/trace.normal" &&
     +	export GIT_TRACE2 &&
     +	test_when_finished "unset GIT_TRACE2" &&
      
    --	OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    --	test_match_signal 13 "$OUT" &&
    -+	if test_have_prereq !MINGW
    -+	then
    -+		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    -+		test_match_signal 13 "$OUT"
    -+	else
    -+		test_terminal git log
    -+	fi &&
    -+	grep "child_exit.* code:1 " trace.normal &&
    + 	if test_have_prereq !MINGW
    + 	then
    +@@ t/t7006-pager.sh: test_expect_success TTY 'git returns SIGPIPE on early pager non-zero exit' '
    + 	else
    + 		test_terminal git log
    + 	fi &&
    ++
    ++	grep child_exit trace.normal >child-exits &&
    ++	test_line_count = 1 child-exits &&
    ++	grep " code:1 " child-exits &&
      	test_path_is_file pager-used
      '
      
    --test_expect_success TTY,!MINGW 'git discards pager non-zero exit' '
    -+test_expect_success TTY 'git discards pager non-zero exit' '
    - 	test_when_finished "rm pager-used" &&
    + test_expect_success TTY 'git discards pager non-zero exit without SIGPIPE' '
    +-	test_when_finished "rm pager-used" &&
    ++	test_when_finished "rm pager-used trace.normal" &&
      	test_config core.pager "wc >pager-used; exit 1" &&
     +	GIT_TRACE2="$(pwd)/trace.normal" &&
     +	export GIT_TRACE2 &&
     +	test_when_finished "unset GIT_TRACE2" &&
      
    --	OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    --	test "$OUT" -eq 0 &&
    -+	if test_have_prereq !MINGW
    -+	then
    -+		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    -+		test "$OUT" -eq 0
    -+	else
    -+		test_terminal git log
    -+	fi &&
    -+	grep "child_exit.* code:1 " trace.normal &&
    + 	if test_have_prereq !MINGW
    + 	then
    +@@ t/t7006-pager.sh: test_expect_success TTY 'git discards pager non-zero exit without SIGPIPE' '
    + 	else
    + 		test_terminal git log
    + 	fi &&
    ++
    ++	grep child_exit trace.normal >child-exits &&
    ++	test_line_count = 1 child-exits &&
    ++	grep " code:1 " child-exits &&
      	test_path_is_file pager-used
      '
      
    -+test_expect_success TTY 'git logs nonexisting pager invocation' '
    -+	test_config core.pager "does-not-exist" &&
    + test_expect_success TTY 'git discards nonexisting pager without SIGPIPE' '
    +-	test_when_finished "rm pager-used" &&
    ++	test_when_finished "rm pager-used trace.normal" &&
    + 	test_config core.pager "wc >pager-used; does-not-exist" &&
     +	GIT_TRACE2="$(pwd)/trace.normal" &&
     +	export GIT_TRACE2 &&
     +	test_when_finished "unset GIT_TRACE2" &&
    + 
    + 	if test_have_prereq !MINGW
    + 	then
    +@@ t/t7006-pager.sh: test_expect_success TTY 'git discards nonexisting pager without SIGPIPE' '
    + 	else
    + 		test_terminal git log
    + 	fi &&
     +
    -+	if test_have_prereq !MINGW
    -+	then
    -+		OUT=$( ((test_terminal git log; echo $? 1>&3) | :) 3>&1 ) &&
    -+		test_match_signal 13 "$OUT"
    -+	else
    -+		test_terminal git log
    ++	grep child_exit trace.normal >child-exits &&
    ++	test_line_count = 1 child-exits &&
    ++	grep " code:127 " child-exits &&
    + 	test_path_is_file pager-used
    + '
    + 
    + test_expect_success TTY 'git attempts to page to nonexisting pager command, gets SIGPIPE' '
    ++	test_when_finished "rm trace.normal" &&
    + 	test_config core.pager "does-not-exist" &&
    ++	GIT_TRACE2="$(pwd)/trace.normal" &&
    ++	export GIT_TRACE2 &&
    ++	test_when_finished "unset GIT_TRACE2" &&
    + 
    + 	if test_have_prereq !MINGW
    + 	then
    +@@ t/t7006-pager.sh: test_expect_success TTY 'git attempts to page to nonexisting pager command, gets
    + 		test_match_signal 13 "$OUT"
    + 	else
    + 		test_terminal git log
    +-	fi
     +	fi &&
    -+	grep "child_exit.* code:-1 " trace.normal
    -+'
     +
    - test_done
    ++	grep child_exit trace.normal >child-exits &&
    ++	test_line_count = 1 child-exits &&
    ++	grep " code:-1 " child-exits
    + '
    + 
    + test_expect_success TTY 'git returns SIGPIPE on propagated signals from pager' '
    +-	test_when_finished "rm pager-used" &&
    ++	test_when_finished "rm pager-used trace.normal" &&
    + 	test_config core.pager ">pager-used; test-tool sigchain" &&
    ++	GIT_TRACE2="$(pwd)/trace.normal" &&
    ++	export GIT_TRACE2 &&
    ++	test_when_finished "unset GIT_TRACE2" &&
    + 
    + 	if test_have_prereq !MINGW
    + 	then
    +@@ t/t7006-pager.sh: test_expect_success TTY 'git returns SIGPIPE on propagated signals from pager' '
    + 	else
    + 		test_terminal git log
    + 	fi &&
    ++
    ++	grep child_exit trace.normal >child-exits &&
    ++	test_line_count = 1 child-exits &&
    ++	grep " code:143 " child-exits &&
    + 	test_path_is_file pager-used
    + '
    + 
-:  ----------- > 5:  842f42340d0 WIP pager: respect exit code of pager over SIGPIPE
-- 
2.30.0.284.gd98b1dd5eaa7


  reply	other threads:[~2021-02-02  2:01 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-15 16:15 git fails with a broken pipe when one quits the pager Vincent Lefevre
2021-01-29 23:48 ` [PATCH] pager: exit without error on SIGPIPE Denton Liu
2021-01-30  8:29   ` Johannes Sixt
2021-01-30 12:52     ` Johannes Sixt
2021-02-01 15:03   ` Ævar Arnfjörð Bjarmason
2021-02-01 17:47     ` Junio C Hamano
2021-02-01 19:52       ` Ævar Arnfjörð Bjarmason
2021-02-01 20:55         ` Junio C Hamano
2021-02-02  2:05           ` Ævar Arnfjörð Bjarmason
2021-02-02  4:45             ` Junio C Hamano
2021-02-02  5:25               ` Junio C Hamano
2021-02-02  7:45                 ` Johannes Sixt
2021-02-02 20:13                   ` Junio C Hamano
2021-02-02 22:15                     ` Johannes Sixt
2021-02-02 22:21                       ` Junio C Hamano
2021-02-03 17:07                         ` Johannes Sixt
2021-02-03 18:12                           ` Junio C Hamano
2021-02-04 15:10                           ` Vincent Lefevre
2021-02-03  2:45                 ` Ævar Arnfjörð Bjarmason
2021-02-03  2:54                   ` Junio C Hamano
2021-02-03  3:36                     ` Ævar Arnfjörð Bjarmason
2021-02-03 17:19                     ` Johannes Sixt
2021-01-31  1:47 ` git fails with a broken pipe when one quits the pager Ævar Arnfjörð Bjarmason
2021-01-31  3:36   ` Vincent Lefevre
2021-01-31  3:47     ` Vincent Lefevre
2021-01-31 20:49     ` Ævar Arnfjörð Bjarmason
2021-02-01 10:34       ` Vincent Lefevre
2021-02-01 11:33         ` Chris Torek
2021-02-01 12:36           ` Vincent Lefevre
2021-02-01 12:53             ` Chris Torek
2021-02-01 15:17               ` Vincent Lefevre
2021-02-01 15:00           ` Ævar Arnfjörð Bjarmason
2021-02-01 12:10         ` Ævar Arnfjörð Bjarmason
2021-02-01 14:48           ` Vincent Lefevre
2021-02-01 15:44             ` Ævar Arnfjörð Bjarmason
2021-02-01 22:16               ` Johannes Sixt
2021-02-03  2:48                 ` Ævar Arnfjörð Bjarmason
2021-02-03 17:11                   ` Johannes Sixt
2021-02-03 15:26               ` Vincent Lefevre
2021-02-04  0:14                 ` Ævar Arnfjörð Bjarmason
2021-02-04 15:38                   ` Vincent Lefevre
2021-02-01 14:49           ` [PATCH 0/3] pager: test for exit behavior & trace2 bug fix Ævar Arnfjörð Bjarmason
2021-02-02  1:59             ` Ævar Arnfjörð Bjarmason [this message]
2021-02-02  1:59             ` [PATCH v2 1/5] pager: refactor wait_for_pager() function Ævar Arnfjörð Bjarmason
2021-02-02  1:59             ` [PATCH v2 2/5] pager: test for exit code with and without SIGPIPE Ævar Arnfjörð Bjarmason
2021-02-02  8:50               ` Denton Liu
2021-02-05  7:47               ` Johannes Sixt
2021-02-02  1:59             ` [PATCH v2 3/5] run-command: add braces for "if" block in wait_or_whine() Ævar Arnfjörð Bjarmason
2021-02-02  2:00             ` [PATCH v2 4/5] pager: properly log pager exit code when signalled Ævar Arnfjörð Bjarmason
2021-02-05  7:58               ` Johannes Sixt
2021-02-05 11:37                 ` Junio C Hamano
2021-02-02  2:00             ` [WIP/PATCH v2 5/5] WIP pager: respect exit code of pager over SIGPIPE Ævar Arnfjörð Bjarmason
2021-02-01 14:49           ` [PATCH 1/3] pager: test for exit code Ævar Arnfjörð Bjarmason
2021-02-01 14:49           ` [PATCH 2/3] pager: refactor wait_for_pager() function Ævar Arnfjörð Bjarmason
2021-02-01 14:49           ` [PATCH 3/3] pager: properly log pager exit code when signalled Ævar Arnfjörð Bjarmason
2021-02-01 18:07             ` Junio C Hamano
2021-02-01 19:21               ` Ævar Arnfjörð Bjarmason
2021-02-01 18:15             ` Junio C Hamano
2021-02-01 19:23               ` Ævar Arnfjörð Bjarmason
2021-02-01 22:04       ` git fails with a broken pipe when one quits the pager Johannes Sixt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210202020001.31601-1-avarab@gmail.com \
    --to=avarab@gmail.com \
    --cc=chris.torek@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=j6t@kdbg.org \
    --cc=jeffhost@microsoft.com \
    --cc=liu.denton@gmail.com \
    --cc=vincent@vinc17.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.