blob: 8a5de50cf8e8e44b9ed9060dcb9204b2c5131a35 [file] [log] [blame]
mbonadei9e5841a2017-05-09 07:13:471#!/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 07:13:479"""Utilities for all our deps-management stuff."""
10
Mirko Bonadei67f88a02019-07-25 16:38:5411from __future__ import absolute_import
12from __future__ import division
13from __future__ import print_function
14
mbonadei9e5841a2017-05-09 07:13:4715import os
16import shutil
mbonadei9e5841a2017-05-09 07:13:4717import subprocess
Mirko Bonadei67f88a02019-07-25 16:38:5418import sys
mbonadei9e5841a2017-05-09 07:13:4719import tarfile
20import time
21import zipfile
22
23
24def RunSubprocessWithRetry(cmd):
Mirko Bonadei8cc66952020-10-30 09:13:4525 """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 07:13:4734
Mirko Bonadei8cc66952020-10-30 09:13:4535 print('Giving up.')
36 raise exception
mbonadei9e5841a2017-05-09 07:13:4737
38
oprypin1d7392a2017-05-16 12:36:1539def DownloadFilesFromGoogleStorage(path, auto_platform=True):
Mirko Bonadei8cc66952020-10-30 09:13:4540 print('Downloading files in %s...' % path)
mbonadei9e5841a2017-05-09 07:13:4741
Mirko Bonadei8cc66952020-10-30 09:13:4542 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 07:13:4750
51
mbonadei9e5841a2017-05-09 07:13:4752# Code partially copied from
53# https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py
54def RemoveDirectory(*path):
Mirko Bonadei8cc66952020-10-30 09:13:4555 """Recursively removes a directory, even if it's marked read-only.
mbonadei9e5841a2017-05-09 07:13:4756
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 09:13:4570 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 07:13:4775
Mirko Bonadei8cc66952020-10-30 09:13:4576 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 07:13:4790
91
92def UnpackArchiveTo(archive_path, output_dir):
Mirko Bonadei8cc66952020-10-30 09:13:4593 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 07:13:4798
99
100def _UnzipArchiveTo(archive_path, output_dir):
Mirko Bonadei8cc66952020-10-30 09:13:45101 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 07:13:47107
108
109def _UntarArchiveTo(archive_path, output_dir):
Mirko Bonadei8cc66952020-10-30 09:13:45110 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 07:13:47116
117
118def GetPlatform():
Mirko Bonadei8cc66952020-10-30 09:13:45119 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 14:22:01126
127
128def GetExecutableExtension():
Mirko Bonadei8cc66952020-10-30 09:13:45129 return '.exe' if GetPlatform() == 'win' else ''