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

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

From
Jeff King <peff@peff.net>
Date
Dec 8, 2017, 10:47 UTC
Message-ID
<20171208104713.GB4939@sigill.intra.peff.net>
In-Reply-To
<20171208104647.GA4016@sigill.intra.peff.net>

File descriptors 3 and 4 are special in our test suite, as they link back to the test script's original stdout and stderr. Normally this isn't something tests need to worry about: they are free to clobber these descriptors for sub-commands without affecting the overall script.

But there's one very special thing about descriptor 4: since d88785e424 (test-lib: set BASH_XTRACEFD automatically, 2016-05-11), we ask bash to output "set -x" output to it by number. This goes to _any_ descriptor 4, even if it no longer points to the place it did when we set BASH_XTRACEFD.

But in t5615, we run a shell loop with descriptor 4 redirected. As a result, t5615 works with non-bash shells even with "-x". And it works with bash without "-x". But the combination of "bash t5615-alternate-env.sh -x" gets a test failure (because our "set -x" output pollutes one of the files).

We can fix this by using any descriptor _except_ the magical
4. So let's switch arbitrarily to using 5/6 in this loop,
not 3/4.

Another alternative is to use a different descriptor for BASH_XTRACEFD. But picking an unused one turns out to be hard. Most shells limit us to 9 numbered descriptors. Bash can handle more, but:

  - while the BASH_XTRACEFD is specific to bash, GIT_TRACE=4
    has a similar problem, and would affect all shells
  - constructs like "999>/dev/null" are synticatically
    invalid to non-bash shells. So we have to actually bury
    it inside an eval, which creates more complications.

Of the numbers 1-9, you might think that "9" would be less used than "4". But it's not; many of our scripts use descriptors 8 and 9 (probably under the assumption that they are high and therefore unused). The least-used descriptor is currently "7". We could switch to that, but we're just trading one magic number for another.

Signed-off-by: Jeff King <peff@peff.net>
---
 t/t5615-alternate-env.sh | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/t/t5615-alternate-env.sh b/t/t5615-alternate-env.sh
index d2d883f3a1..b4905b822c 100755
--- a/t/t5615-alternate-env.sh
+++ b/t/t5615-alternate-env.sh
@@ -7,9 +7,9 @@ check_obj () {
 	alt=$1; shift
 	while read obj expect
 	do
-		echo "$obj" >&3 &&
-		echo "$obj $expect" >&4
-	done 3>input 4>expect &&
+		echo "$obj" >&5 &&
+		echo "$obj $expect" >&6
+	done 5>input 6>expect &&
 	GIT_ALTERNATE_OBJECT_DIRECTORIES=$alt \
 		git "$@" cat-file --batch-check='%(objectname) %(objecttype)' \
 		<input >actual &&
-- 
2.15.1.659.g8bd2eae3ea
Previous: Jeff KingNext: Jeff King
Message 26 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.