Chromium Code Reviews| Index: recipe_modules/step/api.py |
| diff --git a/recipe_modules/step/api.py b/recipe_modules/step/api.py |
| index 4a250c1b057290e7cebcc247be4c41c866297e16..461e7eb297eaab09dff275983cd18c8f613ce58d 100644 |
| --- a/recipe_modules/step/api.py |
| +++ b/recipe_modules/step/api.py |
| @@ -4,8 +4,11 @@ |
| import contextlib |
| import copy |
| +import types |
| from recipe_engine import recipe_api |
| +from recipe_engine.config_types import Path |
| +from recipe_engine.util import Placeholder |
| # Inherit from RecipeApiPlain because the only thing which is a step is |
| @@ -137,33 +140,6 @@ class StepApi(recipe_api.RecipeApiPlain): |
| Returns: |
| Opaque step object produced and understood by recipe engine. |
| """ |
| - kwargs = {} |
| - if allow_subannotations is not None: |
| - kwargs['allow_subannotations'] = allow_subannotations |
| - if trigger_specs: |
| - kwargs['trigger_specs'] = trigger_specs |
| - if stdout: |
| - kwargs['stdout'] = stdout |
| - if stderr: |
| - kwargs['stderr'] = stderr |
| - if stdin: |
| - kwargs['stdin'] = stdin |
| - if step_test_data: |
| - kwargs['step_test_data'] = step_test_data |
| - assert cmd is None or isinstance(cmd, list) |
| - if not ok_ret: |
| - ok_ret = {0} |
| - if ok_ret in ('any', 'all'): |
| - ok_ret = set(range(-256, 256)) |
| - |
| - if cmd is not None: |
| - command = list(wrapper) |
| - command += cmd |
| - kwargs['cmd'] = command |
| - |
| - kwargs['timeout'] = timeout |
| - kwargs['ok_ret'] = ok_ret |
| - |
| # Calculate our full step name. If a step already has that name, add an |
| # index to the end of it. |
| # |
| @@ -184,25 +160,61 @@ class StepApi(recipe_api.RecipeApiPlain): |
| name_suffix = ' (%d)' % step_count |
| self._seen_steps.add(full_name) |
| + assert isinstance(cmd, (types.NoneType, list)) |
| + if cmd is not None: |
| + cmd = list(wrapper) + cmd |
| + assert all(isinstance(x, (int, long, basestring, Path, Placeholder)) |
| + for x in cmd) |
| + |
| cwd = self.m.context.cwd |
| - if cwd is not None and cwd != self.m.path['start_dir']: |
| - kwargs['cwd'] = cwd |
| - kwargs['env'] = self.m.context.env |
| + if cwd and cwd == self.m.path['start_dir']: |
| + cwd = None |
| + |
| + env = self.m.context.env |
| if self._prefix_path: |
| ps = self.m.path.pathsep |
| prefix = ps.join(self._prefix_path) |
| - suffix = kwargs['env'].get('PATH', '%(PATH)s') |
| - kwargs['env']['PATH'] = '%s%s%s' % (prefix, ps, suffix) |
| - kwargs['infra_step'] = self.m.context.infra_step or bool(infra_step) |
| - kwargs['step_nest_level'] = self.m.context.nest_level |
| - kwargs['name'] = full_name |
| - kwargs['base_name'] = name |
| - |
| - schema = self.make_config() |
| - schema.set_val(kwargs) |
| - return self.run_from_dict(schema.as_jsonish()) |
| - |
| - # TODO(martiniss) delete, and make generator_script use **kwargs on step() |
| + suffix = env.get('PATH', '%(PATH)s') |
| + env['PATH'] = '%s%s%s' % (prefix, ps, suffix) |
| + |
| + if ok_ret in ('any', 'all'): |
| + ok_ret = range(-256, 256) |
| + |
| + return self.run_step( |
| + name=full_name, |
| + base_name=full_name or name, |
| + cmd=cmd, |
| + cwd=cwd, |
| + env=env, |
| + allow_subannotations=bool(allow_subannotations), |
| + trigger_specs=[self._make_trigger_spec(trig) |
| + for trig in (trigger_specs or ())], |
| + timeout=timeout, |
| + infra_step=self.m.context.infra_step or bool(infra_step), |
| + stdout=stdout, |
| + stderr=stderr, |
| + stdin=stdin, |
| + ok_ret=ok_ret, |
| + step_test_data=step_test_data, |
| + nest_level=self.m.context.nest_level, |
| + ) |
| + |
| @recipe_api.composite_step |
| - def run_from_dict(self, dct): |
| - return self.step_client.run_step(dct) |
| + def run_step(self, **kwargs): |
| + # TODO(dnj,iannucci): Remove this once "generator_script" is deleted. Make |
| + # sure we preserve "composite_step". |
| + return self.step_client.run_step(self.step_client.StepConfig(**kwargs)) |
|
iannucci
2017/06/12 19:37:57
delete this function
dnj
2017/06/13 18:28:38
Done.
|
| + |
| + def _make_trigger_spec(self, trig): |
| + buildbot_changes = trig.get('buildbot_changes') |
| + assert isinstance(buildbot_changes, (types.NoneType, list)) |
| + |
| + critical = trig.get('critical') |
| + return self.step_client.TriggerSpec( |
| + bucket=trig.get('bucket'), |
| + builder_name=trig['builder_name'], |
| + properties=trig.get('properties'), |
| + buildbot_changes=buildbot_changes, |
| + tags=trig.get('tags'), |
| + critical=bool(critical) if critical is not None else (True), |
| + ) |