#!/usr/bin/env python
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import hashlib
import logging
import os
import shutil
import subprocess
import sys
import tempfile
import zipfile

from collections import namedtuple
from platform import system

from compat import urlretrieve

# The format for the deps below is the following:
# (target_folder, source_url, sha1, target_platform)
# |source_url| can be either a git repo or a http url.
# If a git repo, |sha1| is the committish that will be checked out.
# If a http url, |sha1| is the shasum of the original file.
# If the url is a .zip or .tgz file it will be automatically deflated under
# |target_folder|, taking care of stripping the root folder if it's a single
# root (to avoid ending up with buildtools/protobuf/protobuf-1.2.3/... and have
# instead just buildtools/protobuf).
# |target_platform| is either 'darwin', 'linux' or 'all' and applies the dep
# only on the given platform

# Dependencies required to build code on the host or when targeting desktop OS.
BUILD_DEPS_HOST = [
    # GN
    ('buildtools/mac/gn',
     'https://storage.googleapis.com/perfetto/gn-mac-b5b65ca39d93a7cde9fa713be31b114755252f28',
     'b5b65ca39d93a7cde9fa713be31b114755252f28', 'darwin'),
    ('buildtools/linux64/gn',
     'https://storage.googleapis.com/perfetto/gn-linux64-1370d9c5358868b7b66292821b6fe61950826870',
     '1370d9c5358868b7b66292821b6fe61950826870', 'linux'),

    # clang-format
    ('buildtools/mac/clang-format',
     'https://storage.googleapis.com/chromium-clang-format/025ca7c75f37ef4a40f3a67d81ddd11d7d0cdb9b',
     '025ca7c75f37ef4a40f3a67d81ddd11d7d0cdb9b', 'darwin'),
    ('buildtools/linux64/clang-format',
     'https://storage.googleapis.com/chromium-clang-format/942fc8b1789144b8071d3fc03ff0fcbe1cf81ac8',
     '942fc8b1789144b8071d3fc03ff0fcbe1cf81ac8', 'linux'),
    # Keep the SHA1 in sync with |clang_format_rev| in chromium //buildtools/DEPS.
    ('buildtools/clang_format/script',
     'https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git',
     '96636aa0e9f047f17447f2d45a094d0b59ed7917', 'all'),

    # Ninja
    ('buildtools/mac/ninja',
     'https://storage.googleapis.com/perfetto/ninja-mac-c15b0698da038b2bd2e8970c14c75fadc06b1add',
     'c15b0698da038b2bd2e8970c14c75fadc06b1add', 'darwin'),
    ('buildtools/linux64/ninja',
     'https://storage.googleapis.com/perfetto/ninja-linux64-c866952bda50c29a669222477309287119bbb7e8',
     'c866952bda50c29a669222477309287119bbb7e8', 'linux'),

    # Keep in sync with Android's //external/googletest/README.version.
    ('buildtools/googletest.zip',
     'https://github.com/google/googletest/archive/3f05f651ae3621db58468153e32016bc1397800b.zip',
     '86384688f7c533ad325a505efc917e0cdf39a0ce', 'all'),

    # Keep in sync with Android's //external/protobuf/README.version.
    ('buildtools/protobuf.zip',
     'https://github.com/google/protobuf/releases/download/v3.0.0-beta-3/protobuf-cpp-3.0.0-beta-3.zip',
     '3caec60aa9d8eefc8c3c3201b6b8ca19935edb89', 'all'),

    # libc++, libc++abi and libunwind for Linux where we need to rebuild the C++
    # lib from sources. Keep the SHA1s in sync with Chrome's src/buildtools/DEPS.
    ('buildtools/libcxx',
     'https://chromium.googlesource.com/chromium/llvm-project/libcxx.git',
     '5938e0582bac570a41edb3d6a2217c299adc1bc6', 'all'),
    ('buildtools/libcxxabi',
     'https://chromium.googlesource.com/chromium/llvm-project/libcxxabi.git',
     '0d529660e32d77d9111912d73f2c74fc5fa2a858', 'all'),
    ('buildtools/libunwind',
     'https://chromium.googlesource.com/external/llvm.org/libunwind.git',
     '69d9b84cca8354117b9fe9705a4430d789ee599b', 'all'),

    # Keep the revision in sync with Chrome's PACKAGE_VERSION in
    # tools/clang/scripts/update.py.
    ('buildtools/clang.tgz',
     'https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-365097-f7e52fbd-8.tgz',
     'fe1b1e5bd7381ae655661cb9658487389561568d', 'linux'),

    # Keep in sync with chromium DEPS.
    ('buildtools/libfuzzer',
     'https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git',
     'b9f51dc8c98065df0c8da13c051046f5bab833db', 'linux'),

    # Benchmarking tool.
    ('buildtools/benchmark.zip',
     'https://github.com/google/benchmark/archive/v1.3.0.zip',
     'f387e0df37d54bfd5be239e8d0d3ea2e2c3e34f4', 'all'),

    # Libbacktrace, for stacktraces in Linux/Android debug builds.
    ('buildtools/libbacktrace.zip',
     'https://github.com/ianlancetaylor/libbacktrace/archive/177940370e4a6b2509e92a0aaa9749184e64af43.zip',
     'b723fe9d671d1ab54df1297f6afbf2893a41c3ea', 'all'),

    # Sqlite for the trace processing library.
    # This is the amalgamated source whose compiled output is meant to be faster.
    # We still pull the full source for the extensions (not amalgamated).
    ('buildtools/sqlite.zip',
     'https://storage.googleapis.com/perfetto/sqlite-amalgamation-3250300.zip',
     'b78c2cb0d2c9182686c582312479f96a82bf5380', 'all'),
    ('buildtools/sqlite_src.zip',
     'https://storage.googleapis.com/perfetto/sqlite-src-3250300.zip',
     'd1af2883bb800852946f9bf8ab6055e7698e18ee', 'all'),

    # JsonCpp for legacy json import. Used only by the trace processor in
    # standalone builds.
    ('buildtools/jsoncpp.zip',
     'https://github.com/open-source-parsers/jsoncpp/archive/1.0.0.zip',
     '3219e26f2e249bb46b7d688478208c7ec138fea4', 'all'),

    # These dependencies are for libunwindstack, which is used by src/profiling.
    ('buildtools/android-core',
     'https://android.googlesource.com/platform/system/core.git',
     '3f407fcc37b401c91784700c0a691ba8b1f7ef15', 'all'),
    ('buildtools/lzma',
     'https://android.googlesource.com/platform/external/lzma.git',
     '7851dce6f4ca17f5caa1c93a4e0a45686b1d56c3', 'all'),
    ('buildtools/zlib',
     'https://android.googlesource.com/platform/external/zlib.git',
     'dfa0646a03b4e1707469e04dc931b09774968fe6', 'all'),
    ('buildtools/bionic',
     'https://android.googlesource.com/platform/bionic.git',
     'a60488109cda997dfd83832731c8527feaa2825e', 'all'),

    # Example traces for regression tests.
    (
        'buildtools/test_data.zip',
        'https://storage.googleapis.com/perfetto/test-data-20191025-102200.zip',
        '25a61211f82cd73c6ce5b67da9d73f046de7b3f9',
        'all',
    ),

    # Linenoise, used only by trace_processor in standalone builds.
    ('buildtools/linenoise',
     'https://fuchsia.googlesource.com/third_party/linenoise.git',
     'c894b9e59f02203dbe4e2be657572cf88c4230c3', 'all'),
]

