blob: 3440b383b1832086ef535c7806db39e7e7384986 [file] [log] [blame]
# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from recipe_engine import recipe_api
import textwrap
class GoApi(recipe_api.RecipeApi):
"""GoApi provides support for Go."""
def __init__(self, *args, **kwargs):
super(GoApi, self).__init__(*args, **kwargs)
self._go_dir = None
self._go_version = None
def __call__(self, *args, **kwargs):
"""Return a Go command step."""
assert self._go_dir
name = kwargs.pop('name', 'go ' + args[0])
env = kwargs.setdefault('env', {})
go_cmd = [self.go_executable]
env.setdefault('GOROOT', self._go_dir)
return self.m.step(name, go_cmd + list(args or []), **kwargs)
def ensure_go(self, version=None):
"""Ensures that go distribution is installed."""
with self.m.step.nest('ensure_go'):
with self.m.step.context({'infra_step': True}):
go_package = ('fuchsia/go/go/%s' %
self.m.cipd.platform_suffix())
self._go_dir = self.m.path['start_dir'].join('cipd', 'go')
self.m.cipd.ensure(self._go_dir,
{go_package: version or 'release'})
return self._go_dir
@property
def go_executable(self):
return self.m.path.join(self._go_dir, 'bin', 'go')
def inline(self, program, add_go_log=True, **kwargs):
"""Run an inline Go program as a step.
Program is output to a temp file and run when this step executes.
"""
program = textwrap.dedent(program)
try:
self('run', self.m.raw_io.input(program, '.go'), **kwargs)
finally:
result = self.m.step.active_result
if result and add_go_log:
result.presentation.logs['go.inline'] = program.splitlines()
return result