#!/usr/bin/env python3
# Copyright (C) 2021 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.

# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# DO NOT EDIT. Auto-generated by tools/gen_amalgamated_python_tools
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

# This file should do the same thing when being invoked in any of these ways:
# ./traceconv
# python traceconv
# bash traceconv
# cat ./traceconv | bash
# cat ./traceconv | python -

BASH_FALLBACK=""" "
exec python3 - "$@" <<'#'EOF
#"""  # yapf: disable


# ----- Amalgamator: begin of python/perfetto/prebuilts/manifests/traceconv.py
# This file has been generated by: /usr/local/google/home/lalitm/perfetto/tools/roll-prebuilts v30.0
TRACECONV_MANIFEST = [{
    'arch':
        'mac-amd64',
    'file_name':
        'traceconv',
    'file_size':
        7690432,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/mac-amd64/traceconv',
    'sha256':
        '0afb684ee7cc5e91e81a8f7ce3dea5505ef1ad049a34d6191cce619eadff6507',
    'platform':
        'darwin',
    'machine': ['x86_64']
}, {
    'arch':
        'mac-arm64',
    'file_name':
        'traceconv',
    'file_size':
        6471544,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/mac-arm64/traceconv',
    'sha256':
        'eb0b67fdf36bd0facd666925fee6cfbceaf43edc945b10d37175bb749cf1e9b0',
    'platform':
        'darwin',
    'machine': ['arm64']
}, {
    'arch':
        'linux-amd64',
    'file_name':
        'traceconv',
    'file_size':
        8514512,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/linux-amd64/traceconv',
    'sha256':
        'cf1894cef366bde10a692d3e0e1fa941f0cf3bc0fdc3a4bc618f4339434c6f65',
    'platform':
        'linux',
    'machine': ['x86_64']
}, {
    'arch':
        'linux-arm',
    'file_name':
        'traceconv',
    'file_size':
        6678956,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/linux-arm/traceconv',
    'sha256':
        '6b4ba560060c82a3d61dd20df7776171dbf2554e38c0f8792cf80f70332f187a',
    'platform':
        'linux',
    'machine': ['armv6l', 'armv7l', 'armv8l']
}, {
    'arch':
        'linux-arm64',
    'file_name':
        'traceconv',
    'file_size':
        7667720,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/linux-arm64/traceconv',
    'sha256':
        'c626149e7345d2abbb10b9b959dd9eb8c2095822649a0d8c2aa7fa2e34d5ead7',
    'platform':
        'linux',
    'machine': ['aarch64']
}, {
    'arch':
        'android-arm',
    'file_name':
        'traceconv',
    'file_size':
        5298052,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/android-arm/traceconv',
    'sha256':
        '490c12cd9dfdba8416f1f6fe257a41eaae2672047e3139bca90477e268b35c54'
}, {
    'arch':
        'android-arm64',
    'file_name':
        'traceconv',
    'file_size':
        6694400,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/android-arm64/traceconv',
    'sha256':
        'b7cfdb2f7a71c5b22cbd313493a16535d169c09f575af27b098a76696f86b2fc'
}, {
    'arch':
        'android-x86',
    'file_name':
        'traceconv',
    'file_size':
        7587676,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/android-x86/traceconv',
    'sha256':
        '4adb124b88256265e59ca2ef22dea01e477311b71e8b133e804c4d9334693e34'
}, {
    'arch':
        'android-x64',
    'file_name':
        'traceconv',
    'file_size':
        7816760,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/android-x64/traceconv',
    'sha256':
        '4291e8c3063b404e41ea2c12f26ab148d0de40974f5f9f3d4a2ed2eba005cee9'
}, {
    'arch':
        'windows-amd64',
    'file_name':
        'traceconv.exe',
    'file_size':
        8026112,
    'url':
        'https://commondatastorage.googleapis.com/perfetto-luci-artifacts/v30.0/windows-amd64/traceconv.exe',
    'sha256':
        '8d2c5af797d07eb6912ef5690538b071ad2be7dccb46dd3c993347675b0e93c8',
    'platform':
        'win32',
    'machine': ['amd64']
}]

# ----- Amalgamator: end of python/perfetto/prebuilts/manifests/traceconv.py

