#!/usr/bin/env python
# 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())
