# Copyright 2016 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 building Jiri."""

from PB.recipes.fuchsia.jiri import InputProperties

PYTHON_VERSION_COMPATIBILITY = "PY3"

DEPS = [
    "fuchsia/buildbucket_util",
    "fuchsia/checkout",
    "fuchsia/cipd_util",
    "fuchsia/go",
    "fuchsia/gsutil",
    "fuchsia/jiri",
    "fuchsia/status_check",
    "recipe_engine/buildbucket",
    "recipe_engine/context",
    "recipe_engine/path",
    "recipe_engine/properties",
    "recipe_engine/step",
    "recipe_engine/time",
]

PROPERTIES = InputProperties

# The current list of platforms that we build for.
GO_OS_ARCH = (
    ("linux", "amd64"),
    ("linux", "arm64"),
    ("darwin", "amd64"),
    ("darwin", "arm64"),
)


def RunSteps(api, props):
    checkout_dir = api.checkout.with_options(
        manifest=props.manifest,
        remote=props.remote,
        project=props.project,
    )
    revision = api.checkout.project(props.project, checkout_root=checkout_dir)[
        "revision"
    ]

    staging_dir = api.path.mkdtemp("jiri")

    with api.context(
        cwd=checkout_dir.join("go/src/fuchsia.googlesource.com/jiri"),
        env_prefixes={"PATH": [api.go.go_root.join("bin")]},
    ):
        # Run all the tests.
        api.go("build", "./...")
        api.go("test", "-v", "./...")
        api.go("test", "-v", "-race", "./...")

        for goos, goarch in GO_OS_ARCH:
            with api.context(env={"GOOS": goos, "GOARCH": goarch}):
                platform = "%s-%s" % (goos.replace("darwin", "mac"), goarch)

                with api.step.nest(platform):
                    args = [
                        "build",
                        "-o",
                        staging_dir.join("jiri"),
                    ]

                    if not api.buildbucket_util.is_tryjob:
                        build_time = api.time.utcnow().isoformat()
                        ldflags = " ".join(
                            [
                                '-X "go.fuchsia.dev/jiri/version.GitCommit=%s"'
                                % revision,
                                '-X "go.fuchsia.dev/jiri/version.BuildTime=%s"'
                                % build_time,
                            ]
                        )
                        args.extend(["-ldflags", ldflags])

                    args.append("./cmd/jiri")

                    # Build the package.
                    api.go(*args)

                    if not api.buildbucket_util.is_tryjob:
                        api.cipd_util.upload_package(
                            "fuchsia/tools/jiri/%s" % platform,
                            staging_dir,
                            pkg_paths=[staging_dir.join("jiri")],
                            search_tag={"git_revision": revision},
                            repository=props.remote,
                        )

                        api.gsutil.upload(
                            "fuchsia-build",
                            staging_dir.join("jiri"),
                            api.gsutil.join("jiri", "%s-%s" % (goos, goarch), revision),
                            unauthenticated_url=True,
                            ok_ret=(0, 1),
                        )


def GenTests(api):
    yield (
        api.status_check.test("ci")
        + api.buildbucket.ci_build(
            git_repo="https://fuchsia.googlesource.com/jiri",
            revision=api.jiri.example_revision,
        )
        + api.properties(
            project="jiri",
            manifest="jiri",
            remote="https://fuchsia.googlesource.com/manifest",
        )
    )
    yield (
        api.status_check.test("cq")
        + api.buildbucket.try_build(git_repo="https://fuchsia.googlesource.com/jiri")
        + api.properties(
            project="jiri",
            manifest="jiri",
            remote="https://fuchsia.googlesource.com/manifest",
        )
    )
