# 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.


DEPS = [
  'depot_tools/depot_tools',
  'depot_tools/gclient',
  'depot_tools/gerrit',
  'depot_tools/git',
  'libyuv',
  'recipe_engine/context',
  'recipe_engine/json',
  'recipe_engine/path',
  'recipe_engine/python',
  'recipe_engine/runtime',
  'recipe_engine/step',
]


GERRIT_URL = 'https://chromium-review.googlesource.com'
GERRIT_PROJECT = 'libyuv/libyuv'


def RunSteps(api):
  api.gclient.set_config('libyuv')

  # Make sure the checkout contains all deps for all platforms.
  for os in ['linux', 'android', 'mac', 'ios', 'win', 'unix']:
    api.gclient.c.target_os.add(os)

  api.libyuv.checkout()

  with api.context(cwd=api.path['checkout']):
    # TODO(oprypin): Replace with api.service_account.default().get_email()
    # when https://crbug.com/846923 is resolved.
    push_account = ('libyuv-ci-autoroll-builder@'
                    'chops-service-accounts.iam.gserviceaccount.com')

    # Check for an open auto-roller CL.
    commits = api.gerrit.get_changes(
        GERRIT_URL,
        query_params=[
            ('project', GERRIT_PROJECT),
            ('owner', push_account),
            ('status', 'open'),
        ],
        limit=1,
    )
    if commits:
      with api.context(env={'SKIP_GCE_AUTH_FOR_GIT': '1'}):
        with api.depot_tools.on_path():
          api.git('cl', 'set-close', '--gerrit', '-i', commits[0]['_number'])
        api.step.active_result.presentation.step_text = (
            'Stale roll found. Abandoned.')

    # Enforce a clean state, and discard any local commits from previous runs.
    api.git('checkout', '-f', 'master')
    api.git('pull', 'origin', 'master')
    api.git('clean', '-ffd')

    # Run the roll script. It will take care of branch creation, modifying DEPS,
    # uploading etc. It will also delete any previous roll branch.
    script_path = api.path['checkout'].join(
        'tools_libyuv', 'autoroller', 'roll_deps.py')

    params = ['--clean', '--verbose']
    if api.runtime.is_experimental:
      params.append('--skip-cq')
    else:
      params.append('--cq-over=2000')

    with api.depot_tools.on_path():
      api.python('autoroll DEPS', script_path, params)


def GenTests(api):
  yield (
      api.test('normal_roll') +
      api.override_step_data('gerrit changes', api.json.output([]))
  )
  yield (
      api.test('normal_roll_experimental') +
      api.runtime(is_luci=True, is_experimental=True)
  )
  yield (
      api.test('stale_roll') +
      api.override_step_data(
          'gerrit changes', api.json.output([{'_number': '123'}]))
  )