# ----- Amalgamator: begin of python/perfetto/prebuilts/perfetto_prebuilts.py
# Copyright (C) 2021 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.
"""
Functions to fetch pre-pinned Perfetto prebuilts.

This function is used in different places:
- Into the //tools/{trace_processor, traceconv} scripts, which are just plain
  wrappers around executables.
- Into the //tools/{heap_profiler, record_android_trace} scripts, which contain
  some other hand-written python code.

The manifest argument looks as follows:
TRACECONV_MANIFEST = [
  {
    'arch': 'mac-amd64',
    'file_name': 'traceconv',
    'file_size': 7087080,
    'url': https://commondatastorage.googleapis.com/.../trace_to_text',
    'sha256': 7d957c005b0dc130f5bd855d6cec27e060d38841b320d04840afc569f9087490',
    'platform': 'darwin',
    'machine': 'x86_64'
  },
  ...
]

The intended usage is:

  from perfetto.prebuilts.manifests.traceconv import TRACECONV_MANIFEST
  bin_path = get_perfetto_prebuilt(TRACECONV_MANIFEST)
  subprocess.call(bin_path, ...)
"""

import hashlib
import os
import platform
import subprocess
import sys


def download_or_get_cached(file_name, url, sha256):
  """ Downloads a prebuilt or returns a cached version

  The first time this is invoked, it downloads the |url| and caches it into
  ~/.perfetto/prebuilts/$tool_name. On subsequent invocations it just runs the
  cached version.
  """
  dir = os.path.join(
      os.path.expanduser('~'), '.local', 'share', 'perfetto', 'prebuilts')
  os.makedirs(dir, exist_ok=True)
  bin_path = os.path.join(dir, file_name)
  sha256_path = os.path.join(dir, file_name + '.sha256')
  needs_download = True

  # Avoid recomputing the SHA-256 on each invocation. The SHA-256 of the last
  # download is cached into file_name.sha256, just check if that matches.
  if os.path.exists(bin_path) and os.path.exists(sha256_path):
    with open(sha256_path, 'rb') as f:
      digest = f.read().decode()
      if digest == sha256:
        needs_download = False

  if needs_download:
    # Either the filed doesn't exist or the SHA256 doesn't match.
    tmp_path = bin_path + '.tmp'
    print('Downloading ' + url)
    subprocess.check_call(['curl', '-f', '-L', '-#', '-o', tmp_path, url])
    with open(tmp_path, 'rb') as fd:
      actual_sha256 = hashlib.sha256(fd.read()).hexdigest()
    if actual_sha256 != sha256:
      raise Exception('Checksum mismatch for %s (actual: %s, expected: %s)' %
                      (url, actual_sha256, sha256))
    os.chmod(tmp_path, 0o755)
    os.rename(tmp_path, bin_path)
    with open(sha256_path, 'w') as f:
      f.write(sha256)
  return bin_path


def get_perfetto_prebuilt(manifest, soft_fail=False, arch=None):
  """ Downloads the prebuilt, if necessary, and returns its path on disk. """
  plat = sys.platform.lower()
  machine = platform.machine().lower()
  manifest_entry = None
  for entry in manifest:
    # If the caller overrides the arch, just match that (for Android prebuilts).
    if arch:
      if entry.get('arch') == arch:
        manifest_entry = entry
        break
      continue
    # Otherwise guess the local machine arch.
    if entry.get('platform') == plat and machine in entry.get('machine', []):
      manifest_entry = entry
      break
  if manifest_entry is None:
    if soft_fail:
      return None
    raise Exception(
        ('No prebuilts available for %s-%s\n' % (plat, machine)) +
        'See https://perfetto.dev/docs/contributing/build-instructions')

  return download_or_get_cached(
      file_name=manifest_entry['file_name'],
      url=manifest_entry['url'],
      sha256=manifest_entry['sha256'])


def run_perfetto_prebuilt(manifest):
  bin_path = get_perfetto_prebuilt(manifest)
  if sys.platform.lower() == 'win32':
    sys.exit(subprocess.check_call([bin_path, *sys.argv[1:]]))
  os.execv(bin_path, [bin_path] + sys.argv[1:])

# ----- Amalgamator: end of python/perfetto/prebuilts/perfetto_prebuilts.py

if __name__ == '__main__':
  run_perfetto_prebuilt(TRACECONV_MANIFEST)

#EOF
