#!/usr/bin/env python3

# Copyright (c) 2014, 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.
"""
Buildbot steps for src tarball generation and debian package generation

Package up the src of the dart repo and create a debian package.
Archive tarball and debian package to google cloud storage.
"""

import os
import re
import subprocess
import sys

import bot_utils

utils = bot_utils.GetUtils()

HOST_OS = utils.GuessOS()

def InstallFromDep(builddir):
    for entry in os.listdir(builddir):
        if entry.endswith("_amd64.deb"):
            path = os.path.join(builddir, entry)
            Run(['dpkg', '-i', path])


def UninstallDart():
    Run(['dpkg', '-r', 'dart'])


def CreateDartTestFile(tempdir):
    filename = os.path.join(tempdir, 'test.dart')
    with open(filename, 'w') as f:
        f.write('import "dart:collection";\n\n')
        f.write('void main() {\n')
        f.write('  print("Hello world");\n')
        f.write('}')
    return filename


def Run(command):
    print("Running: %s" % ' '.join(command))
    sys.stdout.flush()
    no_color_env = dict(os.environ)
    no_color_env['TERM'] = 'nocolor'
    exit_code = subprocess.call(command, env=no_color_env)
    if exit_code != 0:
        raise OSError(exit_code)


def TestInstallation(assume_installed=True):
    paths = ['/usr/bin/dart']
    for tool in ['dart2js', 'pub', 'dart', 'dartanalyzer']:
        paths.append(os.path.join('/usr/lib/dart/bin', tool))
    for path in paths:
        if os.path.exists(path):
            if not assume_installed:
                print('Assumed not installed, found %s' % path)
                sys.exit(1)
        else:
            if assume_installed:
                print('Assumed installed, but could not find %s' % path)
                sys.exit(1)


def SrcSteps():
    version = utils.GetVersion()
    builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
                            'src_and_installation')

    if not os.path.exists(builddir):
        os.makedirs(builddir)
    tarfilename = 'dart-%s.tar.gz' % version
    tarfile = os.path.join(builddir, tarfilename)

    print('Validating that we are on debian jessie')
    args = ['cat', '/etc/os-release']
    (stdout, stderr, exitcode) = bot_utils.run(args)
    if exitcode != 0:
        print("Could not find linux system, exiting")
        sys.exit(1)
    if not "jessie" in stdout:
        print("Trying to build debian bits but not on debian Jessie")
        print("You can't fix this, please contact dart-engprod@")
        sys.exit(1)

    print('Building src tarball')
    Run([
        sys.executable, './tools/create_tarball.py', '--tar_filename', tarfile
    ])

    print('Building Debian packages')
    Run([
        sys.executable, './tools/create_debian_packages.py', '--tar_filename',
        tarfile, '--out_dir', builddir
    ])

    if os.path.exists('/usr/bin/dart') or os.path.exists(
            '/usr/lib/dart/bin/dart2js'):
        print("Dart already installed, removing")
        UninstallDart()
    TestInstallation(assume_installed=False)

    InstallFromDep(builddir)
    TestInstallation(assume_installed=True)

    # We build the runtime target to get everything we need to test the
    # standalone target.
    Run([sys.executable, './tools/build.py', '-mrelease', '-ax64', 'runtime'])
    # Copy in the installed binary to avoid poluting /usr/bin (and having to
    # run as root)
    Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])

    # Sanity check dart2js and the analyzer against a hello world program
    with utils.TempDir() as temp_dir:
        test_file = CreateDartTestFile(temp_dir)
        Run(['/usr/lib/dart/bin/dart2js', test_file])
        Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
        Run(['/usr/lib/dart/bin/dart', test_file])

    # Sanity check that pub can start up and print the version
    Run(['/usr/lib/dart/bin/pub', '--version'])

    UninstallDart()
    TestInstallation(assume_installed=False)


if __name__ == '__main__':
    SrcSteps()
