#!/usr/bin/env lucicfg
# Copyright 2020 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
Configurations for packaging builders.

The schedulers pull commits indirectly from GoB repo (https://chromium.googlesource.com/external/github.com/flutter/flutter)
which is mirrored from https://github.com/flutter/flutter.
"""

load("//lib/common.star", "common")
load("//lib/timeout.star", "timeout")

# Global OS variables
LINUX_OS = "Linux"
WINDOWS_OS = "Windows"
MAC_OS = "Mac-10.15"
MAC_ARM64_OS = "Mac-11.6"

# Linux caches
LINUX_DEFAULT_CACHES = [
    # Android SDK
    swarming.cache(name = "android_sdk", path = "android"),
    # Chrome
    swarming.cache(name = "chrome_and_driver", path = "chrome"),
    # OpenJDK
    swarming.cache(name = "openjdk", path = "java"),
    # PubCache
    swarming.cache(name = "pub_cache", path = ".pub-cache"),
    # Flutter SDK code
    swarming.cache(name = "flutter_sdk", path = "flutter sdk"),
]

def _setup(branches):
    platform_args = {
        "linux": {
            "os": LINUX_OS,
        },
        "mac": {
            "os": MAC_OS,
        },
        "mac_arm64": {
            "os": MAC_ARM64_OS,
            "dimensions": {"cpu": "arm"},
        },
        "windows": {
            "os": WINDOWS_OS,
        },
    }

    packaging_recipe("packaging/packaging", branches.stable.recipes_ref)
    packaging_prod_config(
        platform_args,
        "stable",
        branches.stable.release_ref,
        branches.stable.recipes_ref,
    )

    packaging_recipe("packaging/packaging", branches.beta.recipes_ref)
    packaging_prod_config(
        platform_args,
        "beta",
        branches.beta.release_ref,
        branches.beta.recipes_ref,
    )

    packaging_recipe("packaging/packaging", branches.dev.recipes_ref)
    packaging_prod_config(
        platform_args,
        "dev",
        branches.dev.release_ref,
        branches.dev.recipes_ref,
    )

    packaging_prod_config(
        platform_args,
        "master",
        # Note for master, there is no distinction between testing_ref &
        # release_ref
        "refs/heads/master",
        branches.master.recipes_ref,
    )

def builder_name(pattern, branch):
    return pattern % (branch.capitalize(), branch)

def packaging_recipe(name, recipes_ref):
    luci.recipe(
        name = common.full_recipe_name(name, recipes_ref),
        recipe = name,
        cipd_package = "flutter/recipe_bundles/flutter.googlesource.com/recipes",
        cipd_version = recipes_ref,
        use_bbagent = True,
    )

def packaging_prod_config(platform_args, branch, ref, recipes_ref):
    """Prod configurations for packaging flutter framework artifacts.

    Args:
      platform_args(dict): Dictionary with default properties with platform as
        key.
      branch(str): The branch name we are creating configurations for.
      ref(str): The git ref we are creating configurations for.
      recipes_ref(str): The git ref used to select the recipes package.
    """

    # Defines console views for prod builders
    console_view_name = ("packaging" if branch == "master" else "%s_packaging" % branch)
    luci.console_view(
        name = console_view_name,
        # TODO(chillers): Migrate packaging builders to ci.yaml. https://github.com/flutter/flutter/issues/100806
        repo = "https://chromium.googlesource.com/external/github.com/flutter/flutter",
        refs = [ref],
    )

    # Defines prod schedulers
    trigger_name = branch + "-gitiles-trigger-packaging"
    luci.gitiles_poller(
        name = trigger_name,
        bucket = "prod",
        # TODO(chillers): Migrate packaging builders to ci.yaml. https://github.com/flutter/flutter/issues/100806
        repo = "https://chromium.googlesource.com/external/github.com/flutter/flutter",
        refs = [ref],
    )

    # Defines triggering policy
    if branch == "master":
        triggering_policy = scheduler.greedy_batching(
            max_concurrent_invocations = 6,
        )
    else:
        triggering_policy = scheduler.greedy_batching(
            max_concurrent_invocations = 3,
        )

    # Select which firebase project to upload the docs to.
    firebase_project = ""
    if branch == "stable":
        firebase_project = "docs-flutter-dev"

    # Packaging docs builds are only done on master and stable channels
    # However, ci.yaml generates the master build
    if branch in ("stable"):
        common.linux_prod_builder(
            name = "Linux%s docs_publish|docs" % ("" if branch == "master" else " " + branch),
            recipe = "%s-flutter/flutter" % "main",
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            properties = {
                "validation": "docs",
                "validation_name": "Docs",
                "dependencies": [{"dependency": "dashing"}, {"dependency": "firebase"}, {"dependency": "curl"}],
                "firebase_project": firebase_project,
                # This determines which release channel docs to deploy
                "release_ref": ref,
            },
            caches = LINUX_DEFAULT_CACHES,
            os = LINUX_OS,
            execution_timeout = timeout.LONG,
            expiration_timeout = timeout.LONG_EXPIRATION,
        )

    # Packaging should only build from release branches and never from master. This
    # is to prevent using excesive amount of resources to package something we will
    # never use.
    if branch in ("dev", "beta", "stable"):
        # Defines framework prod builders
        common.linux_prod_builder(
            name = builder_name("Linux Flutter %s Packaging|%s", branch),
            recipe = common.full_recipe_name("packaging/packaging", recipes_ref),
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            priority = 25,
            **platform_args["linux"]
        )
        common.mac_prod_builder(
            name = builder_name("Mac Flutter %s Packaging|%s", branch),
            recipe = common.full_recipe_name("packaging/packaging", recipes_ref),
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            priority = 25,
            **platform_args["mac"]
        )

        # Enable this builder for dev and beta only. The arm64 packages do not exist
        # yet on stable.
        if branch in ("dev", "beta"):
            common.mac_prod_builder(
                name = builder_name("Mac Arm64 Flutter %s Packaging|%s", branch),
                recipe = common.full_recipe_name("packaging/packaging", recipes_ref),
                console_view_name = console_view_name,
                triggered_by = [trigger_name],
                triggering_policy = triggering_policy,
                priority = 25,
                **platform_args["mac_arm64"]
            )
        common.windows_prod_builder(
            name = builder_name("Windows Flutter %s Packaging|%s", branch),
            recipe = common.full_recipe_name("packaging/packaging", recipes_ref),
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            priority = 25,
            **platform_args["windows"]
        )

packaging_config = struct(setup = _setup)
