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

[PATCH 2/7] t3701: avoid depending on the TTY prerequisite

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 6, 2019, 13:08 UTC
Message-ID
<ed870d34a8479366df786e76e2770df344469a41.1575637705.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.172.git.1575637705.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

The TTY prerequisite is a rather heavy one: it not only requires Perl to work, but also the IO/Pty.pm module (with native support, and it requires pseudo terminals, too).

In particular, test cases marked with the TTY prerequisite would be skipped in Git for Windows' SDK.

In the case of `git add -p`, we do not actually need that big a hammer, as we do not want to test any functionality that requires a pseudo terminal; all we want is for the interactive add command to use color, even when being called from within the test suite.

And we found exactly such a trick earlier already: when we added a test case to verify that the main loop of `git add -i` is colored appropriately. Let's use that trick instead of the TTY prerequisite.

While at it, we avoid the pipes, as we do not want a SIGPIPE to break the regression test cases (which will be much more likely when we do not run everything through Perl because that is inherently slower).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 t/t3701-add-interactive.sh | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
index 4da99e27af..793ce28297 100755
--- a/t/t3701-add-interactive.sh
+++ b/t/t3701-add-interactive.sh
@@ -23,6 +23,17 @@ diff_cmp () {
 	test_cmp "$1.filtered" "$2.filtered"
 }
 
+# This function uses a trick to manipulate the interactive add to use color:
+# the `want_color()` function special-cases the situation where a pager was
+# spawned and Git now wants to output colored text: to detect that situation,
+# the environment variable `GIT_PAGER_IN_USE` is set. However, color is
+# suppressed despite that environment variable if the `TERM` variable
+# indicates a dumb terminal, so we set that variable, too.
+
+force_color () {
+	env GIT_PAGER_IN_USE=true TERM=vt100 "$@"
+}
+
 test_expect_success 'setup (initial)' '
 	echo content >file &&
 	git add file &&
@@ -451,35 +462,38 @@ test_expect_success 'patch mode ignores unmerged entries' '
 	diff_cmp expected diff
 '
 
-test_expect_success TTY 'diffs can be colorized' '
+test_expect_success 'diffs can be colorized' '
 	git reset --hard &&
 
 	echo content >test &&
-	printf y | test_terminal git add -p >output 2>&1 &&
+	printf y >y &&
+	force_color git add -p >output 2>&1 <y &&
 
 	# We do not want to depend on the exact coloring scheme
 	# git uses for diffs, so just check that we saw some kind of color.
 	grep "$(printf "\\033")" output
 '
 
-test_expect_success TTY 'diffFilter filters diff' '
+test_expect_success 'diffFilter filters diff' '
 	git reset --hard &&
 
 	echo content >test &&
 	test_config interactive.diffFilter "sed s/^/foo:/" &&
-	printf y | test_terminal git add -p >output 2>&1 &&
+	printf y >y &&
+	force_color git add -p >output 2>&1 <y &&
 
 	# avoid depending on the exact coloring or content of the prompts,
 	# and just make sure we saw our diff prefixed
 	grep foo:.*content output
 '
 
-test_expect_success TTY 'detect bogus diffFilter output' '
+test_expect_success 'detect bogus diffFilter output' '
 	git reset --hard &&
 
 	echo content >test &&
 	test_config interactive.diffFilter "echo too-short" &&
-	printf y | test_must_fail test_terminal git add -p
+	printf y >y &&
+	test_must_fail force_color git add -p <y
 '
 
 test_expect_success 'patch-mode via -i prompts for files' '
@@ -689,7 +703,7 @@ test_expect_success 'show help from add--helper' '
 	<BOLD;BLUE>What now<RESET>>$SP
 	Bye.
 	EOF
-	test_write_lines h | GIT_PAGER_IN_USE=true TERM=vt100 git add -i >actual.colored &&
+	test_write_lines h | force_color git add -i >actual.colored &&
 	test_decode_color <actual.colored >actual &&
 	test_i18ncmp expect actual
 '
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: SZEDER Gábor
Message 3 of 15 in “add -i: close some regression test gaps”
  1. 0/7 add -i: close some regression test gapsJohannes Schindelin via GitGitGadget, Dec 6, 2019
  2. 1/7 t3701: add a test for advanced split-hunk editingJohannes Schindelin via GitGitGadget, Dec 6, 2019
  3. 2/7 t3701: avoid depending on the TTY prerequisiteJohannes Schindelin via GitGitGadget, Dec 6, 2019
  4. SZEDER GáborDec 16, 2019
  5. Jeff KingDec 17, 2019
  6. 3/7 t3701: add a test for the different `add -p` promptsJohannes Schindelin via GitGitGadget, Dec 6, 2019
  7. 5/7 t3701: verify that the diff.algorithm config setting is handledJohannes Schindelin via GitGitGadget, Dec 6, 2019
  8. 4/7 t3701: verify the shown messages when nothing can be addedJohannes Schindelin via GitGitGadget, Dec 6, 2019
  9. 7/7 apply --allow-overlap: fix a corner caseJohannes Schindelin via GitGitGadget, Dec 6, 2019
  10. Junio C HamanoDec 6, 2019
  11. Johannes SchindelinDec 6, 2019
  12. Junio C HamanoDec 6, 2019
  13. Johannes SchindelinDec 6, 2019
  14. 6/7 git add -p: use non-zero exit code when the diff generation failedJohannes Schindelin via GitGitGadget, Dec 6, 2019
  15. Junio C HamanoDec 6, 2019

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.