# Copyright 2019 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.
"""Recipe for building and publishing fastboot to CIPD."""

import os

DEPS = [
    'fuchsia/buildbucket_util',
    'fuchsia/git',
    'fuchsia/macos_sdk',
    'fuchsia/upload',
    'recipe_engine/buildbucket',
    'recipe_engine/cipd',
    'recipe_engine/context',
    'recipe_engine/file',
    'recipe_engine/isolated',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/raw_io',
    'recipe_engine/step',
]

ANDROID_SOURCE_REPO = 'https://android.googlesource.com/platform/manifest'
ANDROID_SOURCE_BRANCH = 'platform-tools-29.0.4'
FASTBOOT_CIPD_NAME = 'fuchsia/third_party/fastboot/${platform}'
REPO_CIPD_PKG = ('fuchsia/third_party/repo', 'version:1.13.2', 'repo')

# The source file that checks whether the host filesystem is case-sensitive,
# a fails if not, along with the pattern that matches the invocation of that
# check within.
FILE_WITH_CASE_SENSITIVITY_CHECK = ('build', 'soong', 'ui', 'build', 'build.go')
CASE_SENSITIVITY_CHECK_PATTERN = 'checkCaseSensitivity(ctx, config)'


def RunSteps(api):
  cipd_dir = api.path['start_dir'].join('cipd')
  pkgs = api.cipd.EnsureFile()
  pkgs.add_package(*REPO_CIPD_PKG)
  api.cipd.ensure(cipd_dir, pkgs)
  repo_dir = cipd_dir.join('repo')

  src_dir = api.path['start_dir'].join('android', 'src')
  api.file.ensure_directory('ensure source directory', src_dir)
  with api.context(cwd=src_dir):
    api.step('repo init', [
        repo_dir.join('repo'),
        'init',
        '-u', ANDROID_SOURCE_REPO,
        '-b', ANDROID_SOURCE_BRANCH,
    ]) # yapf: disable
    api.step('repo sync', [
        repo_dir.join('repo'),
        'sync',
        '-j%d' % api.platform.cpu_count,
    ]) # yapf: disable

  if api.platform.is_mac:
    with api.step.nest('disable case-sensitivity check'):
      # Necessary hack! Disable the check so that we can build on macs.
      case_checking_file = src_dir.join(*FILE_WITH_CASE_SENSITIVITY_CHECK)
      relpath = os.sep.join(FILE_WITH_CASE_SENSITIVITY_CHECK)
      contents = api.file.read_text(
          'read in %s' % relpath,
          case_checking_file,
          test_data='blah\n%s\nblah' % CASE_SENSITIVITY_CHECK_PATTERN)
      contents = contents.replace(CASE_SENSITIVITY_CHECK_PATTERN, '')
      api.file.write_text('write back to %s' % relpath, case_checking_file,
                          contents)

  fastboot_dir = src_dir.join('system', 'core', 'fastboot')
  with api.context(cwd=fastboot_dir):
    repository = api.git.get_remote_url('aosp')
    revision = api.git.get_hash()

  out_dir = api.path.mkdtemp('fastboot').join('out')
  with api.macos_sdk(), api.context(cwd=src_dir, env={'OUT_DIR': out_dir}):
    # Soong is a work-in-progress build system that works well enough to build
    # fastboot alone.
    # (See https://source.android.com/setup/build#what_is_soong.)
    # We can bootstrap everything needed to invoke soong through the 'soong_ui'
    # bash script.
    soong_ui_script = src_dir.join('build', 'soong', 'soong_ui.bash')
    android_host_os = {
        'linux': 'linux',
        'mac': 'darwin',
    }[api.platform.name]
    android_host_arch = {
        'intel': {
            64: 'x86',
        }
    }[api.platform.arch][api.platform.bits]
    android_host_platform = '%s-%s' % (android_host_os, android_host_arch)
    out_bin_dir = out_dir.join('host', android_host_platform, 'bin')
    fastboot = out_bin_dir.join('fastboot')
    api.step('build fastboot', [soong_ui_script, '--make-mode', fastboot])

  upload_paths = [api.upload.FilePath(fastboot)]
  if api.buildbucket_util.is_tryjob:
    api.upload.upload_isolated(out_bin_dir, upload_paths=upload_paths)
  else:
    api.upload.cipd_package(
        FASTBOOT_CIPD_NAME,
        out_bin_dir,
        upload_paths,
        search_tag={'git_revision': revision},
        extra_tags={'git_branch': ANDROID_SOURCE_BRANCH},
        repository=repository,
    )


def GenTests(api):
  revision = 'a' * 40
  ci_build = api.buildbucket.ci_build(
      project='android',
      bucket='ci',
      git_repo='https://android.googlesource.com/platform/system/core',
      revision=revision,
  )
  try_build = api.buildbucket.try_build(
      project='android',
      bucket='try',
      git_repo='https://android.googlesource.com/platform/system/core',
      revision=revision,
  )
  for os in ('linux', 'mac'):
    yield api.test('try-%s' % os) + try_build + api.platform.name(os)

    yield (api.test('ci-%s-cipd_pkg_exists' % os) + ci_build +
           api.platform.name(os))

    yield (api.test('ci-%s-cipd_pkg_new' % os) + ci_build +
           api.step_data('git rev-parse', api.raw_io.stream_output(revision)) +
           api.platform.name(os) + api.step_data(
               'cipd.cipd search %s git_revision:%s' %
               (FASTBOOT_CIPD_NAME, revision),
               api.cipd.example_search(FASTBOOT_CIPD_NAME, [])))