# Dependencies required to build Android code.
# URLs and SHA1s taken from:
# - https://dl.google.com/android/repository/repository-11.xml
# - https://dl.google.com/android/repository/sys-img/android/sys-img.xml
BUILD_DEPS_ANDROID = [
    # Android NDK
    ('buildtools/ndk.zip',
     'https://dl.google.com/android/repository/android-ndk-r17b-darwin-x86_64.zip',
     'f990aafaffec0b583d2c5420bfa622e52ac14248', 'darwin'),
    ('buildtools/ndk.zip',
     'https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip',
     'dd5762ee7ef4995ad04fe0c45a608c344d99ca9f', 'linux'),
]

# Dependencies required to run Android tests.
TEST_DEPS_ANDROID = [
    # Android emulator images.
    ('buildtools/aosp-arm.zip',
     'https://storage.googleapis.com/perfetto/aosp-02022018-arm.zip',
     'a480d5e7d3ca888b0a58fe15ce76b1791537429a', 'all'),

    # platform-tools.zip contains adb binaries.
    ('buildtools/android_sdk/platform-tools.zip',
     'https://dl.google.com/android/repository/platform-tools_r26.0.0-darwin.zip',
     'e75b6137dc444f777eb02f44a6d9819b3aabff82', 'darwin'),
    ('buildtools/android_sdk/platform-tools.zip',
     'https://dl.google.com/android/repository/platform-tools_r26.0.0-linux.zip',
     '00de8a6631405b617c10f68cd11ff2e1cd528e23', 'linux'),

    # Android emulator binaries.
    ('buildtools/emulator',
     'https://android.googlesource.com/platform/prebuilts/android-emulator.git',
     '4b260028dc27bc92c39bee9129cb2ba839970956', 'all'),
]

