# -*- python -*-
# ex: set syntax=python:

# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# It has one job: define a dictionary named BuildmasterConfig. This
# dictionary has a variety of keys to control different aspects of the
# buildmaster. They are documented in docs/config.xhtml .

from buildbot.scheduler import Dependent
from buildbot.scheduler import Scheduler
from buildbot.schedulers import triggerable

from master import build_utils
from master import master_utils
from master import slaves_list
from master import status_logger
from master.factory import annotator_factory
from master.factory.dart import dart_factory
from master.factory.dart.dart_factory import (linux_env, windows_env,
    linux_clang_env, linux_asan_env_32, linux_asan_env_64)
from master.factory.dart.channels import CHANNELS

from twisted.python import log

import config
import master_site_config
ActiveMaster = master_site_config.Dart
utils = dart_factory.DartUtils(ActiveMaster)

# Hack to increase timeout for steps, dart2js debug checked mode takes more
# than 8 hours.
utils.monkey_patch_remoteshell()

MASTER_HOST = ActiveMaster.master_host
WEB_STATUS = True
MAIL_NOTIFIER = ActiveMaster.is_production_host
GOOD_REVISIONS = ActiveMaster.is_production_host

# This is the dictionary that the buildmaster pays attention to. We also use
# a shorter alias to save typing.
c = BuildmasterConfig = {}

config.DatabaseSetup(c)

# 'slavePortnum' defines the TCP port to listen on. This must match the value
# configured into the buildslaves (with their --master option)
c['slavePortnum'] = ActiveMaster.slave_port

slaves = slaves_list.SlavesList('slaves.cfg', 'Dart')

annotator = annotator_factory.AnnotatorFactory()

