# 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',
]


def RunSteps(api):
  clobber = 'clobber' in api.properties
  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('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('  ')),
      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.*'),
  )
