Chromium Code Reviews| Index: recipe_engine/step_runner.py |
| diff --git a/recipe_engine/step_runner.py b/recipe_engine/step_runner.py |
| index 380eeb4421fbe8c918d41942a5bc18c7d9a29664..fb432df2f28c893e8b24075417b4d20ea38cdda5 100644 |
| --- a/recipe_engine/step_runner.py |
| +++ b/recipe_engine/step_runner.py |
| @@ -23,6 +23,8 @@ from . import stream |
| from . import types |
| from . import util |
| +from libs import luci_context as luci_ctx |
| + |
| import subprocess42 |
| @@ -211,7 +213,8 @@ class SubprocessStepRunner(StepRunner): |
| # The subprocess will inherit and close these handles. |
| retcode = self._run_cmd( |
| cmd=step_config.cmd, timeout=step_config.timeout, handles=handles, |
| - env=step_env, cwd=step_config.cwd) |
| + env=step_env, luci_context=rendered_step.config.luci_context, |
| + cwd=step_config.cwd) |
| except subprocess42.TimeoutExpired as e: |
| #FIXME: Make this respect the infra_step argument |
| step_stream.set_step_status('FAILURE') |
| @@ -307,7 +310,7 @@ class SubprocessStepRunner(StepRunner): |
| yield '' |
| stream.output_iter(step_stream, gen_step_prelude()) |
| - def _run_cmd(self, cmd, timeout, handles, env, cwd): |
| + def _run_cmd(self, cmd, timeout, handles, env, luci_context, cwd): |
| """Runs cmd (subprocess-style). |
| Args: |
| @@ -315,6 +318,7 @@ class SubprocessStepRunner(StepRunner): |
| handles: A dictionary from ('stdin', 'stdout', 'stderr'), each value |
| being *either* a stream.StreamEngine.Stream or a python file object |
| to direct that subprocess's filehandle to. |
| + luci_context: full value of LUCI_CONTEXT dict. |
|
iannucci
2017/08/04 18:55:50
Maybe "entire intended value of the LUCI_CONTEXT d
|
| env: the full environment to run the command in -- this is passed |
| unaltered to subprocess.Popen. |
| cwd: the working directory of the command. |
| @@ -333,47 +337,52 @@ class SubprocessStepRunner(StepRunner): |
| # stdin must be a real handle, if it exists |
| fhandles['stdin'] = handles.get('stdin') |
| - with _modify_lookup_path(env.get('PATH')): |
| - proc = subprocess42.Popen( |
| - cmd, |
| - env=env, |
| - cwd=cwd, |
| - detached=True, |
| - universal_newlines=True, |
| - **fhandles) |
| - |
| - # Safe to close file handles now that subprocess has inherited them. |
| - for handle in fhandles.itervalues(): |
| - if isinstance(handle, file): |
| - handle.close() |
| - |
| - outstreams = {} |
| - linebufs = {} |
| - |
| - for key in ('stdout', 'stderr'): |
| - handle = handles.get(key) |
| - if isinstance(handle, stream.StreamEngine.Stream): |
| - outstreams[key] = handle |
| - linebufs[key] = _streamingLinebuf() |
| - |
| - if linebufs: |
| - # manually check the timeout, because we poll |
| - start_time = time.time() |
| - for pipe, data in proc.yield_any(timeout=1): |
| - if timeout and time.time() - start_time > timeout: |
| - # Don't know the name of the step, so raise this and it'll get caught |
| - raise subprocess42.TimeoutExpired(cmd, timeout) |
| - |
| - if pipe is None: |
| - continue |
| - buf = linebufs.get(pipe) |
| - if not buf: |
| - continue |
| - buf.ingest(data) |
| - for line in buf.get_buffered(): |
| - outstreams[pipe].write_line(line) |
| - else: |
| - proc.wait(timeout) |
| + with luci_ctx.replace(luci_context) as path: |
|
Vadim Sh.
2017/07/29 00:40:55
no changes here except lines 340-343
Rietveld is t
|
| + if path: |
|
iannucci
2017/08/04 18:55:50
nit: I would rename path to luci_ctx_path or somet
|
| + env = env.copy() |
| + env['LUCI_CONTEXT'] = path |
| + |
| + with _modify_lookup_path(env.get('PATH')): |
| + proc = subprocess42.Popen( |
| + cmd, |
| + env=env, |
| + cwd=cwd, |
| + detached=True, |
| + universal_newlines=True, |
| + **fhandles) |
| + |
| + # Safe to close file handles now that subprocess has inherited them. |
| + for handle in fhandles.itervalues(): |
| + if isinstance(handle, file): |
| + handle.close() |
| + |
| + outstreams = {} |
| + linebufs = {} |
| + |
| + for key in ('stdout', 'stderr'): |
| + handle = handles.get(key) |
| + if isinstance(handle, stream.StreamEngine.Stream): |
| + outstreams[key] = handle |
| + linebufs[key] = _streamingLinebuf() |
| + |
| + if linebufs: |
| + # manually check the timeout, because we poll |
| + start_time = time.time() |
| + for pipe, data in proc.yield_any(timeout=1): |
| + if timeout and time.time() - start_time > timeout: |
| + # Don't know the name of the step, so raise this and it'll get caught |
| + raise subprocess42.TimeoutExpired(cmd, timeout) |
| + |
| + if pipe is None: |
| + continue |
| + buf = linebufs.get(pipe) |
| + if not buf: |
| + continue |
| + buf.ingest(data) |
| + for line in buf.get_buffered(): |
| + outstreams[pipe].write_line(line) |
| + else: |
| + proc.wait(timeout) |
| return proc.returncode |