blob: 534091bce9f6eab5535c516a74ffdb39d95a2624 [file] [log] [blame]
# 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