# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Download a binpkg from Google Storage.

This is needed for two reasons:
  1) In the case where a binpkg is left over in the packages dir,
     portage doesn't handle retries well and reports an error.
  2) gsutil retries when a download is interrupted, but it doesn't
     handle the case where we are unable to resume a transfer and the
     transfer needs to be restarted from scratch. Ensuring that the
     file is deleted between each retry helps handle that eventuality.
"""

from __future__ import print_function

import shutil

from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import gs
from chromite.lib import osutils


def GetParser():
  """Creates the argparse parser."""
  parser = commandline.ArgumentParser(description=__doc__)
  parser.add_argument('--boto', type='path', help='Path to boto auth file.')
  parser.add_argument('uri', help='Google Storage URI to download')
  parser.add_argument('filename', help='Location to store the file.')
  return parser


def Copy(ctx, uri, filename):
  """Run the copy using a temp file."""
  temp_path = '%s.tmp' % filename
  osutils.SafeUnlink(temp_path)
  try:
    ctx.Copy(uri, temp_path)
    shutil.move(temp_path, filename)
  finally:
    osutils.SafeUnlink(temp_path)


def main(argv):
  parser = GetParser()
  options = parser.parse_args(argv)
  options.Freeze()
  ctx = gs.GSContext(boto_file=options.boto)
  try:
    Copy(ctx, options.uri, options.filename)
  except gs.GSContextException as ex:
    # Hide the stack trace using Die.
    cros_build_lib.Die('%s', ex)
