#!/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 the flutter framework repository (flutter/flutter).

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.

Try jobs use github directly but are also registered with luci-cq
to take advantage of led recipe builder tests.
"""

load("//lib/ci_yaml/ci_yaml.star", "ci_yaml")
load("//lib/common.star", "common")
load("//lib/release_branches/release_branches.star", "release_branches")
load("//lib/repos.star", "repos")

def _flutter_properties():
    properties = {
        "use_cas": True,
    }
    return properties

def _setup():
    """Default configurations for branches and repos."""
    master_triggering_policy = scheduler.greedy_batching(
        max_batch_size = 20,
        max_concurrent_invocations = 1,
    )
    release_triggering_policy = scheduler.greedy_batching(
        max_batch_size = 1,
        max_concurrent_invocations = 3,
    )
    ci_yaml.generate(
        "flutter",
        "stable",
        release_branches.stable.version,
        release_branches.stable.testing_ref,
        {},
        _flutter_properties(),
        release_triggering_policy,
        recipes_ref = release_branches.stable.recipes_ref,
    )
    _drone_prod_builders("stable-", release_branches.stable.recipes_ref)
    ci_yaml.generate(
        "flutter",
        "beta",
        release_branches.beta.version,
        release_branches.beta.testing_ref,
        {},
        _flutter_properties(),
        release_triggering_policy,
        recipes_ref = release_branches.beta.recipes_ref,
    )
    _drone_prod_builders("beta-", release_branches.beta.recipes_ref)
    ci_yaml.generate(
        "flutter",
        "dev",
        release_branches.dev.version,
        release_branches.dev.testing_ref,
        {},
        _flutter_properties(),
        release_triggering_policy,
        recipes_ref = release_branches.dev.recipes_ref,
    )
    _drone_prod_builders("dev-", release_branches.dev.recipes_ref)
    ci_yaml.generate(
        "flutter",
        "master",
        release_branches.master.version,
        release_branches.master.testing_ref,
        {},
        _flutter_properties(),
        master_triggering_policy,
        recipes_ref = release_branches.master.recipes_ref,
    )
    _drone_prod_builders("", release_branches.master.recipes_ref)
    _drone_try_builders()

def _drone_prod_builders(prefix, recipes_ref):
    """Generate drone builders to help with subshards."""
    recipes = ["flutter/flutter_drone"]
    for recipe in recipes:
        luci.recipe(
            name = "%s%s" % (prefix, recipe),
            recipe = recipe,
            cipd_package = "flutter/recipe_bundles/flutter.googlesource.com/recipes",
            cipd_version = "refs/heads/main",
            use_bbagent = True,
        )
    ci_yaml_config = ci_yaml.ci_yaml("flutter", "master")
    platform_properties = ci_yaml.platform_properties(ci_yaml_config)
    common.linux_prod_builder(
        name = "%sLinux SDK Drone" % prefix,
        recipe = "flutter/flutter_drone",
        console_view_name = None,
        caches = ci_yaml.swarming_caches(ci_yaml_config, None, "linux"),
        dimensions = {"device_type": "none"},
        os = platform_properties["linux"]["os"],
    )
    common.mac_prod_builder(
        name = "%sMac SDK Drone" % prefix,
        recipe = "flutter/flutter_drone",
        console_view_name = None,
        dimensions = {"device_type": "none"},
        caches = ci_yaml.swarming_caches(ci_yaml_config, None, "mac"),
        os = platform_properties["mac"]["os"],
    )
    common.windows_prod_builder(
        name = "%sWindows SDK Drone" % prefix,
        recipe = "flutter/flutter_drone",
        console_view_name = None,
        caches = ci_yaml.swarming_caches(ci_yaml_config, None, "windows"),
        dimensions = {"device_type": "none"},
        os = platform_properties["windows"]["os"],
    )

def _drone_try_builders():
    """Generate drone builders to help with subshards."""
    list_view_name = "flutter-try"
    ci_yaml_config = ci_yaml.ci_yaml("flutter", "master")
    platform_properties = ci_yaml.platform_properties(ci_yaml_config)
    common.linux_try_builder(
        name = "Linux SDK Drone|drn",
        recipe = "flutter/flutter_drone",
        repo = repos.GIT_REMOTE["flutter"],
        list_view_name = list_view_name,
        caches = ci_yaml.swarming_caches(ci_yaml_config, None, "linux"),
        dimensions = {"device_type": "none"},
        os = platform_properties["linux"]["os"],
    )
    common.mac_try_builder(
        name = "Mac SDK Drone|drn",
        recipe = "flutter/flutter_drone",
        repo = repos.GIT_REMOTE["flutter"],
        list_view_name = list_view_name,
        dimensions = {"device_type": "none"},
        caches = ci_yaml.swarming_caches(ci_yaml_config, None, "mac"),
        os = platform_properties["mac"]["os"],
    )
    common.windows_try_builder(
        name = "Windows SDK Drone|drn",
        recipe = "flutter/flutter_drone",
        repo = repos.GIT_REMOTE["flutter"],
        list_view_name = list_view_name,
        caches = ci_yaml.swarming_caches(ci_yaml_config, None, "windows"),
        dimensions = {"device_type": "none"},
        os = platform_properties["windows"]["os"],
    )

flutter_config = struct(setup = _setup)
