# Copyright 2018 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 post_process


DEPS = [
  'dart',
  'depot_tools/git',
  'recipe_engine/buildbucket',
  'recipe_engine/path',
  'recipe_engine/properties',
  'recipe_engine/step',
  'recipe_engine/raw_io',
]

PYTHON_VERSION_COMPATIBILITY = "PY3"


def RunSteps(api):
  clobber = api.properties.get('clobber', False)
  api.dart.checkout(clobber)
  dart = api.dart.dart_executable()
  find_base_commit = api.path['checkout'].join(
      'tools', 'bots', 'find_base_commit.dart')
  result = api.step('find base commit', [dart, find_base_commit],
      stdout=api.raw_io.output_text(add_output_log=True))
  commit_hash = result.stdout.strip()
  # todo(athom): use something like api.buildbucket.gitiles_commit.ref instead
  # The base branch is fast forwarded to the most recent commit with a complete
  # set of test results. find_base_commit.dart is responsible for identifying
  # that commit.
  ref = 'refs/heads/base'
  # Guard against the empty string here to avoid deleting the remote branch
  assert(commit_hash)
  api.git('push', 'https://dart.googlesource.com/sdk.git',
      '%s:%s' % (commit_hash, ref),
      name='push %s to %s' % (commit_hash, ref))


def GenTests(api):
  yield api.test(
      'base',
      api.step_data(
          'find base commit', stdout=api.raw_io.output_text('deadbeef')),
      api.buildbucket.ci_build(
          project='dart',
          bucket='ci',
          builder='base',
          git_repo='https://dart.googlesource.com/a/sdk.git',
      ),
  )

  yield api.test(
      'no_hash',
      api.step_data('find base commit', stdout=api.raw_io.output_text('  ')),
      api.buildbucket.ci_build(
          project='dart',
          bucket='ci',
          builder='base',
          git_repo='https://dart.googlesource.com/a/sdk.git',
      ),
      api.expect_exception('AssertionError'),
      api.post_process(post_process.DropExpectation),
      api.post_process(post_process.DoesNotRunRE, 'push.*'),
  )
