# 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.joinpath('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.joinpath('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.joinpath('go_cache'),
        'GOPATH': self.gopath,
        'GOROOT': self.goroot,
        'PATH': self.m.path.pathsep.join([
            str(self.go_bin), str(self.gopath.joinpath('bin')), '%(PATH)s']),
    }

  @property
  def gopath(self):
    return self.m.vars.cache_dir.joinpath('gopath')
