blob: a6c02be7a692cfe1752139f7f5b4c2e6c9c7808b [file] [log] [blame]
David James0f5252f2013-04-19 08:03:14 -07001# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Download a binpkg from Google Storage.
6
7This is needed for two reasons:
8 1) In the case where a binpkg is left over in the packages dir,
9 portage doesn't handle retries well and reports an error.
10 2) gsutil retries when a download is interrupted, but it doesn't
11 handle the case where we are unable to resume a transfer and the
12 transfer needs to be restarted from scratch. Ensuring that the
13 file is deleted between each retry helps handle that eventuality.
14"""
15
Mike Frysinger383367e2014-09-16 15:06:17 -040016from __future__ import print_function
17
David James0f5252f2013-04-19 08:03:14 -070018import shutil
19
20from chromite.lib import commandline
21from chromite.lib import cros_build_lib
22from chromite.lib import gs
23from chromite.lib import osutils
24
25
26def GetParser():
27 """Creates the argparse parser."""
28 parser = commandline.ArgumentParser(description=__doc__)
Mike Frysingerc9bfb472015-05-13 23:11:58 -040029 parser.add_argument('--boto', type='path', help='Path to boto auth file.')
David James0f5252f2013-04-19 08:03:14 -070030 parser.add_argument('uri', help='Google Storage URI to download')
31 parser.add_argument('filename', help='Location to store the file.')
32 return parser
33
Mike Frysinger33494002014-05-07 23:46:08 -040034
David James0f5252f2013-04-19 08:03:14 -070035def Copy(ctx, uri, filename):
36 """Run the copy using a temp file."""
37 temp_path = '%s.tmp' % filename
38 osutils.SafeUnlink(temp_path)
39 try:
Mike Frysinger33494002014-05-07 23:46:08 -040040 ctx.Copy(uri, temp_path)
David James0f5252f2013-04-19 08:03:14 -070041 shutil.move(temp_path, filename)
42 finally:
43 osutils.SafeUnlink(temp_path)
44
Mike Frysinger33494002014-05-07 23:46:08 -040045
Mike Frysinger9ad5fab2013-05-30 13:37:26 -040046def main(argv):
David James0f5252f2013-04-19 08:03:14 -070047 parser = GetParser()
Mike Frysinger9ad5fab2013-05-30 13:37:26 -040048 options = parser.parse_args(argv)
Mike Frysingerc9bfb472015-05-13 23:11:58 -040049 options.Freeze()
50 ctx = gs.GSContext(boto_file=options.boto)
David James0f5252f2013-04-19 08:03:14 -070051 try:
Mike Frysinger11291062014-08-18 00:01:11 -040052 Copy(ctx, options.uri, options.filename)
53 except gs.GSContextException as ex:
David James0f5252f2013-04-19 08:03:14 -070054 # Hide the stack trace using Die.
55 cros_build_lib.Die('%s', ex)