72 cmd: Union[List[str], CommandArgs],
73 show_stdout: bool =
False,
74 cwd: Optional[str] =
None,
75 on_returncode:
'Literal["raise", "warn", "ignore"]' =
"raise",
76 extra_ok_returncodes: Optional[Iterable[int]] =
None,
77 extra_environ: Optional[Mapping[str, Any]] =
None,
78 unset_environ: Optional[Iterable[str]] =
None,
79 spinner: Optional[SpinnerInterface] =
None,
80 log_failed_cmd: Optional[bool] =
True,
81 stdout_only: Optional[bool] =
False,
87 show_stdout: if true, use INFO to log the subprocess's stderr and
88 stdout streams. Otherwise, use DEBUG. Defaults to False.
89 extra_ok_returncodes: an iterable of integer return codes that are
90 acceptable, in addition to 0. Defaults to None, which means [].
91 unset_environ: an iterable of environment variable names to unset
92 prior to calling subprocess.Popen().
93 log_failed_cmd: if false, failed commands are not logged, only raised.
94 stdout_only: if true, return only stdout, else return both. When true,
95 logging of both stdout and stderr occurs when the subprocess has
96 terminated, else logging occurs as subprocess output is produced.
98 if extra_ok_returncodes
is None:
99 extra_ok_returncodes = []
100 if unset_environ
is None:
132 use_spinner =
not showing_subprocess
and spinner
is not None
138 for name
in unset_environ:
149 errors=
"backslashreplace",
151 except Exception
as exc:
154 "Error %s while executing command %s",
183 output =
"".join(all_output)
205 if on_returncode ==
"raise":
207 command_description=command_desc,
209 output_lines=all_output
if not showing_subprocess
else None,
214 "[bold magenta]full command[/]: [blue]%s[/]",
215 escape(format_command_args(cmd)),
216 extra={
"markup":
True},
219 "[bold magenta]cwd[/]: %s",
220 escape(cwd
or "[inherit]"),
221 extra={
"markup":
True},
225 elif on_returncode ==
"warn":
227 'Command "%s" had error code %s in %s',
232 elif on_returncode ==
"ignore":
235 raise ValueError(f
"Invalid value: on_returncode={on_returncode!r}")
239def runner_with_spinner_message(message: str) -> Callable[...,
None]:
240 """Provide a subprocess_runner that shows a spinner message.
242 Intended for use with for BuildBackendHookCaller. Thus, the runner has
243 an API that matches what's expected by BuildBackendHookCaller.subprocess_runner.
248 cwd: Optional[str] =
None,
249 extra_environ: Optional[Mapping[str, Any]] =
None,
251 with open_spinner(message)
as spinner:
254 command_desc=message,
256 extra_environ=extra_environ,