# This variable is updated by tools/roll-catapult-trace-viewer.
CATAPULT_SHA1 = 'ff5d8fd7244680b4d4456c25d5fdc04c76f9ef66'

TYPEFACES_SHA1 = '756b0a015b8f99f5718f7fdf967d052c1ec55ab3'

UI_DEPS = [
    ('buildtools/nodejs.tgz',
     'https://storage.googleapis.com/perfetto/node-v10.3.0-darwin-x64.tar.gz',
     '6d9a122785f38c256add3b25f74adf125497861a', 'darwin'),
    ('buildtools/nodejs.tgz',
     'https://storage.googleapis.com/perfetto/node-v10.3.0-linux-x64.tar.xz',
     '118f6ea19f75089b3f12ac2ddfce357bff872b5e', 'linux'),
    ('buildtools/emsdk/emscripten.tgz',
     'https://storage.googleapis.com/perfetto/emscripten-1.37.40.tar.gz',
     '588c28221321ebbdfc8e3a6f47ea6106f589669b', 'all'),
    ('buildtools/emsdk/llvm.tgz',
     'https://storage.googleapis.com/perfetto/emscripten-llvm-e1.37.40-darwin.tar.gz',
     '7a894ef0a52821c62f6abaac552dc4ce5d424607', 'darwin'),
    ('buildtools/emsdk/llvm.tgz',
     'https://storage.googleapis.com/perfetto/emscripten-llvm-e1.37.40-static-linux.tar.gz',
     '478501b9b7a14884e546c84efe209a90052cbb07', 'linux'),
    ('buildtools/d8.tgz',
     'https://storage.googleapis.com/perfetto/d8-linux-5.7.492.65.tar.gz',
     '95e82ad7faf0a6f74d950c2aa65e3858b7bdb6c6', 'linux'),
    ('buildtools/d8.tgz',
     'https://storage.googleapis.com/perfetto/d8-darwin-6.6.346.32.tar.gz',
     '1abd630619bb1977ab62095570a113d782a1545d', 'darwin'),
    ('buildtools/catapult_trace_viewer.tgz',
     'https://storage.googleapis.com/perfetto/catapult_trace_viewer-%s.tar.gz' %
     CATAPULT_SHA1, CATAPULT_SHA1, 'all'),
    ('buildtools/typefaces.tgz',
     'https://storage.googleapis.com/perfetto/typefaces-%s.tar.gz' %
     TYPEFACES_SHA1, TYPEFACES_SHA1, 'all')
]

ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


def ReadFile(path):
  if not os.path.exists(path):
    return None
  with open(path) as f:
    return f.read().strip()


def MkdirRecursive(path):
  # Works with both relative and absolute paths
  cwd = '/' if path.startswith('/') else ROOT_DIR
  for part in path.split('/'):
    cwd = os.path.join(cwd, part)
    if not os.path.exists(cwd):
      os.makedirs(cwd)
    else:
      assert (os.path.isdir(cwd))


def HashLocalFile(path):
  if not os.path.exists(path):
    return None
  with open(path, 'rb') as f:
    return hashlib.sha1(f.read()).hexdigest()


def ExtractZipfilePreservePermissions(zf, info, path):
  zf.extract(info.filename, path=path)
  target_path = os.path.join(path, info.filename)
  min_acls = 0o755 if info.filename.endswith('/') else 0o644
  os.chmod(target_path, (info.external_attr >> 16) | min_acls)


def IsGitRepoCheckoutOutAtRevision(path, revision):
  return ReadFile(os.path.join(path, '.git', 'HEAD')) == revision


def CheckoutGitRepo(path, git_url, revision):
  if IsGitRepoCheckoutOutAtRevision(path, revision):
    return False
  if os.path.exists(path):
    shutil.rmtree(path)
  MkdirRecursive(path)
  logging.info('Fetching %s @ %s into %s', git_url, revision, path)
  subprocess.check_call(['git', 'init', path], cwd=path)
  subprocess.check_call(
      ['git', 'fetch', '--quiet', '--depth', '1', git_url, revision], cwd=path)
  subprocess.check_call(['git', 'checkout', revision, '--quiet'], cwd=path)
  assert (IsGitRepoCheckoutOutAtRevision(path, revision))
  return True


def InstallNodeModules():
  ui_dir = os.path.join(ROOT_DIR, 'ui')
  logging.info("Running npm install in {0}".format(ui_dir))
  subprocess.check_call([os.path.join(ui_dir, 'npm'), 'install', '--no-save'],
                        cwd=os.path.join(ROOT_DIR, 'ui'))


