#!/usr/bin/env vpython3

# Copyright (c) 2016 The WebRTC 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 in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Downloads precompiled tools.

These are checked into the repository as SHA-1 hashes (see *.sha1 files in
subdirectories). Note that chrome-webrtc-resources is a Google-internal bucket,
so please download and compile these tools manually if this script fails.
"""

import os
import sys

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
SRC_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
sys.path.append(os.path.join(SRC_DIR, 'build'))

import find_depot_tools
find_depot_tools.add_depot_tools_to_path()
import gclient_utils
import subprocess2


def main(directories):
  if not directories:
    directories = [SCRIPT_DIR]

  for path in directories:
    cmd = [
        sys.executable,
        os.path.join(find_depot_tools.DEPOT_TOOLS_PATH,
                     'download_from_google_storage.py'),
        '--directory',
        '--num_threads=10',
        '--bucket',
        'chrome-webrtc-resources',
        '--auto_platform',
        '--recursive',
        path,
    ]
    print('Downloading precompiled tools...')

    # Perform download similar to how gclient hooks execute.
    try:
      gclient_utils.CheckCallAndFilter(cmd,
                                       cwd=SRC_DIR,
                                       always_show_header=True)
    except (gclient_utils.Error, subprocess2.CalledProcessError) as e:
      print('Error: %s' % str(e))
      return 2
    return 0


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