[llvm] Revert "[Lit] Change processRedirects to open all files in binary mode" (PR #196328)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 7 07:33:37 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-testing-tools
Author: Benjamin Stott (BStott6)
<details>
<summary>Changes</summary>
Reverts llvm/llvm-project#<!-- -->194368 due to breaking tests on z/OS
---
Full diff: https://github.com/llvm/llvm-project/pull/196328.diff
4 Files Affected:
- (modified) llvm/utils/lit/lit/InprocBuiltins.py (+13-13)
- (modified) llvm/utils/lit/lit/ShellEnvironment.py (+8-9)
- (modified) llvm/utils/lit/lit/TestRunner.py (+3-3)
- (modified) llvm/utils/lit/tests/shtest-glob.py (+1-1)
``````````diff
diff --git a/llvm/utils/lit/lit/InprocBuiltins.py b/llvm/utils/lit/lit/InprocBuiltins.py
index 34a4d7eae1e88..b20aeb6993726 100644
--- a/llvm/utils/lit/lit/InprocBuiltins.py
+++ b/llvm/utils/lit/lit/InprocBuiltins.py
@@ -5,7 +5,7 @@
import shutil
import stat
import subprocess
-from io import BytesIO, StringIO
+from io import StringIO
import lit.util
from lit.ShellEnvironment import (
@@ -70,7 +70,13 @@ def executeBuiltinEcho(cmd, shenv):
is_redirected = True
if stdout == subprocess.PIPE:
is_redirected = False
- stdout = BytesIO()
+ stdout = StringIO()
+ elif kIsWindows:
+ # Reopen stdout with `newline=""` to avoid CRLF translation.
+ # The versions of echo we are replacing on Windows all emit plain LF,
+ # and the LLVM tests now depend on this.
+ stdout = open(stdout.name, stdout.mode, encoding="utf-8", newline="")
+ opened_files.append((None, None, stdout, None))
# Implement echo flags. We only support -e and -n, and not yet in
# combination. We have to ignore unknown flags, because `echo "-D FOO"`
@@ -94,22 +100,16 @@ def maybeUnescape(arg):
if args:
for arg in args[:-1]:
- stdout.write(maybeUnescape(arg).encode())
- stdout.write(b" ")
- stdout.write(maybeUnescape(args[-1]).encode())
+ stdout.write(maybeUnescape(arg))
+ stdout.write(" ")
+ stdout.write(maybeUnescape(args[-1]))
if write_newline:
- stdout.write("\n".encode())
+ stdout.write("\n")
for name, mode, f, path in opened_files:
f.close()
- output = (
- ""
- if is_redirected
- # TODO(BStott) remove decode once new interface for in-process builtin
- # IO is introduced.
- else stdout.getvalue().decode(encoding="utf8", errors="replace")
- )
+ output = "" if is_redirected else stdout.getvalue()
return ShellCommandResult(cmd, output, "", 0, False)
diff --git a/llvm/utils/lit/lit/ShellEnvironment.py b/llvm/utils/lit/lit/ShellEnvironment.py
index b4ff7b1a120f6..4f6753bd11b52 100644
--- a/llvm/utils/lit/lit/ShellEnvironment.py
+++ b/llvm/utils/lit/lit/ShellEnvironment.py
@@ -108,19 +108,19 @@ def processRedirects(cmd, stdin_source, cmd_shenv, opened_files):
redirects = [(0,), (1,), (2,)]
for op, filename in cmd.redirects:
if op == (">", 2):
- redirects[2] = [filename, "wb", None]
+ redirects[2] = [filename, "w", None]
elif op == (">>", 2):
- redirects[2] = [filename, "ab", None]
+ redirects[2] = [filename, "a", None]
elif op == (">&", 2) and filename in "012":
redirects[2] = redirects[int(filename)]
elif op == (">&",) or op == ("&>",):
- redirects[1] = redirects[2] = [filename, "wb", None]
+ redirects[1] = redirects[2] = [filename, "w", None]
elif op == (">",):
- redirects[1] = [filename, "wb", None]
+ redirects[1] = [filename, "w", None]
elif op == (">>",):
- redirects[1] = [filename, "ab", None]
+ redirects[1] = [filename, "a", None]
elif op == ("<",):
- redirects[0] = [filename, "rb", None]
+ redirects[0] = [filename, "r", None]
else:
raise InternalShellError(
cmd, "Unsupported redirect: %r" % ((op, filename),)
@@ -173,12 +173,11 @@ def processRedirects(cmd, stdin_source, cmd_shenv, opened_files):
else:
# Make sure relative paths are relative to the cwd.
redir_filename = os.path.join(cmd_shenv.cwd, name)
- fd = open(redir_filename, mode)
-
+ fd = open(redir_filename, mode, encoding="utf-8")
# Workaround a Win32 and/or subprocess bug when appending.
#
# FIXME: Actually, this is probably an instance of PR6753.
- if mode == "ab":
+ if mode == "a":
fd.seek(0, 2)
# Mutate the underlying redirect list so that we can redirect stdout
# and stderr to the same place without opening the file twice.
diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index 743f7bcccd533..32f47109053a6 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -520,11 +520,11 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
if procs[i].stdout is not None:
out = procs[i].stdout.read()
else:
- out = b""
+ out = ""
if procs[i].stderr is not None:
err = procs[i].stderr.read()
else:
- err = b""
+ err = ""
procData[i] = (out, err)
# Read stderr out of the temp files.
@@ -567,7 +567,7 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
output_files = []
if res != 0:
for (name, mode, f, path) in sorted(opened_files):
- if path is not None and mode in ("wb", "ab"):
+ if path is not None and mode in ("w", "a"):
try:
with open(path, "rb") as f:
data = f.read()
diff --git a/llvm/utils/lit/tests/shtest-glob.py b/llvm/utils/lit/tests/shtest-glob.py
index 95a53e4dd2223..ba609e036c166 100644
--- a/llvm/utils/lit/tests/shtest-glob.py
+++ b/llvm/utils/lit/tests/shtest-glob.py
@@ -5,7 +5,7 @@
# END.
# CHECK: UNRESOLVED: shtest-glob :: glob-echo.txt ({{[^)]*}})
-# CHECK: AttributeError: 'GlobItem' object has no attribute 'encode'
+# CHECK: TypeError: string argument expected, got 'GlobItem'
# CHECK: FAIL: shtest-glob :: glob-mkdir.txt ({{[^)]*}})
# CHECK: # | Error: 'mkdir' command failed, {{.*}}example_file1.input'
``````````
</details>
https://github.com/llvm/llvm-project/pull/196328
More information about the llvm-commits
mailing list