Skip to content

Commit cf309e1

Browse files
committed
refactor: modernize run-tests helpers with typing and safer subprocess handling
Suggested-by: Oliver Stöneberg <firewave@users.noreply.github.com>
1 parent 6fd8a0c commit cf309e1

1 file changed

Lines changed: 23 additions & 14 deletions

File tree

run-tests.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1+
from __future__ import annotations
12

23
import glob
34
import os
45
import shutil
56
import subprocess
67
import sys
78

8-
def cleanup(out):
9-
ret = ''
10-
for s in out.decode('utf-8').split('\n'):
11-
if len(s) > 1 and s[0] == '#':
9+
10+
def cleanup(out: str) -> str:
11+
parts = []
12+
for line in out.decode('utf-8').splitlines():
13+
if len(line) > 1 and line[0] == '#':
1214
continue
13-
s = "".join(s.split())
14-
ret = ret + s
15-
return ret
15+
parts.append("".join(line.split()))
16+
return "".join(parts)
1617

1718

1819
# Check for required compilers and exit if any are missing
@@ -93,15 +94,23 @@ def cleanup(out):
9394
]
9495

9596

96-
def run(compiler_executable, compiler_args):
97-
"""Execute a compiler command and capture its output."""
97+
def run(compiler_executable: str, compiler_args: list[str]) -> tuple[int, str, str]:
98+
"""Execute a compiler command and capture its exit code, stdout, and stderr."""
9899
compiler_cmd = [compiler_executable]
99100
compiler_cmd.extend(compiler_args)
100-
p = subprocess.Popen(compiler_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
101-
comm = p.communicate()
102-
exit_code = p.returncode
103-
output = cleanup(comm[0])
104-
error = comm[0].decode('utf-8').strip()
101+
102+
try:
103+
with subprocess.Popen(compiler_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as process:
104+
stdout, stderr = process.communicate()
105+
exit_code = process.returncode
106+
except FileNotFoundError as e:
107+
# Compiler not found
108+
return (127, "", f"{e}")
109+
except Exception as e:
110+
return (1, "", f"{e}")
111+
112+
output = cleanup(stdout) # bytes -> str via cleanup
113+
error = (stderr or b"").decode("utf-8", errors="replace").strip()
105114
return (exit_code, output, error)
106115

107116

0 commit comments

Comments
 (0)