| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| import os |
| import subprocess |
| import sys |
| import tarfile |
| import tempfile |
| |
| sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), |
| 'test'))) |
| |
| from common import DIR_SRC_ROOT |
| |
| sys.path.append(os.path.join(DIR_SRC_ROOT, 'build')) |
| import find_depot_tools |
| |
| |
| def DownloadAndUnpackFromCloudStorage(url, output_dir): |
| """Fetches a tarball from GCS and uncompresses it to |output_dir|.""" |
| |
| # Pass the compressed stream directly to 'tarfile'; don't bother writing it |
| # to disk first. |
| tmp_file = 'image.tgz' |
| with tempfile.TemporaryDirectory() as tmp_d: |
| tmp_file_location = os.path.join(tmp_d, tmp_file) |
| cmd = [ |
| sys.executable, |
| os.path.join(find_depot_tools.DEPOT_TOOLS_PATH, 'gsutil.py'), 'cp', url, |
| tmp_file_location |
| ] |
| |
| logging.debug('Running "%s"', ' '.join(cmd)) |
| task = subprocess.run(cmd, |
| stderr=subprocess.PIPE, |
| stdout=subprocess.PIPE, |
| check=True, |
| encoding='utf-8') |
| |
| try: |
| tarfile.open(name=tmp_file_location, |
| mode='r|gz').extractall(path=output_dir) |
| except tarfile.ReadError as exc: |
| _, stderr_data = task.communicate() |
| stderr_data = stderr_data.decode() |
| raise subprocess.CalledProcessError( |
| task.returncode, cmd, |
| 'Failed to read a tarfile from gsutil.py.\n{}'.format( |
| stderr_data if stderr_data else '')) from exc |