# -*- coding: utf-8 -*-
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Copied from
# https://chromium.googlesource.com/chromiumos/infra/recipes/+/HEAD/recipe_modules/repo/
# pylint: disable=missing-module-docstring

DEPS = [
    'fuchsia/status_check',
    'pigweed/repo',
    'recipe_engine/assertions',
    'recipe_engine/context',
    'recipe_engine/path',
]


def RunSteps(api):  # pylint: disable=missing-function-docstring
    with api.context(cwd=api.path['cleanup']):
        api.assertions.assertIsNone(
            api.repo._find_root()
        )  # pylint: disable=protected-access

    checkout = api.path['start_dir'].join('checkout')

    with api.context(cwd=checkout):
        api.repo.init('http://manifest_url')
        api.repo.init(
            'http://manifest_url',
            manifest_branch='mybranch',
            manifest_name='pigweed.xml',
            reference='/preload/chromeos',
            groups=['group1', 'group2'],
            depth=10,
            repo_url='http://repo_url',
            repo_rev='next',
        )
        api.repo.sync()
        api.repo.sync(
            force_sync=True,
            detach=True,
            current_branch=True,
            jobs=99,
            manifest_name='snapshot.xml',
            no_tags=True,
            optimized_fetch=True,
            cache_dir='/tmp/cache',
        )

        api.repo.sync_manifest('<manifest></manifest>')

    infos = api.repo.project_infos()
    api.assertions.assertEqual(len(infos), 3)
    api.assertions.assertEqual(infos[0].path, 'src/a')

    info = api.repo.project_info(project='foo')
    api.assertions.assertEqual(info.name, 'foo')

    api.assertions.assertEqual(
        api.repo.manifest_snapshot(), '<manifest></manifest>'
    )
    api.assertions.assertEqual(
        api.repo.manifest_snapshot('some_manifest_file'),
        '<manifest></manifest>',
    )

    snapshot_a = checkout.join('snapshot_a.xml')
    snapshot_b = checkout.join('snapshot_b.xml')
    with api.context(cwd=api.path['cleanup']):
        api.repo.diff_manifests_informational(snapshot_a, snapshot_b)

    repo_root = api.path['start_dir'].join('repo')
    api.path.mock_add_paths(repo_root.join('.repo'))
    with api.context(cwd=repo_root.join('subdir')):
        api.repo.diff_manifests_informational(snapshot_a, snapshot_b)

    from_manifest = """
    <manifest>
      <project name="NAME" path="PATH" revision="FROM_REV"/>
      <project name="NO_CHANGE" revision="NO_CHANGE_REV"/>
      <project name="DELETED" revision="REV"/>
    </manifest>
  """

    to_manifest = """
    <manifest>
      <project name="NAME" path="PATH" revision="TO_REV"/>
      <project name="NO_CHANGE" revision="NO_CHANGE_REV"/>
    </manifest>
  """

    [diff] = api.repo.diff_manifests(from_manifest, to_manifest)
    api.assertions.assertEqual(diff.name, 'NAME')
    api.assertions.assertEqual(diff.path, 'PATH')
    api.assertions.assertEqual(diff.from_rev, 'FROM_REV')
    api.assertions.assertEqual(diff.to_rev, 'TO_REV')

    api.repo.ensure_synced_checkout(
        api.path['cleanup'].join('ensure'), 'http://manifest_url'
    )

    api.repo.start('no-projects')
    api.repo.start('with-projects', projects=['project'])


def GenTests(api):
    yield api.status_check.test('setup_repo')
