#!/usr/bin/env python3
# Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

# Script for uploading to x20 as a dependency in the same way we use cloud
# storage.

import optparse
import os
import shutil
import stat
import subprocess
import sys
import tarfile
import utils

GMSCORE_DEPS = '/google/data/rw/teams/r8/deps'

def parse_options():
  return optparse.OptionParser().parse_args()

def uploadFile(filename, dest):
  print('Uploading to %s' % dest)
  shutil.copyfile(filename, dest)
  subprocess.check_call(['chmod', '664', dest])

def Main():
  (options, args) = parse_options()
  assert len(args) == 1
  name = args[0]
  print('Creating archive for %s' % name)
  if not name in os.listdir('.'):
    print('You must be standing directly below the directory you are uploading')
    return 1
  filename = utils.create_archive(name)
  sha1 = utils.get_sha1(filename)
  dest = os.path.join(GMSCORE_DEPS, sha1)
  uploadFile(filename, dest)
  sha1_file = '%s.sha1' % filename
  with open(sha1_file, 'w') as output:
    output.write(sha1)
  print('Sha (%s) written to: %s' % (sha1, sha1_file))

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