#!/usr/bin/env python3
# Copyright 2017 The Dart project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Pulls down tools required to build Dart."""

import errno
import os
import platform
import subprocess
import sys

THIS_DIR = os.path.abspath(os.path.dirname(__file__))
DART_ROOT = os.path.abspath(os.path.join(THIS_DIR, '..', '..'))
BUILDTOOLS = os.path.join(DART_ROOT, 'buildtools')
TOOLS_BUILDTOOLS = os.path.join(DART_ROOT, 'tools', 'buildtools')

sys.path.insert(0, os.path.join(DART_ROOT, 'tools'))
import find_depot_tools

DEPOT_PATH = find_depot_tools.add_depot_tools_to_path()


def UpdateClangFormatOnWindows():
    sha1_file = os.path.join(TOOLS_BUILDTOOLS, 'win', 'clang-format.exe.sha1')
    output_dir = os.path.join(BUILDTOOLS, 'win', 'clang-format.exe')
    downloader_script = os.path.join(DEPOT_PATH,
                                     'download_from_google_storage.py')
    download_cmd = [
        sys.executable, downloader_script, '--no_auth', '--no_resume',
        '--quiet', '--platform=win', '--bucket', 'chromium-clang-format', '-s',
        sha1_file, '-o', output_dir
    ]
    return subprocess.call(download_cmd)


def CreateSymlink(symlink, link_name):
    try:
        os.symlink(symlink, link_name)
    except OSError as e:
        if e.errno == errno.EEXIST:
            os.remove(link_name)
            os.symlink(symlink, link_name)
        else:
            raise e


# On Mac and Linux we symlink clang-format and gn to the place where
# 'git cl format' expects them to be.
def LinksForGitCLFormat():
    if sys.platform == 'darwin':
        platform = 'darwin'
        tools = 'mac'
        toolchain = 'mac-x64'
    elif sys.platform.startswith('linux'):
        platform = 'linux'
        tools = 'linux64'
        toolchain = 'linux-x64'
    else:
        print('Unknown platform: ' + sys.platform)
        return 1

    clang_format = os.path.join(BUILDTOOLS, toolchain, 'clang', 'bin',
                                'clang-format')
    gn = os.path.join(BUILDTOOLS, 'gn')
    dest_dir = os.path.join(BUILDTOOLS, tools)
    if not os.path.exists(dest_dir):
        os.makedirs(dest_dir)
    clang_format_dest = os.path.join(dest_dir, 'clang-format')
    gn_dest = os.path.join(dest_dir, 'gn')
    CreateSymlink(clang_format, clang_format_dest)
    CreateSymlink(gn, gn_dest)
    return 0


def main(argv):
    arch_id = platform.machine()
    # Don't try to download binaries if we're on an arm machine.
    if arch_id.startswith('arm') or arch_id.startswith('aarch64'):
        print('Not downloading buildtools binaries for ' + arch_id)
        return 0
    if sys.platform.startswith('win'):
        return UpdateClangFormatOnWindows()
    return LinksForGitCLFormat()


if __name__ == '__main__':
    sys.exit(main(sys.argv))
