#!/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.
"""Pulls LUCI-generated binaries and generates .zip files for GitHub releases.

Usage: ./tools/package_prebuilts_for_github_release v20.0

This will generate one .zip file for every os-arch combo (e.g. android-arm.zip)
into /tmp/perfetto-prebuilts-v20.0/ .
"""

import argparse
import subprocess
import os
import sys


def exec(*args):
  print(' '.join(args))
  subprocess.check_call(args)


def main():
  parser = argparse.ArgumentParser(epilog='Example %s v19.0' % __file__)
  parser.add_argument('version')

  args = parser.parse_args()
  tmpdir = '/tmp/perfetto-prebuilts-' + args.version
  src = 'gs://perfetto-luci-artifacts/%s/' % args.version
  os.makedirs(tmpdir, exist_ok=True)
  os.chdir(tmpdir)
  exec('gsutil', '-m', 'rsync', '-rc', src, tmpdir + '/')
  zips = []
  for arch in os.listdir(tmpdir):
    if not os.path.isdir(arch):
      continue
    exec('zip', '-9r', '%s.zip' % arch, arch)
    zips.append(arch + '.zip')
  print('')
  print('%d zip files saved in %s (%s)' % (len(zips), tmpdir, ','.join(zips)))


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