blob: 9e7a336a8fe582180ac964b58525afb2e3644e04 [file] [log] [blame]
# -*- coding: utf-8 -*-
# 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
import sys
from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import gs
from chromite.lib import osutils
assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
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', type='gs_path',
help='Google Storage URI to download')
parser.add_argument('filename', type='path',
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)