def CheckHashes():
  for deps in [BUILD_DEPS_HOST, BUILD_DEPS_ANDROID, TEST_DEPS_ANDROID, UI_DEPS]:
    for rel_path, url, expected_sha1, platform in deps:
      if url.endswith('.git'):
        continue
      logging.info('Downloading %s from %s', rel_path, url)
      with tempfile.NamedTemporaryFile(delete=False) as f:
        f.close()
        urlretrieve(url, f.name)
        actual_sha1 = HashLocalFile(f.name)
        os.unlink(f.name)
        if (actual_sha1 != expected_sha1):
          logging.fatal('SHA1 mismatch for {} expected {} was {}'.format(
              url, expected_sha1, actual_sha1))


def Main():
  parser = argparse.ArgumentParser()
  parser.add_argument('--no-android', action='store_true')
  parser.add_argument('--ui', action='store_true')
  parser.add_argument(
      '--check-hashes', help='Check hashes for all URLs', action='store_true')
  args = parser.parse_args()
  if args.check_hashes:
    CheckHashes()
    return 0
  deps = BUILD_DEPS_HOST
  if not args.no_android:
    deps += BUILD_DEPS_ANDROID + TEST_DEPS_ANDROID
  if args.ui:
    deps += UI_DEPS
  deps_updated = False
  for rel_path, url, expected_sha1, platform in deps:
    if (platform != 'all' and platform != system().lower()):
      continue
    local_path = os.path.join(ROOT_DIR, rel_path)
    if url.endswith('.git'):
      deps_updated |= CheckoutGitRepo(local_path, url, expected_sha1)
      continue
    is_zip = local_path.endswith('.zip') or local_path.endswith('.tgz')
    zip_target_dir = local_path[:-4] if is_zip else None
    zip_dir_stamp = os.path.join(zip_target_dir, '.stamp') if is_zip else None

    if ((not is_zip and HashLocalFile(local_path) == expected_sha1) or
        (is_zip and ReadFile(zip_dir_stamp) == expected_sha1)):
      continue
    deps_updated = True
    MkdirRecursive(os.path.dirname(rel_path))
    if HashLocalFile(local_path) != expected_sha1:
      download_path = local_path + '.tmp'
      logging.info('Downloading %s from %s', local_path, url)
      urlretrieve(url, download_path)
      os.chmod(download_path, 0o755)
      actual_sha1 = HashLocalFile(download_path)
      if (actual_sha1 != expected_sha1):
        os.remove(download_path)
        logging.fatal('SHA1 mismatch for {} expected {} was {}'.format(
            download_path, expected_sha1, actual_sha1))
        return 1
      os.rename(download_path, local_path)
    assert (HashLocalFile(local_path) == expected_sha1)

    if is_zip:
      logging.info('Extracting %s into %s' % (local_path, zip_target_dir))
      assert (os.path.commonprefix((ROOT_DIR, zip_target_dir)) == ROOT_DIR)
      if os.path.exists(zip_target_dir):
        logging.info('Deleting stale dir %s' % zip_target_dir)
        shutil.rmtree(zip_target_dir)

      # Decompress the archive.
      if local_path.endswith('.tgz'):
        MkdirRecursive(zip_target_dir)
        subprocess.check_call(['tar', '-xf', local_path], cwd=zip_target_dir)
      elif local_path.endswith('.zip'):
        with zipfile.ZipFile(local_path, 'r') as zf:
          for info in zf.infolist():
            ExtractZipfilePreservePermissions(zf, info, zip_target_dir)

      # If the zip contains one root folder, rebase one level up moving all
      # its sub files and folders inside |target_dir|.
      subdir = os.listdir(zip_target_dir)
      if len(subdir) == 1:
        subdir = os.path.join(zip_target_dir, subdir[0])
        if os.path.isdir(subdir):
          for subf in os.listdir(subdir):
            shutil.move(os.path.join(subdir, subf), zip_target_dir)
          os.rmdir(subdir)

      # Create stamp and remove the archive.
      with open(zip_dir_stamp, 'w') as stamp_file:
        stamp_file.write(expected_sha1)
      os.remove(local_path)

  if args.ui:
    # Needs to happen after nodejs is installed above.
    InstallNodeModules()

  if deps_updated:
    # Stale binary files may be compiled against old sysroot headers that aren't
    # tracked by gn.
    logging.warning('Remember to run "gn clean <output_directory>" ' +
                    'to avoid stale binary files.')


if __name__ == '__main__':
  logging.basicConfig(level=logging.INFO)
  sys.exit(Main())
