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

"""Update submodules in a Git repository."""

from PB.recipes.fuchsia.submodule_roller import InputProperties

DEPS = [
    "fuchsia/auto_roller",
    "fuchsia/buildbucket_util",
    "fuchsia/git",
    "fuchsia/git_checkout",
    "recipe_engine/context",
    "recipe_engine/properties",
]

PROPERTIES = InputProperties


def RunSteps(api, props):
    checkout_dir, _ = api.git_checkout(
        props.remote,
        # No need to actually check out all the submodules, we're just going to
        # update their pinned versions.
        submodules=False,
    )

    with api.context(cwd=checkout_dir):
        api.git.update_submodule(
            paths=props.submodule_paths,
            # We don't initializing submodules during the checkout. `git
            # submodule update` doesn't work on uninitialized submodules, so we
            # have to initialize the submodules that we're rolling.
            init=True,
            remote=True,
            # Don't bother fetching objects.
            fetch=False,
        )

    if len(props.submodule_paths) == 1:
        commit_message = f"[roll] Update {props.submodule_paths[0]}"
    else:
        commit_message = "[roll] Update submodules"
    change = api.auto_roller.attempt_roll(
        props.roll_options, repo_dir=checkout_dir, commit_message=commit_message
    )
    return api.auto_roller.raw_result(change)


def GenTests(api):
    def properties(**kwargs):
        props = {
            "submodule_paths": ["a", "b", "c/d", "e"],
            "remote": "https://fuchsia.googlesource.com/integration",
            "roll_options": {
                "remote": "https://fuchsia.googlesource.com/integration",
            },
        }
        props.update(kwargs)
        return api.properties(**props)

    yield api.buildbucket_util.test(
        "roll", builder="submodule-roller"
    ) + api.auto_roller.success() + properties()

    yield api.buildbucket_util.test(
        "one_submodule", builder="submodule-roller"
    ) + api.auto_roller.success() + properties(submodule_paths=["foo/bar"])
