#!/usr/bin/env python
# Copyright 2017 The Fuchsia Authors. All rights reserved.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Uploads report_client to Google Cloud Storage.

We use the script upload_to_google_storage.py from depot_tools. You must
have this in your path.

We tar and gzip compress the binary report_client forming a .tgz file. We then
upload this .tgz file to the Google Cloud Storage bucket
fuchsia-build/cobalt/report_client/<platform>
using the sha1 of the .tgz file as the filename.

Some typical values of <platform> are linux64 and darwin64.

Instructions:
(1) Build a new version of report_client locally via
./cobaltb.py build.
(2) Run this script
(3) In addition to uploading a new report_client this script will also
update the file tools/go/report_client.<platform>.tgz.sha1. Submit
this change in a new CL.
(4) In the Fuchsia repo update the file
//apps/cobalt_client/download_report_client.py with the new sha1.

"""

import os
import platform
import shutil
import subprocess
import sys
import tarfile

THIS_DIR = os.path.dirname(__file__)
SRC_ROOT_DIR = os.path.abspath(os.path.join(THIS_DIR, os.pardir))
OUT_DIR = os.path.join(SRC_ROOT_DIR, 'out')
OUT_TOOLS_DIR = os.path.join(OUT_DIR, 'tools')
BINARY_NAME = 'report_client'
TOOLS_GO_DIR = os.path.join(SRC_ROOT_DIR, 'tools', 'go')

def _write_compressed_tarfile(tarfile_to_create):
  saved_cwd = os.getcwd()
  os.chdir(OUT_TOOLS_DIR)
  with tarfile.open(tarfile_to_create, "w:gz") as tar:
    tar.add(BINARY_NAME)
  os.chdir(saved_cwd)


def _platform_string():
  return '%s%s' % (platform.system().lower(), platform.architecture()[0][:2])

def _upload(file_to_upload, platform_string):
  bucket_name = 'fuchsia-build/cobalt/report_client/%s' % platform_string
  cmd = ['upload_to_google_storage.py', '-b', bucket_name, file_to_upload]
  subprocess.check_call(cmd)

def main():
  report_client_path = os.path.join(OUT_DIR, 'tools', 'report_client')
  if not os.path.exists(report_client_path):
    print "File not found: %s." % report_client_path
    print "You must build first."
    return 1
  platform_string = _platform_string()
  tgz_file = 'report_client.%s.tgz' % platform_string
  cwd = os.getcwd()
  temp_tgz_file_path = os.path.join(cwd, tgz_file)
  print "Compressing %s to temporary file %s..." % (report_client_path,
      temp_tgz_file_path)
  _write_compressed_tarfile(temp_tgz_file_path)
  _upload(temp_tgz_file_path, platform_string)
  os.remove(temp_tgz_file_path)
  temp_sha1_file = "%s.sha1" % temp_tgz_file_path
  target_sha1_file_name = "%s.sha1" % tgz_file
  final_sha1_file = os.path.join(TOOLS_GO_DIR, target_sha1_file_name)
  shutil.move(temp_sha1_file, final_sha1_file)

if __name__ == '__main__':
  main()
