blob: 8a5de50cf8e8e44b9ed9060dcb9204b2c5131a35 [file] [log] [blame]
mbonadei9e5841a2017-05-09 00:13:47 -07001#!/usr/bin/env python
2# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3#
4# Use of this source code is governed by a BSD-style license
5# that can be found in the LICENSE file in the root of the source
6# tree. An additional intellectual property rights grant can be found
7# in the file PATENTS. All contributing project authors may
8# be found in the AUTHORS file in the root of the source tree.
mbonadei9e5841a2017-05-09 00:13:47 -07009"""Utilities for all our deps-management stuff."""
10
Mirko Bonadei67f88a02019-07-25 18:38:54 +020011from __future__ import absolute_import
12from __future__ import division
13from __future__ import print_function
14
mbonadei9e5841a2017-05-09 00:13:47 -070015import os
16import shutil
mbonadei9e5841a2017-05-09 00:13:47 -070017import subprocess
Mirko Bonadei67f88a02019-07-25 18:38:54 +020018import sys
mbonadei9e5841a2017-05-09 00:13:47 -070019import tarfile
20import time
21import zipfile
22
23
24def RunSubprocessWithRetry(cmd):
Mirko Bonadei8cc66952020-10-30 10:13:45 +010025 """Invokes the subprocess and backs off exponentially on fail."""
26 for i in range(5):
27 try:
28 subprocess.check_call(cmd)
29 return
30 except subprocess.CalledProcessError as exception:
31 backoff = pow(2, i)
32 print('Got %s, retrying in %d seconds...' % (exception, backoff))
33 time.sleep(backoff)
mbonadei9e5841a2017-05-09 00:13:47 -070034
Mirko Bonadei8cc66952020-10-30 10:13:45 +010035 print('Giving up.')
36 raise exception
mbonadei9e5841a2017-05-09 00:13:47 -070037
38
oprypin1d7392a2017-05-16 05:36:15 -070039def DownloadFilesFromGoogleStorage(path, auto_platform=True):
Mirko Bonadei8cc66952020-10-30 10:13:45 +010040 print('Downloading files in %s...' % path)
mbonadei9e5841a2017-05-09 00:13:47 -070041
Mirko Bonadei8cc66952020-10-30 10:13:45 +010042 extension = 'bat' if 'win32' in sys.platform else 'py'
43 cmd = [
44 'download_from_google_storage.%s' % extension,
45 '--bucket=chromium-webrtc-resources', '--directory', path
46 ]
47 if auto_platform:
48 cmd += ['--auto_platform', '--recursive']
49 subprocess.check_call(cmd)
mbonadei9e5841a2017-05-09 00:13:47 -070050
51
mbonadei9e5841a2017-05-09 00:13:47 -070052# Code partially copied from
53# https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py
54def RemoveDirectory(*path):
Mirko Bonadei8cc66952020-10-30 10:13:45 +010055 """Recursively removes a directory, even if it's marked read-only.
mbonadei9e5841a2017-05-09 00:13:47 -070056
57 Remove the directory located at *path, if it exists.
58
59 shutil.rmtree() doesn't work on Windows if any of the files or directories
60 are read-only, which svn repositories and some .svn files are. We need to
61 be able to force the files to be writable (i.e., deletable) as we traverse
62 the tree.
63
64 Even with all this, Windows still sometimes fails to delete a file, citing
65 a permission error (maybe something to do with antivirus scans or disk
66 indexing). The best suggestion any of the user forums had was to wait a
67 bit and try again, so we do that too. It's hand-waving, but sometimes it
68 works. :/
69 """
Mirko Bonadei8cc66952020-10-30 10:13:45 +010070 file_path = os.path.join(*path)
71 print('Deleting `{}`.'.format(file_path))
72 if not os.path.exists(file_path):
73 print('`{}` does not exist.'.format(file_path))
74 return
mbonadei9e5841a2017-05-09 00:13:47 -070075
Mirko Bonadei8cc66952020-10-30 10:13:45 +010076 if sys.platform == 'win32':
77 # Give up and use cmd.exe's rd command.
78 file_path = os.path.normcase(file_path)
79 for _ in range(3):
80 print('RemoveDirectory running %s' %
81 (' '.join(['cmd.exe', '/c', 'rd', '/q', '/s', file_path])))
82 if not subprocess.call(
83 ['cmd.exe', '/c', 'rd', '/q', '/s', file_path]):
84 break
85 print(' Failed')
86 time.sleep(3)
87 return
88 else:
89 shutil.rmtree(file_path, ignore_errors=True)
mbonadei9e5841a2017-05-09 00:13:47 -070090
91
92def UnpackArchiveTo(archive_path, output_dir):
Mirko Bonadei8cc66952020-10-30 10:13:45 +010093 extension = os.path.splitext(archive_path)[1]
94 if extension == '.zip':
95 _UnzipArchiveTo(archive_path, output_dir)
96 else:
97 _UntarArchiveTo(archive_path, output_dir)
mbonadei9e5841a2017-05-09 00:13:47 -070098
99
100def _UnzipArchiveTo(archive_path, output_dir):
Mirko Bonadei8cc66952020-10-30 10:13:45 +0100101 print('Unzipping {} in {}.'.format(archive_path, output_dir))
102 zip_file = zipfile.ZipFile(archive_path)
103 try:
104 zip_file.extractall(output_dir)
105 finally:
106 zip_file.close()
mbonadei9e5841a2017-05-09 00:13:47 -0700107
108
109def _UntarArchiveTo(archive_path, output_dir):
Mirko Bonadei8cc66952020-10-30 10:13:45 +0100110 print('Untarring {} in {}.'.format(archive_path, output_dir))
111 tar_file = tarfile.open(archive_path, 'r:gz')
112 try:
113 tar_file.extractall(output_dir)
114 finally:
115 tar_file.close()
mbonadei9e5841a2017-05-09 00:13:47 -0700116
117
118def GetPlatform():
Mirko Bonadei8cc66952020-10-30 10:13:45 +0100119 if sys.platform.startswith('win'):
120 return 'win'
121 if sys.platform.startswith('linux'):
122 return 'linux'
123 if sys.platform.startswith('darwin'):
124 return 'mac'
125 raise Exception("Can't run on platform %s." % sys.platform)
Oleh Prypin172a5632018-04-04 16:22:01 +0200126
127
128def GetExecutableExtension():
Mirko Bonadei8cc66952020-10-30 10:13:45 +0100129 return '.exe' if GetPlatform() == 'win' else ''