# 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 checking lockfile integrity."""

from recipe_engine.recipe_api import Property

DEPS = [
    "fuchsia/checkout",
    "fuchsia/git",
    "fuchsia/jiri",
    "fuchsia/status_check",
    "recipe_engine/buildbucket",
    "recipe_engine/context",
    "recipe_engine/path",
    "recipe_engine/properties",
    "recipe_engine/step",
]

PROPERTIES = {
    "project": Property(kind=str, help="Jiri remote manifest project", default=None),
    "manifest": Property(kind=str, help="Jiri manifest to use"),
    "remote": Property(kind=str, help="Remote manifest repository"),
    "lockfile_script": Property(
        kind=str,
        help="Script file that updates the lockfiles",
        default="update-lockfiles.sh",
    ),
}


def RunSteps(api, project, manifest, remote, lockfile_script):
    with api.context(infra_steps=True):
        api.checkout.with_options(
            path=api.path["start_dir"],
            manifest=manifest,
            remote=remote,
            project=project,
        )

    project_dir = api.path["start_dir"].join(*project.split("/"))
    lockfile_script_path = project_dir.join(lockfile_script)
    with api.context(cwd=project_dir):
        diff_before_script = api.git.diff().stdout.strip()
        api.step(
            "run %s" % lockfile_script, [lockfile_script_path, "--jiri", api.jiri.jiri]
        )
        diff_after_script = api.git.diff().stdout.strip()
        if diff_before_script != diff_after_script:  # pragma: no cover
            raise api.step.StepFailure(
                "lockfiles are not properly updated, please run {} and resubmit your change\nBefore:{}\nAfter:{}".format(
                    lockfile_script, diff_before_script, diff_after_script
                )
            )


def GenTests(api):
    default_properties = api.properties(
        project="integration",
        manifest="minimal",
        remote="https://fuchsia.googlesource.com",
        lockfile_script="update-lockfiles.sh",
    )

    yield api.status_check.test(
        "default"
    ) + default_properties + api.buildbucket.try_build(
        git_repo="https://fuchsia.googlesource.com/integration"
    )
