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

[PATCH 2/3] mingw: special-case GIT_REDIRECT_STDERR=2>&1

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Oct 30, 2017, 17:10 UTC
Message-ID
<bb3cec73c50a36af31b029ab37949decdfe45857.1509382976.git.johannes.schindelin@gmx.de>
In-Reply-To
<cover.1509382976.git.johannes.schindelin@gmx.de>

The "2>&1" notation in POSIX shells implies that stderr is redirected to stdout. Let's special-case this value for the environment variable GIT_REDIRECT_STDERR to allow writing to the same destination as stdout.

The functionality was suggested by Jeff Hostetler.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 compat/mingw.c  | 15 +++++++++++++++
 t/t0001-init.sh |  8 +++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index 6c6c7795a70..2d44d21aca8 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -2160,6 +2160,21 @@ static void maybe_redirect_std_handle(const wchar_t *key, DWORD std_id, int fd,
 			CloseHandle(handle);
 		return;
 	}
+	if (std_id == STD_ERROR_HANDLE && !wcscmp(buf, L"2>&1")) {
+		handle = GetStdHandle(STD_OUTPUT_HANDLE);
+		if (handle == INVALID_HANDLE_VALUE) {
+			close(fd);
+			handle = GetStdHandle(std_id);
+			if (handle != INVALID_HANDLE_VALUE)
+				CloseHandle(handle);
+		} else {
+			int new_fd = _open_osfhandle((intptr_t)handle, O_BINARY);
+			SetStdHandle(std_id, handle);
+			dup2(new_fd, fd);
+			/* do *not* close the new_fd: that would close stdout */
+		}
+		return;
+	}
 	handle = CreateFileW(buf, desired_access, 0, NULL, create_flag,
 			     flags, NULL);
 	if (handle != INVALID_HANDLE_VALUE) {
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 0fd2fc45385..c413bff9cf1 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -456,7 +456,13 @@ test_expect_success 're-init from a linked worktree' '
 test_expect_success MINGW 'redirect std handles' '
 	GIT_REDIRECT_STDOUT=output.txt git rev-parse --git-dir &&
 	test .git = "$(cat output.txt)" &&
-	test -z "$(GIT_REDIRECT_STDOUT=off git rev-parse --git-dir)"
+	test -z "$(GIT_REDIRECT_STDOUT=off git rev-parse --git-dir)" &&
+	test_must_fail env \
+		GIT_REDIRECT_STDOUT=output.txt \
+		GIT_REDIRECT_STDERR="2>&1" \
+		git rev-parse --git-dir --verify refs/invalid &&
+	printf ".git\nfatal: Needed a single revision\n" >expect &&
+	test_cmp expect output.txt
 '
 
 test_done
-- 
2.15.0.windows.1
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 3 of 22 in “mingw: introduce a way to avoid std handle inheritance”
  1. 0/3 mingw: introduce a way to avoid std handle inheritanceJohannes Schindelin, Oct 30, 2017
  2. 1/3 mingw: add experimental feature to redirect standard handlesJohannes Schindelin, Oct 30, 2017
  3. 2/3 mingw: special-case GIT_REDIRECT_STDERR=2>&1Johannes Schindelin, Oct 30, 2017
  4. 3/3 mingw: document the experimental standard handle redirectionJohannes Schindelin, Oct 30, 2017
  5. Eric SunshineOct 30, 2017
  6. Johannes SchindelinOct 31, 2017
  7. Junio C HamanoNov 1, 2017
  8. Johannes SchindelinNov 1, 2017
  9. Junio C HamanoNov 2, 2017
  10. Johannes SchindelinNov 2, 2017
  11. Junio C HamanoNov 3, 2017
  12. Johannes SchindelinNov 3, 2017
  13. Jonathan NiederOct 30, 2017
  14. Junio C HamanoOct 31, 2017
  15. Johannes SchindelinOct 31, 2017
  16. Jonathan NiederOct 31, 2017
  17. Johannes SchindelinNov 1, 2017
  18. Stefan BellerNov 1, 2017
  19. 0/3 mingw: introduce a way to avoid std handle inheritanceJohannes Schindelin, Nov 1, 2017
  20. 1/3 mingw: add experimental feature to redirect standard handlesJohannes Schindelin, Nov 1, 2017
  21. 2/3 mingw: optionally redirect stderr/stdout via the same handleJohannes Schindelin, Nov 1, 2017
  22. 3/3 mingw: document the standard handle redirectionJohannes Schindelin, Nov 1, 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.