1#!/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. 9"""Utilities for all our deps-management stuff.""" 10 11from __future__ import absolute_import 12from __future__ import division 13from __future__ import print_function 14 15import os 16import shutil 17import subprocess 18import sys 19import tarfile 20import time 21import zipfile 22 23 24def RunSubprocessWithRetry(cmd): 25 """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) 34 35 print('Giving up.') 36 raise exception 37 38 39def DownloadFilesFromGoogleStorage(path, auto_platform=True): 40 print('Downloading files in %s...' % path) 41 42 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) 50 51 52# Code partially copied from 53# https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py 54def RemoveDirectory(*path): 55 """Recursively removes a directory, even if it's marked read-only. 56 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 """ 70 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 75 76 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) 90 91 92def UnpackArchiveTo(archive_path, output_dir): 93 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) 98 99 100def _UnzipArchiveTo(archive_path, output_dir): 101 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() 107 108 109def _UntarArchiveTo(archive_path, output_dir): 110 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() 116 117 118def GetPlatform(): 119 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) 126 127 128def GetExecutableExtension(): 129 return '.exe' if GetPlatform() == 'win' else '' 130