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

from urlparse import urlparse

from recipe_engine import post_process

from PB.recipes.fuchsia.roll_comment import InputProps

DEPS = [
    "fuchsia/gerrit",
    "fuchsia/git",
    "fuchsia/gitiles",
    "fuchsia/status_check",
    "recipe_engine/buildbucket",
    "recipe_engine/json",
    "recipe_engine/properties",
    "recipe_engine/step",
]

PROPERTIES = InputProps

# The value of this footer should be an https git repo URL.
ROLLED_REPO_FOOTER = "Rolled-Repo"

# This footer should have values of the form "<start_commit>..<end_commit>"
# (where <start_commit> is the old pinned revision, rather than the first
# rolled commit). For example, "9c21da0..5051fd4" includes all the commits
# after 9c21da0, up to and including 5051fd4.
ROLLED_COMMITS_FOOTER = "Rolled-Commits"

REVIEWED_ON_FOOTER = "Reviewed-on"
CHANGE_ID_FOOTER = "Change-Id"

# Copybara will add one of these footers to commits copied from Piper or
# another Gerrit host where the copy of the commit didn't go through Gerrit.
COPYBARA_FOOTERS = (
    "GitOrigin-RevId",
    "PiperOrigin-RevId",
)


def RunSteps(api, props):
    max_attempts = props.max_attempts or 3
    commit = api.buildbucket.build.input.gitiles_commit
    assert (
        commit.host and commit.project and commit.id
    ), "recipe must be triggered by a gitiles commit"

    dest_repo = "https://%s/%s" % (commit.host, commit.project)
    dest_log = api.gitiles.log(
        dest_repo, commit.id, limit=1, step_name="get commit message"
    )
    commit_msg = dest_log[0]["message"]

    source_repo = api.git.read_commit_footer(commit_msg, ROLLED_REPO_FOOTER)
    if not source_repo:
        api.step('no "%s" footer in commit message' % ROLLED_REPO_FOOTER, None)
        return

    commit_range = api.git.read_commit_footer(commit_msg, ROLLED_COMMITS_FOOTER)
    assert commit_range, 'found "%s" footer but no "%s" footer' % (
        ROLLED_REPO_FOOTER,
        ROLLED_COMMITS_FOOTER,
    )

    source_log = api.gitiles.log(source_repo, commit_range, step_name="log source repo")

    gerrit_host = api.gerrit.host_from_remote_url(source_repo)
    roll_cl_url = "http://go/roll-cl/%s" % commit.id

    # Defer results because comment failures shouldn't prevent the roller from
    # commenting on the rest of the changes.
    with api.step.nest("comment successful roll"), api.step.defer_results():
        for rolled_commit in source_log:
            revision = rolled_commit["id"]
            commit_msg = rolled_commit["message"]

            change_id = api.git.read_commit_footer(commit_msg, CHANGE_ID_FOOTER)
            reviewed_on = api.git.read_commit_footer(commit_msg, REVIEWED_ON_FOOTER)

            # TODO(47289): If we make the error output of the gerrit CLI more
            # structured and informative, we can remove this footer-checking logic.
            # We can instead always attempt to comment on the CL, and handle a
            # failure differently based on the cause as reported by the output.
            skip_reason = None
            if not change_id:
                # If no Change-Id is in the message then commenting will fail, so don't
                # bother trying to comment. We retrieve and pass the change number into
                # gerrit.set_review() because Change-Ids are sometimes copied when
                # cherry-picking and are less reliable than a change number at uniquely
                # identifying a CL.
                skip_reason = "no %s" % CHANGE_ID_FOOTER
            elif any(
                api.git.read_commit_footer(commit_msg, footer)
                for footer in COPYBARA_FOOTERS
            ):
                # Skip any commits made by Copybara that bypassed Gerrit.
                skip_reason = "copybara bypassed gerrit"
            elif not reviewed_on:
                # All Fuchsia-owned repos set the Reviewed-on footer for
                # commits that go through Gerrit. So if a commit doesn't set
                # the footer then either it came from a non-Fuchsia-owned repo
                # or it didn't go through Gerrit. In either case we shouldn't
                # try to add a comment.
                skip_reason = "no %s footer" % REVIEWED_ON_FOOTER
            elif urlparse(reviewed_on).netloc != gerrit_host:
                # If this is a Gerrit commit but it was reviewed on a different host,
                # skip it. This applies to repos that are mirrors of other
                # Gerrit-managed repos, such as Go.
                skip_reason = "reviewed on different gerrit host"

            if skip_reason:
                step = api.step("skipping %s" % revision, None).get_result()
                step.presentation.step_text = skip_reason
                continue

            change_number = urlparse(reviewed_on).path.split("/")[-1]
            assert change_number.isdigit(), "Invalid change number in %s URL: %s" % (
                REVIEWED_ON_FOOTER,
                reviewed_on,
            )

            api.gerrit.set_review(
                "comment on %s" % revision,
                change_number,
                host=gerrit_host,
                message="Change has been successfully rolled: %s" % roll_cl_url,
                test_data=api.json.test_api.output({}),
                max_attempts=max_attempts,
            )
            cl_link = "https://%s/c/%s" % (gerrit_host, change_number)
            api.step.active_result.presentation.links["gerrit link"] = cl_link


