# Copyright 2016 The Chromium 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 INFRA_GO_PKG = 'go.skia.org/infra' UPDATE_GO_ATTEMPTS = 5 UPLOAD_ATTEMPTS = 5 class InfraApi(recipe_api.RecipeApi): @property def goroot(self): go_root = self.m.vars.workdir.join('go', 'go') # Starting with Go 1.18, the standard library includes "//go:embed" # directives that point to other files in the standard library. For # security reasons, the "embed" package does not support symbolic links # (discussion at # https://github.com/golang/go/issues/35950#issuecomment-561725322), and it # produces "cannot embed irregular file" errors when it encounters one. # # To prevent the above error, we ensure our GOROOT environment variable # points to a path without symbolic links. # # For some reason step.m.path.realpath returns the path unchanged, so we # invoke realpath instead. symlink_version_file = go_root.join('VERSION') # Arbitrary symlink. step_result = self.m.step('realpath go/go/VERSION', cmd=['realpath', str(symlink_version_file)], stdout=self.m.raw_io.output_text()) step_result = self.m.step('dirname', cmd=['dirname', step_result.stdout], stdout=self.m.raw_io.output_text()) go_root_nosymlinks = step_result.stdout.strip() if go_root_nosymlinks != "": return go_root_nosymlinks # pragma: nocover else: # This branch exists solely to appease recipe tests, under which the # workdir variable is unset. Returning an empty string causes tests to # fail, so we return the original GOROOT instead. return go_root @property def go_bin(self): return self.m.path.join(self.goroot, 'bin') @property def go_env(self): return { 'GOCACHE': self.m.vars.cache_dir.join('go_cache'), 'GOPATH': self.gopath, 'GOROOT': self.goroot, 'PATH': self.m.path.pathsep.join([ str(self.go_bin), str(self.gopath.join('bin')), '%(PATH)s']), } @property def gopath(self): return self.m.vars.cache_dir.join('gopath')