# 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 updating the code search super manifest project"""

from recipe_engine.recipe_api import Property

DEPS = [
    'fuchsia/checkout',
    'fuchsia/git',
    'fuchsia/jiri',
    'recipe_engine/buildbucket',
    'recipe_engine/context',
    'recipe_engine/file',
    'recipe_engine/path',
    'recipe_engine/step',
]

PROPERTIES = {
    'manifest':
        Property(kind=str, help='Jiri manifest to use.', default='flower'),
    'project':
        Property(
            kind=str,
            help='Jiri remote manifest project.',
            default='integration'),
    'remote':
        Property(
            kind=str,
            help='Remote manifest repository.',
            default='https://fuchsia.googlesource.com/integration'),
    'super_manifest_project':
        Property(
            kind=str,
            help='Super manifest project to update.',
            default='https://fuchsia.googlesource.com/super')
}

GENERATE_SCRIPT = 'setup.sh'


def RunSteps(api, manifest, project, remote, super_manifest_project):
  api.checkout.fuchsia_with_options(
      build=api.buildbucket.build,
      manifest=manifest,
      project=project,
      path=api.path['start_dir'],
      remote=remote,
  )

  super_manifest_project_path = api.path['start_dir'].join('super')
  api.file.ensure_directory('make dirs', super_manifest_project_path)

  api.git.checkout(
      url=super_manifest_project,
      path=super_manifest_project_path,
      submodules=False)

  generate_script_path = super_manifest_project_path.join(GENERATE_SCRIPT)
  with api.context(cwd=super_manifest_project_path):
    # See https://fuchsia.googlesource.com/jiri/+/master/cmd/jiri/generate-gitmodules.go
    # for details.
    api.jiri('generate-gitmodules', '--redir-root', '--generate-script',
             generate_script_path, '.gitmodules')
    api.step('run %s' % GENERATE_SCRIPT, [generate_script_path])
    api.file.remove('remove %s' % GENERATE_SCRIPT, generate_script_path)
    # Add & Push updated submodules.
    api.git('add', '.gitmodules')
    # Only commit and push if we have a diff, otherwise commit fails.
    if api.git('diff', '--cached', '--exit-code', ok_ret='any').retcode:
      api.git.commit(message='Update submodules based on jiri manifest')
      api.git('push', 'origin', 'HEAD:master')


def GenTests(api):
  yield api.test('no_diff')
  yield api.test('yes_diff') + api.step_data('git diff', retcode=1)