def GenTests(api):
    default_props = api.properties(max_attempts=3)

    remote = "https://foo.googlesource.com/bar-project"
    gerrit_project = "https://foo-review.googlesource.com/c/bar-project"

    yield (
        api.status_check.test("basic")
        + default_props
        + api.buildbucket.ci_build()
        + api.gitiles.log(
            "get commit message",
            "A",
            n=1,
            extra_footers={
                ROLLED_REPO_FOOTER: remote,
                ROLLED_COMMITS_FOOTER: "1000005..100000a",
            },
        )
        + api.gitiles.log(
            "log source repo",
            "B",
            n=6,
            add_change_id=True,
            extra_footers={REVIEWED_ON_FOOTER: "%s/+/12345" % gerrit_project},
        )
    )

    yield (
        api.status_check.test("no_reviewed_on")
        + default_props
        + api.buildbucket.ci_build()
        + api.gitiles.log(
            "get commit message",
            "A",
            n=1,
            extra_footers={
                ROLLED_REPO_FOOTER: remote,
                ROLLED_COMMITS_FOOTER: "1000005..100000a",
            },
        )
        + api.gitiles.log("log source repo", "B", n=1, add_change_id=True)
    )

    yield (
        api.status_check.test("no_change_ids")
        + default_props
        + api.buildbucket.ci_build()
        + api.gitiles.log(
            "get commit message",
            "A",
            n=1,
            extra_footers={
                ROLLED_REPO_FOOTER: remote,
                ROLLED_COMMITS_FOOTER: "1000005..100000a",
            },
        )
        + api.gitiles.log("log source repo", "B", n=1, add_change_id=False)
    )

    yield (
        api.status_check.test("different_gerrit_host")
        + default_props
        + api.buildbucket.ci_build()
        + api.gitiles.log(
            "get commit message",
            "A",
            n=1,
            extra_footers={
                ROLLED_REPO_FOOTER: remote,
                ROLLED_COMMITS_FOOTER: "1000005..100000a",
            },
        )
        + api.gitiles.log(
            "log source repo",
            "B",
            n=1,
            add_change_id=True,
            extra_footers={
                REVIEWED_ON_FOOTER: "https://go-review.googlesource.com/go",
            },
        )
    )

    yield (
        api.status_check.test("copybara")
        + default_props
        + api.buildbucket.ci_build()
        + api.gitiles.log(
            "get commit message",
            "A",
            n=1,
            extra_footers={
                ROLLED_REPO_FOOTER: remote,
                ROLLED_COMMITS_FOOTER: "1000005..100000a",
            },
        )
        + api.gitiles.log(
            "log source repo",
            "B",
            n=1,
            add_change_id=True,
            extra_footers={COPYBARA_FOOTERS[0]: 1234},
        )
        + api.post_process(post_process.DoesNotRunRE, r"comment on")
    )

    yield (
        api.status_check.test("no_footers")
        + default_props
        + api.buildbucket.ci_build()
        + api.gitiles.log("get commit message", "A", n=1)
    )

    # If we get a Gerrit error commenting on the first CL, we should still try
    # comment on the second one.
    yield (
        api.status_check.test("failed_comment", status="failure")
        + api.properties(max_attempts=1)
        + api.buildbucket.ci_build()
        + api.gitiles.log(
            "get commit message",
            "A",
            n=1,
            extra_footers={
                ROLLED_REPO_FOOTER: remote,
                ROLLED_COMMITS_FOOTER: "100000a..100000b",
            },
        )
        + api.step_data(
            "log source repo",
            api.json.output(
                [
                    {
                        "id": "100000a",
                        "message": "\n".join(
                            [
                                "%s: Iabc" % CHANGE_ID_FOOTER,
                                "%s: %s/+/12345" % (REVIEWED_ON_FOOTER, gerrit_project),
                            ]
                        ),
                    },
                    {
                        "id": "100000b",
                        "message": "\n".join(
                            [
                                "%s: Ixyz" % CHANGE_ID_FOOTER,
                                "%s: %s/+/5678" % (REVIEWED_ON_FOOTER, gerrit_project),
                            ]
                        ),
                    },
                ]
            ),
        )
        + api.step_data("comment successful roll.comment on 100000a", retcode=1)
        + api.post_process(
            post_process.MustRun, "comment successful roll.comment on 100000b"
        )
    )
