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

PYTHON_VERSION_COMPATIBILITY = "PY3"


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)),
  )
