#!/usr/bin/python

# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

"""
Pub buildbot steps.

Runs tests for pub and the pub packages that are hosted in the main Dart repo.
"""

import re
import sys

import bot

PUB_BUILDER = r'pub-(linux|mac|win)(-(russian))?'

def PubConfig(name, is_buildbot):
  """Returns info for the current buildbot based on the name of the builder.

  Currently, this is just:
  - mode: always "release"
  - system: "linux", "mac", or "win"
  """
  pub_pattern = re.match(PUB_BUILDER, name)
  if not pub_pattern:
    return None

  system = pub_pattern.group(1)
  locale = pub_pattern.group(3)
  if system == 'win': system = 'windows'

  return bot.BuildInfo('none', 'vm', 'release', system, checked=True,
                       builder_tag=locale)


def PubSteps(build_info):
  with bot.BuildStep('Build package-root'):
    args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
            'packages']
    print 'Building package-root: %s' % (' '.join(args))
    bot.RunProcess(args)

  common_args = ['--write-test-outcome-log']
  if build_info.builder_tag:
    common_args.append('--builder-tag=%s' % build_info.builder_tag)
                 
  bot.RunTest('pub', build_info,
              common_args + ['pub', 'pkg', 'dartdoc', 'docs'])

  pkgbuild_build_info = bot.BuildInfo('none', 'vm', 'release',
      build_info.system, checked=False)
  bot.RunTest('pkgbuild_repo_pkgs', pkgbuild_build_info,
      common_args + ['--append_logs', '--use-repository-packages', 'pkgbuild'])
  bot.RunTest('pkgbuild_public_pkgs', pkgbuild_build_info,
      common_args + ['--append_logs', '--use-public-packages', 'pkgbuild'])

if __name__ == '__main__':
  bot.RunBot(PubConfig, PubSteps)
