# 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 updating the submodule super manifest project."""

from recipe_engine.recipe_api import Property

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

PROPERTIES = {
    "manifest": Property(kind=str, help="Jiri manifest to use.", default="flower"),
    "remote": Property(
        kind=str,
        help="Remote manifest repository.",
        default="https://fuchsia.googlesource.com/integration",
    ),
    "super_manifest_project": Property(
        kind=str,
        help="Super manifest project to update.",
        default="https://fuchsia.googlesource.com/sandbox/fuchsia",
    ),
}

GENERATE_SCRIPT = "setup.sh"
LOCAL_BRANCH_NAME = "latest"


def RunSteps(api, manifest, remote, super_manifest_project):
    api.checkout.fuchsia_with_options(
        manifest=manifest, path=api.path["start_dir"], remote=remote,
    )

    with api.context(cwd=api.path["start_dir"]):
        api.git.raw_checkout(branch=LOCAL_BRANCH_NAME)

    super_manifest_project_path = api.path["start_dir"].join("super")
    api.file.ensure_directory("make dirs", super_manifest_project_path)

    api.git.checkout(
        url=super_manifest_project, path=super_manifest_project_path, submodules=False
    )

    generate_script_path = super_manifest_project_path.join(GENERATE_SCRIPT)
    with api.context(cwd=super_manifest_project_path):
        # See https://fuchsia.googlesource.com/jiri/+/master/cmd/jiri/generate-gitmodules.go
        # for details.
        api.git.remote_add("fuchsia", api.path["start_dir"])
        api.git.fetch("fuchsia")
        api.git(
            "git merge",
            "merge",
            "-m",
            "merge upstream changes",
            "fuchsia/%s" % LOCAL_BRANCH_NAME,
        )
        api.jiri(
            "generate-gitmodules",
            "--generate-script",
            generate_script_path,
            ".gitmodules",
        )
        api.step("run %s" % GENERATE_SCRIPT, [generate_script_path])
        api.file.remove("remove %s" % GENERATE_SCRIPT, generate_script_path)
        # Add & Push updated submodules.
        api.git.add(pathspec=".gitmodules", force=True)
        # Only commit and push if we have a diff, otherwise commit fails.
        if api.git.diff(
            ref_base=None, cached=True, exit_code=True, ok_ret="any"
        ).retcode:
            api.git.commit(message="Update submodules based on jiri manifest")
            api.git.push("HEAD:master")


def GenTests(api):
    yield api.status_check.test("no_diff")
    yield api.status_check.test("yes_diff") + api.step_data("git diff", retcode=1)
