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

import json


DEPS = [
  'dart',
  'depot_tools/git',
  'depot_tools/gitiles',
  'recipe_engine/buildbucket',
  'recipe_engine/context',
  'recipe_engine/file',
  'recipe_engine/json',
  'recipe_engine/path',
  'recipe_engine/properties',
]


COMMITS_JSON = 'commits.json'
LINEARIZED_REPO_REF = 'refs/heads/master'


def RunSteps(api):
  repo = api.properties['repo']
  assert(repo)
  commit = api.buildbucket.gitiles_commit
  assert(commit)
  commit_hash = commit.id

  url = 'https://%s/%s' % (commit.host, commit.project)
  commit_log = api.gitiles.commit_log(url, commit_hash)
  commit_url = '%s/+/%s' % (url, commit_hash)
  message = commit_log['message']
  message = '%s\n%s\n' % (message, commit_url)
  commit_author = commit_log['author']
  author = '%s <%s>' % (commit_author['name'], commit_author['email'])
  author_date = commit_author['time']

  api.git.checkout(
      repo,
      dir_path=api.path['cleanup'],
      ref=LINEARIZED_REPO_REF,
      use_git_cache=True)
  with api.context(cwd=api.path['checkout']):
    json_path = api.path['checkout'].join(COMMITS_JSON)
    commits = {}
    if api.path.exists(json_path):
      result = api.json.read('read old commits', json_path,
          step_test_data=lambda: api.json.test_api.output({
            'another_repo': 'deadbeef'
          })).json
      commits = result.output

    commits[commit.project] = commit_hash

    pretty_json = json.dumps(commits, indent=2, separators=(',', ':'),
                            sort_keys=True)
    api.file.write_text('update commits', json_path, pretty_json)
    api.git('add', json_path)
    api.git('commit', '--author=%s' % author, '--date=%s' % author_date,
        '-m', message)
    api.git('push', repo, 'HEAD:%s' % LINEARIZED_REPO_REF)


def GenTests(api):
  yield api.test(
      'base',
      api.properties.generic(
          repo='https://dart.googlesource.com/a/linearized_history.git'),
      api.buildbucket.ci_build(
          git_ref='refs/heads/main',
          git_repo='https://dart.googlesource.com/a/repo.git',
          revision='deadbeef'),
      api.step_data(
          'commit log: %s' % 'deadbeef',
          api.gitiles.make_commit_test_data(
              'deadbeef',
              'Subject\n\nMessage\n',
              new_files=['foo/bar', 'baz/qux'])),
      api.path.exists(api.path['checkout'].join(COMMITS_JSON)),
  )
