#!/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-12"
MAC_ARM64_OS = "Mac-12"

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