# Copyright 2020 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 validating that the triggering CL includes an appropriate
commit footer if it affects files that indicate it's an LSC (large-scale
change) that requires a soft transition with other repositories.

The recipe itself doesn't check which files are affected, so it's up to the
triggering policy to only trigger this build on changes that affect the
correct files.
"""

DEPS = [
    "fuchsia/gerrit",
    "fuchsia/git",
    "fuchsia/status_check",
    "recipe_engine/buildbucket",
    "recipe_engine/context",
    "recipe_engine/path",
    "recipe_engine/python",
    "recipe_engine/raw_io",
]

LSC_FOOTER = "LSC"


def RunSteps(api):
    build_input = api.buildbucket.build.input
    if not build_input.gerrit_changes:
        api.python.failing_step("not a CQ build", "LSC checks are only available in CQ")
    gerrit_change = build_input.gerrit_changes[0]

    checkout_dir = api.path.mkdtemp()
    api.git.checkout_cl(gerrit_change, checkout_dir)

    with api.context(cwd=checkout_dir):
        commit_msg = api.git.get_commit_message()
    footer_value = api.git.read_commit_footer(commit_msg, LSC_FOOTER, sep=[": ", "="])
    if not footer_value:
        api.gerrit.set_review(
            "comment on CL",
            str(gerrit_change.change),
            message=(
                "This change requires the %r footer with a link to a bug. "
                "If you don't believe this change is an LSC, please add the "
                "%r footer with a description explaining why it is not. "
                "See http://go/fuchsia-lsc for additional details."
            )
            % (LSC_FOOTER, LSC_FOOTER),
        )
        api.python.failing_step(
            "no %r footer" % LSC_FOOTER,
            "this change requires an LSC bug because of the files it touches",
        )


def GenTests(api):
    yield (
        api.status_check.test("basic")
        + api.buildbucket.try_build()
        + api.step_data(
            "get commit msg",
            api.raw_io.stream_output("Foo\n\n%s=fxbug.dev/123" % LSC_FOOTER),
        )
    )

    yield (
        api.status_check.test("colon_separator")
        + api.buildbucket.try_build()
        + api.step_data(
            "get commit msg",
            api.raw_io.stream_output("Foo\n\n%s: fxbug.dev/123" % LSC_FOOTER),
        )
    )

    yield (
        api.status_check.test("missing_footer", status="failure")
        + api.buildbucket.try_build()
        + api.step_data(
            "get commit msg", api.raw_io.stream_output("Foo\n\nChange-Id: Iabc")
        )
    )

    yield api.status_check.test("ci", status="failure") + api.buildbucket.ci_build()
