Skip to content

Commit 1024179

Browse files
committed
small clean-ups to shell capture
- remove stderr entirely from ShellReturn - clean up calling subprocess.run() in shell.execute()
1 parent 535efdb commit 1024179

3 files changed

Lines changed: 21 additions & 32 deletions

File tree

pymake/pymake.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -535,11 +535,9 @@ def check_prefixes(s):
535535
ret.stdout = ""
536536

537537
exit_code = ret.exit_code
538-
# print(ret.stderr,end="")
539-
# print(ret.stdout,end="")
540538
if exit_code != 0:
541-
print("make:", ret.stderr, file=sys.stderr, end="")
542-
print("make: *** [%r: %s] Error %d %s" % (recipe.get_pos(), rule.target, exit_code, "(ignored)" if ignore_failure else ""), file=sys.stderr)
539+
print("make: *** [%r: %s] Error %d %s" % (recipe.get_pos(), rule.target,
540+
exit_code, "(ignored)" if ignore_failure else ""), file=sys.stderr)
543541

544542
if not ignore_failure:
545543
break

pymake/shell.py

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
class ShellReturn:
2525
def __init__(self):
26+
# note: stderr is never captured
2627
self.stdout = None
27-
self.stderr = None
2828
self.exit_code = None
2929
self.errmsg = None
3030
self.is_submake = False
@@ -122,35 +122,28 @@ def execute(cmd_str, symbol_table, use_default_shell=True, capture=True):
122122

123123
logger.debug("cmd=>>>%s<<<", cmd)
124124

125-
try:
126-
if capture:
127-
p = subprocess.run(cmd,
128-
shell=False,
129-
stdout=subprocess.PIPE,
130-
universal_newlines=True,
131-
check=False, # we'll check returncode ourselves
132-
env=env
133-
)
134-
else:
135-
p = subprocess.run(cmd,
136-
shell=False,
137-
universal_newlines=True,
138-
check=False, # we'll check returncode ourselves
139-
env=env
140-
)
125+
kwargs= {
126+
"shell":False,
127+
"universal_newlines":True,
128+
"check":False, # we'll check returncode ourselves
129+
"env":env
130+
}
131+
if capture:
132+
kwargs["stdout"] = subprocess.PIPE
141133

134+
try:
135+
p = subprocess.run(cmd, **kwargs)
136+
#
142137
logger.debug("shell ts=%f exit status=%r", ts, p.returncode)
143138
# if p.returncode != 0:
144139
# breakpoint()
145140
return_status.exit_code = p.returncode
146141
return_status.stdout = p.stdout
147-
# return_status.stderr = p.stderr
148142
except OSError as err:
149143
logger.error("shell ts=%f error=\"%s\"", ts, err)
144+
# match gnu make's output
150145
return_status.exit_code = 127
151146
return_status.stdout = ""
152-
# match gnu make's output
153-
return_status.stderr = err.strerror
154147

155148
if cmd_str.startswith(submake.getname()):
156149
return_status.is_submake = True
@@ -183,7 +176,6 @@ def execute_tokens(token_list, symbol_table):
183176
# "If the result of the execution ends in a newline, that one newline is
184177
# removed; all other newlines are replaced by spaces." GNU Make PDF
185178
exe_result.stdout = exe_result.stdout.strip().replace("\n", " ")
186-
# exe_result.stderr = exe_result.stderr.strip().replace("\n", " ")
187179

188180
# save shell status
189181
pos = token_list[0].get_pos()
@@ -201,12 +193,8 @@ def execute_tokens(token_list, symbol_table):
201193
if exe_result.errmsg:
202194
error_message(pos, exe_result.errmsg)
203195
else:
204-
# otherwise report stderr (if any)
205-
if exe_result.stderr:
206-
logger.error("command at %r failed with exit_code=%d", pos, exe_result.exit_code)
207-
# error_message(pos, exe_result.stderr)
208-
else:
209-
logger.error("command at %r failed with exit_code=%d (but stderr empty)", pos, exe_result.exit_code)
196+
# stderr already sent to the world
197+
logger.error("command at %r failed with exit_code=%d", pos, exe_result.exit_code)
210198

211199
return exe_result.stdout
212200

tests/test_shellflags.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ def test_simple():
1414

1515
assert a==b
1616

17+
# the -x flag will echo the command to stderr before executing it
18+
# (very useful when debugging)
1719
def test_x_flag():
1820
makefile="""
1921
.SHELLFLAGS+=-x
2022
$(info .SHELLFLAGS=$(.SHELLFLAGS))
21-
@:;@:
23+
top:
24+
echo .SHELLFLAGS=$(.SHELLFLAGS)
2225
"""
2326
a = run.gnumake_string(makefile)
2427

0 commit comments

Comments
 (0)