|  | #!/usr/bin/env python | 
|  | # Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | """ | 
|  | Script used to install Xcode on the swarming bots. | 
|  | """ | 
|  |  | 
|  | import os | 
|  | import shutil | 
|  | import subprocess | 
|  | import sys | 
|  | import tarfile | 
|  | import tempfile | 
|  |  | 
|  | import mac_toolchain | 
|  |  | 
|  | VERSION = '9A235' | 
|  | URL = 'gs://chrome-mac-sdk/ios-toolchain-9A235-1.tgz' | 
|  | REMOVE_DIR = '/Applications/Xcode9.0-Beta4.app/' | 
|  | OUTPUT_DIR = '/Applications/Xcode9.0.app/' | 
|  |  | 
|  | def main(): | 
|  | # Check if it's already installed. | 
|  | if os.path.exists(OUTPUT_DIR): | 
|  | env = os.environ.copy() | 
|  | env['DEVELOPER_DIR'] = OUTPUT_DIR | 
|  | cmd = ['xcodebuild', '-version'] | 
|  | found_version = \ | 
|  | subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE).communicate()[0] | 
|  | if VERSION in found_version: | 
|  | print "Xcode %s already installed" % VERSION | 
|  | sys.exit(0) | 
|  |  | 
|  | # Confirm old dir is there first. | 
|  | if not os.path.exists(REMOVE_DIR): | 
|  | print "Failing early since %s isn't there." % REMOVE_DIR | 
|  | sys.exit(1) | 
|  |  | 
|  | # Download Xcode. | 
|  | with tempfile.NamedTemporaryFile() as temp: | 
|  | env = os.environ.copy() | 
|  | env['PATH'] += ":/b/depot_tools" | 
|  | subprocess.check_call(['gsutil.py', 'cp', URL, temp.name], env=env) | 
|  | if os.path.exists(OUTPUT_DIR): | 
|  | shutil.rmtree(OUTPUT_DIR) | 
|  | if not os.path.exists(OUTPUT_DIR): | 
|  | os.makedirs(OUTPUT_DIR) | 
|  | tarfile.open(mode='r:gz', name=temp.name).extractall(path=OUTPUT_DIR) | 
|  |  | 
|  | # Accept license, call runFirstLaunch. | 
|  | mac_toolchain.FinalizeUnpack(OUTPUT_DIR, 'ios') | 
|  |  | 
|  | # Set new Xcode as default. | 
|  | subprocess.check_call(['sudo', '/usr/bin/xcode-select', '-s', OUTPUT_DIR]) | 
|  |  | 
|  | if os.path.exists(REMOVE_DIR): | 
|  | shutil.rmtree(REMOVE_DIR) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) | 
|  |  |