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

Re: [PATCH 2/3] t5615: avoid re-using descriptor 4

From
Jeff King <peff@peff.net>
Date
Oct 20, 2017, 05:50 UTC
Message-ID
<20171020055058.s5dgxyfjnqtlxv4d@sigill.intra.peff.net>
In-Reply-To
<20171019232337.zfd7occtjboem7f4@sigill.intra.peff.net>
On Thu, Oct 19, 2017 at 07:23:37PM -0400, Jeff King wrote:
Show 12 quoted lines
> So one trick is that we can't just set it to a higher number. We have to
> also open and manage that descriptor. It might be enough to do:
> 
>   if test -n "$BASH_VERSION"
>   then
> 	exec 999>&4
> 	BASH_XTRACEFD=999
>   fi
> [...]
> I think it might be workable, but I'm worried we're opening a can of
> worms. Or continuing to dig into the can of worms from the original
> BASH_XTRACEFD, if you prefer. :)

So this is the best I came up with (on top of my other patches for ease of reading, though I'd re-work them if this is the route we're going to go):

diff --git a/t/test-lib.sh b/t/test-lib.sh
index 14fac6d6f2..833ceaefd2 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -377,7 +377,12 @@ fi
 #
 # Note also that we don't need or want to export it. The tracing is local to
 # this shell, and we would not want to influence any shells we exec.
-BASH_XTRACEFD=4
+if test -n "$BASH_VERSION"
+then
+	exec 999>&4
+	BASH_XTRACEFD=999
+	silence_trace="999>/dev/null"
+fi
 
 test_failure=0
 test_count=0
@@ -627,14 +632,16 @@ test_eval_ () {
 	#     be _inside_ the block to avoid polluting the "set -x" output
 	#
 
-	test_eval_inner_ "$@" </dev/null >&3 2>&4
-	{
-		test_eval_ret_=$?
-		if want_trace
-		then
-			set +x
-		fi
-	} 2>/dev/null 4>&2
+	eval '
+		test_eval_inner_ "$@" </dev/null >&3 2>&4
+		{
+			test_eval_ret_=$?
+			if want_trace
+			then
+				set +x
+			fi
+		} 2>/dev/null '"$silence_trace"'
+	'
 
 	if test "$test_eval_ret_" != 0 && want_trace
 	then

I really hate that extra eval, since it adds an extra layer of "+" to
the tracing output in bash.

But I can't find a way to make it work without it. The "999>/dev/null"
is syntactically bogus in non-bash shells, so it _must_ appear as part
of an eval.  We can't conditionally stick it at the end of the eval run
by test_eval_inner_, because that one is running the actual test code
(so it may bail early with "return", for example).

TBH, I'm not 100% sure that the initial "exec 999>&4" won't cause
complaints in some shells. Dash seems to handle it, but others might
not. That can be worked around with another eval, though.

So I dunno. It does solve the problem in a way that the individual test
scripts wouldn't have to care about. But it's a lot of eval trickery.

-Peff
Previous: Jeff KingNext: Stefan Beller
Message 6 of 36 in “making test-suite tracing more useful”
  1. 0/3 making test-suite tracing more usefulJeff King, Oct 19, 2017
  2. 1/3 test-lib: silence "-x" cleanup under bashJeff King, Oct 19, 2017
  3. 2/3 t5615: avoid re-using descriptor 4Jeff King, Oct 19, 2017
  4. Stefan BellerOct 19, 2017
  5. Jeff KingOct 19, 2017
  6. Jeff KingOct 20, 2017
  7. Stefan BellerOct 20, 2017
  8. Jeff KingOct 20, 2017
  9. Simon RuderichOct 21, 2017
  10. Junio C HamanoOct 21, 2017
  11. Jeff KingOct 21, 2017
  12. 3/3 test-lib: make "-x" work with "--verbose-log"Jeff King, Oct 19, 2017
  13. Johannes SchindelinOct 23, 2017
  14. 4/3 t/Makefile: introduce TEST_SHELL_PATHJeff King, Oct 20, 2017
  15. SZEDER GáborOct 20, 2017
  16. Jeff KingOct 21, 2017
  17. Johannes SchindelinOct 23, 2017
  18. Jeff KingOct 24, 2017
  19. Johannes SchindelinOct 25, 2017
  20. Jeff KingOct 25, 2017
  21. Johannes SchindelinOct 27, 2017
  22. Johannes SchindelinOct 23, 2017
  23. Jeff KingOct 24, 2017
  24. 0/4 making test-suite tracing more usefulJeff King, Dec 8, 2017
  25. 1/4 test-lib: silence "-x" cleanup under bashJeff King, Dec 8, 2017
  26. 2/4 t5615: avoid re-using descriptor 4Jeff King, Dec 8, 2017
  27. 3/4 test-lib: make "-x" work with "--verbose-log"Jeff King, Dec 8, 2017
  28. 4/4 t/Makefile: introduce TEST_SHELL_PATHJeff King, Dec 8, 2017
  29. Johannes SchindelinDec 8, 2017
  30. Jeff KingDec 8, 2017
  31. Johannes SchindelinDec 9, 2017
  32. Jeff KingDec 10, 2017
  33. Junio C HamanoDec 11, 2017
  34. Jeff KingDec 15, 2017
  35. Junio C HamanoDec 15, 2017
  36. Jeff KingDec 21, 2017

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.