def setup_channel(channel):
  postfix = channel.builder_postfix

  ####### Variant definitions
  # build-base-name, category, platform, builder, tester
  # env are relative to the dart root directory.

  def category(name):
    return '%d%s%s|all' % (channel.position, name, channel.category_postfix)

  variants = [
    {
      'name': 'dart-sdk-linux' + postfix,
      'category': category('4dart-sdk'),
      'platform': 'posix' + postfix,
      'env': linux_env,
    },
    {
      'name': 'dart-sdk-windows' + postfix,
      'category': category('4dart-sdk'),
      'platform': 'windows' + postfix,
      'env': windows_env,
    },
    {
      'name': 'dart-sdk-mac' + postfix,
      'category': category('4dart-sdk'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'analyzer_experimental-linux-release' + postfix,
      'category': category('30analyzer'),
      'platform': 'posix' + postfix,
      'mode': 'release',
      'arch': 'ia32',
      'env': linux_env,
    },
    {
      'name': 'dart2js-dump-info' + postfix,
      'category': category('2dart2js'),
      'platform': 'posix' + postfix,
      'env': linux_env,
    },
    {
      'name': 'pub-mac' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'pub-linux' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'posix' + postfix,
      'env': linux_env,
    },
    {
      'name': 'pkg-mac' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'pkg-linux' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'posix' + postfix,
      'env': linux_env,
    },
    {
      'name': 'pkg-win' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'windows' + postfix,
      'env': windows_env,
      'auto_reboot': True,
    },
    {
      'name': 'version-checker' + postfix,
      'category': category('99misc'),
      'platform': 'posix' + postfix,
      'env': linux_env,
    },
    {
      'name': 'linux-distribution-support-debian_wheezy' + postfix,
      'category': category('99misc'),
      'platform': 'posix' + postfix,
    },
  ]


  # Only run ie 9 tests on stable channel
  if channel.name == 'stable':
    variants.append({
      'name': 'dart2js-ie9-win7-all' + postfix,
      'category': category('92dart2js-windows'),
      'platform': 'windows' + postfix,
      'env': windows_env,
    })

  # Add recipe-based dart builders and testers
  variants_recipe_special_trigger = [
    {
      'name': 'target-arm-vm-linux-release' + postfix,
      'category': category('1vm-misc'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart_cross_tester'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'dart2js-linux-drt-1-2' + postfix,
      'category': category('8chrome'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'dart2js-linux-drt-2-2' + postfix,
      'category': category('8chrome'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'dart2js-linux-drt-csp-minified' + postfix,
      'category': category('8chrome'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'dart2js-win8-ie10' + postfix,
      'category': category('91ie'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'windows' + postfix,
      'builddir': 'w8-10' + postfix,
    },
    {
      'name': 'dart2js-win8-ie11' + postfix,
      'category': category('91ie'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'windows' + postfix,
      'builddir': 'w8-11' + postfix,
    },
    {
      'name': 'dart2js-mac10.11-safari-1-3' + postfix,
      'builddir': '10.11-1' + postfix,
      'category': category('90safari'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'dart2js-mac10.11-safari-2-3' + postfix,
      'builddir': '10.11-2' + postfix,
      'category': category('90safari'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'dart2js-mac10.11-safari-3-3' + postfix,
      'builddir': '10.11-3' + postfix,
      'category': category('90safari'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'dart2js-mac10.11-chrome' + postfix,
      'builddir': '10.11-c' + postfix,
      'category': category('8chrome'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'pkg-mac10.11-debug' + postfix,
      'builddir': 'pmd' + postfix,
      'category': category('94pub-pkg'),
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'pkg-linux-debug' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'posix' + postfix,
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'env': linux_env,
    },
    {
      'name': 'pkg-win7-debug' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'windows' + postfix,
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'env': windows_env,
      'auto_reboot': True,
    },
    {
      'name': 'pkg-mac10.11-release' + postfix,
      'builddir': 'pmr' + postfix,
      'category': category('94pub-pkg'),
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'pkg-linux-release' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'posix' + postfix,
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'env': linux_env,
    },
    {
      'name': 'pkg-win7-release' + postfix,
      'category': category('94pub-pkg'),
      'platform': 'windows' + postfix,
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'env': windows_env,
      'auto_reboot': True,
    },
    {
      'name': 'analyzer-mac10.11-release' + postfix,
      'builddir': 'azr' + postfix,
      'category': category('30analyzer'),
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'analyzer-linux-release' + postfix,
      'category': category('30analyzer'),
      'platform': 'posix' + postfix,
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'env': linux_env,
    },
    {
      'name': 'analyzer-win7-release' + postfix,
      'category': category('30analyzer'),
      'platform': 'windows' + postfix,
      'factory_builder': annotator.BaseFactory(recipe='dart/packages'),
      'env': windows_env,
    },
  ]

  for shard in range(1,6):
    variants_recipe_special_trigger.append({
      'name': ('dart2js-linux-d8-hostchecked-%s-5' % shard) + postfix,
      'category': category('20dart2js-d8-hostchecked'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js'),
      'platform': 'posix' + postfix,
    })

  for shard in range(1,6):
    variants_recipe_special_trigger.append({
      'name': ('dart2js-linux-d8-minified-%s-5' % shard) + postfix,
      'category': category('20dart2js-d8-minified'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    })

  for shard in range(1,5):
    variants_recipe_special_trigger.append({
      'name': ('dart2js-linux-jsshell-%s-4' % shard) + postfix,
      'category': category('23dart2js-jsshell'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    })

  for shard in range(1,5):
    variants_recipe_special_trigger.append({
      'name': ('dart2js-linux-chromeff-%s-4' % shard) + postfix,
      'category': category('7dart2js-linux'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
      'platform': 'posix' + postfix,
    })

  for browser in ['win7-ie10chrome', 'win7-ie11ff']:
    for shard in range(1,5):
      builddir = '%s_%s' % ('ie11' if 'ie11' in browser else 'ie10', shard)
      variants_recipe_special_trigger.append({
        'name': ('dart2js-%s-%s-4' % (browser, shard)) + postfix,
        'category': category('92dart2js-windows'),
        'factory_builder': annotator.BaseFactory(recipe='dart/dart2js_nobuild'),
        'platform': 'windows' + postfix,
        'builddir': builddir + postfix,
      })


  variants_vm_recipe = [
    {
      'name': 'vm-win-debug-ia32-russian' + postfix,
      'category': category('1vm-misc'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
      'platform': 'windows' + postfix,
    },
    {
      'name': 'vm-linux-product-x64' + postfix,
      'category': category('1vm-product'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'vm-win-product-x64' + postfix,
      'category': category('1vm-product'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
      'platform': 'windows' + postfix,
    },
    {
      'name': 'vm-mac-product-x64' + postfix,
      'category': category('1vm-product'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'vm-noopt-simarm-mac-1-2' + postfix,
      'category': category('1vm-precomp'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart',
          factory_properties={
              'target_arch': 'simarm',
              'build_targets': ['runtime_precompiled'],
              'test_args': ['-cprecompiler', '-rdart_precompiled',
                            '--exclude-suite=pkg',
                            '--shard=1', '--shards=2']}),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'vm-noopt-simarm-mac-2-2' + postfix,
      'category': category('1vm-precomp'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart',
          factory_properties={
              'target_arch': 'simarm',
              'build_targets': ['runtime_precompiled'],
              'test_args': ['-cprecompiler', '-rdart_precompiled',
                            '--exclude-suite=pkg',
                            '--shard=2', '--shards=2']}),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'vm-noopt-simarm64-mac' + postfix,
      'category': category('1vm-precomp'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart',
          factory_properties={
              'target_arch': 'simarm64',
              'build_targets': ['runtime_precompiled'],
              'test_args': ['-cprecompiler', '-rdart_precompiled',
                            '--exclude-suite=pkg']}),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'vm-precomp-android-release-1-3' + postfix,
      'category': category('1vm-precomp'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart',
          factory_properties={
            'target_arch': 'arm',
            'build_args': ['--os=android'],
            'build_targets': ['runtime_precompiled'],
            'test_args': ['-cprecompiler', '-rdart_precompiled',
                          '--exclude-suite=pkg',
                          '--system=android',
                          '--use-blobs',
                          '--shard=1',
                          '--shards=3']}),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'vm-precomp-android-release-2-3' + postfix,
      'category': category('1vm-precomp'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart',
          factory_properties={
            'target_arch': 'arm',
            'build_args': ['--os=android'],
            'build_targets': ['runtime_precompiled'],
            'test_args': ['-cprecompiler', '-rdart_precompiled',
                          '--exclude-suite=pkg',
                          '--system=android',
                          '--use-blobs',
                          '--shard=2',
                          '--shards=3']}),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'vm-precomp-android-release-3-3' + postfix,
      'category': category('1vm-precomp'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart',
          factory_properties={
            'target_arch': 'arm',
            'build_args': ['--os=android'],
            'build_targets': ['runtime_precompiled'],
            'test_args': ['-cprecompiler', '-rdart_precompiled',
                          '--exclude-suite=pkg',
                          '--system=android',
                          '--use-blobs',
                          '--shard=3',
                          '--shards=3']}),
      'platform': 'posix' + postfix,
    },
    {
      'name': 'cross-arm-vm-linux-release' + postfix,
      'category': category('1vm-misc'),
      'factory_builder': annotator.BaseFactory(
          recipe='dart/dart_cross_compiler'),
      'platform': 'posix' + postfix,
    },
    # These is a recipe builder that triggers all builders dependent on the sdk.
    # When the sdk builders are converted to recipes, they will do it instead.
    {
      'name': 'sdk-trigger' + postfix,
      'category': category('4dart-sdk'),
      'factory_builder': annotator.BaseFactory(recipe='dart/sdk_trigger'),
      'platform': 'posix' + postfix
    },
  ]

  for platform in ['linux', 'mac', 'win']:
    for arch in ['x64', 'ia32']:
      for mode in ['debug', 'release']:
        variants_vm_recipe.append({
          'name': 'vm-%s-%s-%s' % (platform, mode, arch) + postfix,
          'category': category('1vm'),
          'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
          'platform': ('windows' if platform == 'win' else 'posix') + postfix
        })

  for arch in ['simmips', 'simarm', 'simarm64']:
    for mode in ['debug', 'release']:
      if arch == 'simarm64' and mode == 'debug': continue
      variants_vm_recipe.append({
        'name': 'vm-linux-%s-%s' % (mode, arch) + postfix,
        'category': category('1vm'),
        'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
        'platform': 'posix' + postfix
      })

  for type in ['asan', 'optcounter-threshold']:
    for arch in ['ia32', 'x64']:
      variants_vm_recipe.append({
        'name': 'vm-linux-release-%s-%s' % (arch, type) + postfix,
        'category': category('1vm-misc'),
        'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
        'platform': 'posix' + postfix
      })

  for runtime in ['app', 'precomp']:
    for mode in ['debug', 'release', 'product']:
      if runtime == 'precomp' and mode == 'release': continue
      variants_vm_recipe.append({
        'name': ('%s-linux-%s-x64' % (runtime, mode)) + postfix,
        'category': category('1vm-%s' % runtime),
        'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
        'platform': 'posix' + postfix,
      })

  for mode in ['debug', 'release']:
    variants_vm_recipe.append({
      'name': ('vm-linux-%s-x64-reload' % mode) + postfix,
      'category': category('1vm-reload'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
      'platform': 'posix' + postfix,
    })
    variants_vm_recipe.append({
      'name': ('vm-linux-%s-x64-reload-rollback' % mode) + postfix,
      'category': category('1vm-reload'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dart_vm'),
      'platform': 'posix' + postfix,
    })

  variants_dartium = []

  ####### Don't run dartium-inc on dev/stable
  if channel.name == 'be' or channel.name == 'integration':
    variants_dartium.extend([
      {
        'name' : 'dartium-mac-inc' + postfix,
        'category' : category('6dartium-inc'),
      },
      {
        'name' : 'dartium-lucid64-inc' + postfix,
        'category' : category('6dartium-inc'),
      },
      {
        'name': 'dartium-win-inc-ninja' + postfix,
        'category' : category('6dartium-inc'),
        'builddir': 'w-' + postfix,
      },
    ])

  variants_dartium_full_mac = [
    {
      'name' : 'dartium-mac-full' + postfix,
      'category' : category('97dartium-full'),
    },
  ]

  variants_dartium_full_linux = [
    {
      'name' : 'dartium-lucid64-full' + postfix,
      'category' : category('97dartium-full'),
    },
    {
      'name' : 'dartium-lucid32-full' + postfix,
      'category' : category('97dartium-full'),
    },
  ]

  variants_dartium_full_win = [
    {
      'name' : 'dartium-win-full' + postfix,
      'category' : category('97dartium-full'),
    },
  ]


  ####### Dartium integration overrides, we only use the dartium builders there
  if channel.name == 'integration':
    variants = []
    variants_vm_recipe = []
    variants_recipe_special_trigger = []

  # Add the dartium recipe builders after clearing on the integration branch,
  # so they are also on that branch.
  variants_vm_recipe.append({
    'name': ('dartium-linux-x64') + postfix,
    'category': category('97dartium-full'),
    'factory_builder': annotator.BaseFactory(recipe='dart/dartium'),
    'platform': 'posix' + postfix,
  })
  for platform in ['linux', 'mac', 'win']:
    variants_vm_recipe.append({
      'name': ('dartium-%s-ia32' % platform) + postfix,
      'category': category('97dartium-full'),
      'factory_builder': annotator.BaseFactory(recipe='dart/dartium'),
      'platform': ('windows' if platform == 'win' else 'posix') + postfix,
    })
    if channel.name == 'be' or channel.name == 'integration':
      variants_vm_recipe.append({
        'name': ('dartium-%s-ia32-inc' % platform) + postfix,
        'category': category('6dartium-inc'),
        'factory_builder': annotator.BaseFactory(recipe='dart/dartium'),
        'platform': ('windows' if platform == 'win' else 'posix') + postfix,
      })


  ####### Factory setup

  utils.setup_factories(variants)
  utils.setup_dartium_factories(variants_dartium)
  utils.setup_dartium_factories(variants_dartium_full_mac)
  utils.setup_dartium_factories(variants_dartium_full_linux)
  utils.setup_dartium_factories(variants_dartium_full_win)

  ####### Schedulers

  # builder names
  builder_names = utils.get_builder_names(variants)
  vm_recipe_builder_names = utils.get_builder_names(variants_vm_recipe)
  dartium_builder_names = utils.get_builder_names(variants_dartium)
  dartium_full_linux_builder_names = (
      utils.get_builder_names(variants_dartium_full_linux))
  dartium_full_mac_builder_names = (
      utils.get_builder_names(variants_dartium_full_mac))
  dartium_full_win_builder_names = (
      utils.get_builder_names(variants_dartium_full_win))

  if channel.name in ['be', 'integration']:
    # normal builders + dartium builders
    c['schedulers'].append(Scheduler(
        name='main' + postfix,
        branch=channel.branch,
        treeStableTimer=0,
        builderNames=builder_names +
                     dartium_builder_names +
                     vm_recipe_builder_names +
                     dartium_full_linux_builder_names +
                     dartium_full_mac_builder_names +
                     dartium_full_win_builder_names
    ))
  else:
    c['schedulers'].append(Scheduler(
        name='main' + postfix,
        branch=channel.branch,
        treeStableTimer=0,
        builderNames=builder_names + dartium_builder_names +
                     vm_recipe_builder_names))

    s_dartium_linux = Scheduler(
        name='dartium-linux' + postfix,
        branch=channel.branch,
        treeStableTimer=0,
        builderNames=dartium_full_linux_builder_names)
    s_dartium_mac = Scheduler(
        name='dartium-mac' + postfix,
        branch=channel.branch,
        treeStableTimer=0,
        builderNames=dartium_full_mac_builder_names)
    s_dartium_win = Scheduler(
        name='dartium-win' + postfix,
        branch=channel.branch,
        treeStableTimer=0,
        builderNames=dartium_full_win_builder_names)
    c['schedulers'].append(s_dartium_linux)
    c['schedulers'].append(s_dartium_mac)
    c['schedulers'].append(s_dartium_win)


  ####### Builders

  # Add non-dartium builders
  for collection in [variants, variants_vm_recipe,
                     variants_recipe_special_trigger]:
    for b in utils.get_builders_from_variants(collection, slaves, []):
      c['builders'].append(b)

  # Add dartium builders
  for collection in [variants_dartium, variants_dartium_full_linux,
                     variants_dartium_full_mac, variants_dartium_full_win]:
    # Reboot VMs after every build
    for b in utils.get_builders_from_variants(collection, slaves, [],
                                              ActiveMaster.is_production_host):
      c['builders'].append(b)

c['builders'] = []
c['schedulers'] = []
for channel in CHANNELS:
  setup_channel(channel)

####### CHANGESOURCES

c['change_source'] = [
    utils.get_github_mirror_poller('dart-lang',
                                   'sdk',
                                   branch='master',
                                   master='main'),
    utils.get_github_mirror_poller('dart-lang',
                                   'sdk',
                                   branch='dev',
                                   master='main'),
    utils.get_github_mirror_poller('dart-lang',
                                   'sdk',
                                   branch='stable',
                                   master='main'),
    utils.get_github_mirror_poller('dart-lang',
                                   'sdk',
                                   branch='integration',
                                   master='main')]

####### BUILDSLAVES

c['slaves'] = utils.get_slaves(c['builders'])

# Make sure everything works together.
master_utils.VerifySetup(c, slaves)

# Prioritize the builders depending on channel.
c['prioritizeBuilders'] = utils.prioritize_builders

####### STATUS TARGETS

# 'status' is a list of Status Targets. The results of each build will be
# pushed to these targets. buildbot/status/*.py has a variety to choose from,
# including web pages, email senders, and IRC bots.

c['status'] = [status_logger.StatusEventLogger()]

if WEB_STATUS:
  for status in utils.get_web_statuses():
    c['status'].append(status)

if MAIL_NOTIFIER:
  # We have people that are interested in a specific subset of the builders
  # and want to be notified whenever they break.
  mail_notifiers = [
    {
      'extraRecipients': ['whesse+botfailures@google.com',],
      'builders': None,  # None means all builders
      'sendToInterestedUsers': True,
    },
    {
      'extraRecipients': ['ricow@google.com', 'whesse@google.com',
                          'kasperl@google.com'],
      'builders': ['version-checker-dev', 'version-checker-stable'],
      'subject': 'VERSION file breakage - bad build',
      'sendToInterestedUsers': True,
    }
  ]

  for notifier in utils.get_mail_notifier_statuses(mail_notifiers):
    c['status'].append(notifier)

if GOOD_REVISIONS:
  from master import goodrevisions
  # We use this basically to decide if the vm in release mode, dart2js on d8,
  # and dartium inc succeeded.
  factory_map = []
  def is_important(name):
    # Only bleeding edge builds matter
    if not name.endswith('-be'):
      return False
    # Linux vm and dart2js v8 bots
    important = ['vm-linux-release-ia32', 'vm-linux-release-x64',
                 'dart2js-linux-release-minified']
    for prefix in important:
      if name.startswith(prefix):
        return True
    if 'dartium' in name and '-inc' in name:
      return True

  for b in c['builders']:
    if is_important(b['name']):
      factory_map.append((b['name'], b['factory']))

  log.msg("LKGR based on: %s " % [b[0] for b in factory_map])

  any_steps = build_utils.ExtractFactoriesSteps(factory_map)
  c['status'].append(goodrevisions.GoodRevisions(
      good_revision_steps=any_steps,
      store_revisions_url=ActiveMaster.store_revisions_url))


# Keep last build logs, the default is too low.
c['buildHorizon'] = 1000
c['logHorizon'] = 500
# Must be at least 2x the number of slaves.
c['eventHorizon'] = 700

# Template generation is using 40 entries, so give it a little extra.
c['buildCacheSize'] = 42

c['properties'] = {'mastername': master_utils.GetMastername()}

####### PROJECT IDENTITY

# the 'projectName' string will be used to describe the project that this
# buildbot is working on. For example, it is used as the title of the
# waterfall HTML page. The 'projectURL' string will be used to provide a link
# from buildbot HTML pages to your project's home page.

c['projectName'] = ActiveMaster.project_name
c['projectURL'] = config.Master.project_url

# the 'buildbotURL' string should point to the location where the buildbot's
# internal web server (usually the html.Waterfall page) is visible. This
# typically uses the port number set in the Waterfall 'status' entry, but
# with an externally-visible host name which the buildbot cannot figure out
# without some help.

c['buildbotURL'] = ActiveMaster.buildbot_url
