1*e1eccf28SAndroid Build Coastguard Worker#!/usr/bin/env python 2*e1eccf28SAndroid Build Coastguard Worker# 3*e1eccf28SAndroid Build Coastguard Worker# Copyright (C) 2016 The Android Open Source Project 4*e1eccf28SAndroid Build Coastguard Worker# 5*e1eccf28SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*e1eccf28SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*e1eccf28SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*e1eccf28SAndroid Build Coastguard Worker# 9*e1eccf28SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*e1eccf28SAndroid Build Coastguard Worker# 11*e1eccf28SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*e1eccf28SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*e1eccf28SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*e1eccf28SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*e1eccf28SAndroid Build Coastguard Worker# limitations under the License. 16*e1eccf28SAndroid Build Coastguard Worker# 17*e1eccf28SAndroid Build Coastguard Worker 18*e1eccf28SAndroid Build Coastguard Worker"""Update the prebuilt RenderScript from the build server.""" 19*e1eccf28SAndroid Build Coastguard Workerfrom __future__ import print_function 20*e1eccf28SAndroid Build Coastguard Worker 21*e1eccf28SAndroid Build Coastguard Workerimport argparse 22*e1eccf28SAndroid Build Coastguard Workerimport inspect 23*e1eccf28SAndroid Build Coastguard Workerimport os 24*e1eccf28SAndroid Build Coastguard Workerimport shutil 25*e1eccf28SAndroid Build Coastguard Workerimport subprocess 26*e1eccf28SAndroid Build Coastguard Workerimport sys 27*e1eccf28SAndroid Build Coastguard Worker 28*e1eccf28SAndroid Build Coastguard Worker 29*e1eccf28SAndroid Build Coastguard WorkerTHIS_DIR = os.path.realpath(os.path.dirname(__name__)) 30*e1eccf28SAndroid Build Coastguard WorkerANDROID_DIR = os.path.realpath(os.path.join(THIS_DIR, '../..')) 31*e1eccf28SAndroid Build Coastguard Worker 32*e1eccf28SAndroid Build Coastguard WorkerBRANCH = 'aosp-master' 33*e1eccf28SAndroid Build Coastguard Worker 34*e1eccf28SAndroid Build Coastguard Worker 35*e1eccf28SAndroid Build Coastguard Workerdef android_path(*args): 36*e1eccf28SAndroid Build Coastguard Worker return os.path.join(ANDROID_DIR, *args) 37*e1eccf28SAndroid Build Coastguard Worker 38*e1eccf28SAndroid Build Coastguard Worker 39*e1eccf28SAndroid Build Coastguard Workerclass ArgParser(argparse.ArgumentParser): 40*e1eccf28SAndroid Build Coastguard Worker def __init__(self): 41*e1eccf28SAndroid Build Coastguard Worker super(ArgParser, self).__init__( 42*e1eccf28SAndroid Build Coastguard Worker description=inspect.getdoc(sys.modules[__name__])) 43*e1eccf28SAndroid Build Coastguard Worker 44*e1eccf28SAndroid Build Coastguard Worker self.add_argument( 45*e1eccf28SAndroid Build Coastguard Worker 'build_number', metavar='BUILD', 46*e1eccf28SAndroid Build Coastguard Worker help='Build number to pull from the build server.') 47*e1eccf28SAndroid Build Coastguard Worker 48*e1eccf28SAndroid Build Coastguard Worker self.add_argument( 49*e1eccf28SAndroid Build Coastguard Worker '-a', '--android_branch', default=BRANCH, 50*e1eccf28SAndroid Build Coastguard Worker help='The Android branch to pull from build server, default: ' + BRANCH + '.') 51*e1eccf28SAndroid Build Coastguard Worker 52*e1eccf28SAndroid Build Coastguard Worker self.add_argument( 53*e1eccf28SAndroid Build Coastguard Worker '-b', '--bug', type=int, 54*e1eccf28SAndroid Build Coastguard Worker help='Bug to reference in commit message.') 55*e1eccf28SAndroid Build Coastguard Worker 56*e1eccf28SAndroid Build Coastguard Worker self.add_argument( 57*e1eccf28SAndroid Build Coastguard Worker '--use-current-branch', action='store_true', 58*e1eccf28SAndroid Build Coastguard Worker help='Do not repo start a new branch for the update.') 59*e1eccf28SAndroid Build Coastguard Worker 60*e1eccf28SAndroid Build Coastguard Worker 61*e1eccf28SAndroid Build Coastguard Workerdef host_to_build_host(host): 62*e1eccf28SAndroid Build Coastguard Worker """Gets the build host name for an NDK host tag. 63*e1eccf28SAndroid Build Coastguard Worker 64*e1eccf28SAndroid Build Coastguard Worker The Windows builds are done from Linux. 65*e1eccf28SAndroid Build Coastguard Worker """ 66*e1eccf28SAndroid Build Coastguard Worker return { 67*e1eccf28SAndroid Build Coastguard Worker 'darwin': 'mac', 68*e1eccf28SAndroid Build Coastguard Worker 'linux': 'linux', 69*e1eccf28SAndroid Build Coastguard Worker 'windows': 'linux', 70*e1eccf28SAndroid Build Coastguard Worker }[host] 71*e1eccf28SAndroid Build Coastguard Worker 72*e1eccf28SAndroid Build Coastguard Worker 73*e1eccf28SAndroid Build Coastguard Workerdef build_name(host): 74*e1eccf28SAndroid Build Coastguard Worker """Gets the build name for a given host. 75*e1eccf28SAndroid Build Coastguard Worker 76*e1eccf28SAndroid Build Coastguard Worker The build name is either "linux" or "darwin", with any Windows builds 77*e1eccf28SAndroid Build Coastguard Worker coming from "linux". 78*e1eccf28SAndroid Build Coastguard Worker """ 79*e1eccf28SAndroid Build Coastguard Worker return { 80*e1eccf28SAndroid Build Coastguard Worker 'darwin': 'darwin', 81*e1eccf28SAndroid Build Coastguard Worker 'linux': 'linux', 82*e1eccf28SAndroid Build Coastguard Worker 'windows': 'linux', 83*e1eccf28SAndroid Build Coastguard Worker }[host] 84*e1eccf28SAndroid Build Coastguard Worker 85*e1eccf28SAndroid Build Coastguard Worker 86*e1eccf28SAndroid Build Coastguard Workerdef manifest_name(build_number): 87*e1eccf28SAndroid Build Coastguard Worker """Returns the manifest file name for a given build. 88*e1eccf28SAndroid Build Coastguard Worker 89*e1eccf28SAndroid Build Coastguard Worker >>> manifest_name('1234') 90*e1eccf28SAndroid Build Coastguard Worker 'manifest_1234.xml' 91*e1eccf28SAndroid Build Coastguard Worker """ 92*e1eccf28SAndroid Build Coastguard Worker return 'manifest_{}.xml'.format(build_number) 93*e1eccf28SAndroid Build Coastguard Worker 94*e1eccf28SAndroid Build Coastguard Worker 95*e1eccf28SAndroid Build Coastguard Workerdef package_name(build_number, host): 96*e1eccf28SAndroid Build Coastguard Worker """Returns the file name for a given package configuration. 97*e1eccf28SAndroid Build Coastguard Worker 98*e1eccf28SAndroid Build Coastguard Worker >>> package_name('1234', 'linux') 99*e1eccf28SAndroid Build Coastguard Worker 'renderscript-1234-linux-x86.tar.bz2' 100*e1eccf28SAndroid Build Coastguard Worker """ 101*e1eccf28SAndroid Build Coastguard Worker return 'renderscript-{}-{}-x86.tar.bz2'.format(build_number, host) 102*e1eccf28SAndroid Build Coastguard Worker 103*e1eccf28SAndroid Build Coastguard Worker 104*e1eccf28SAndroid Build Coastguard Workerdef download_build(host, build_number, android_branch, download_dir): 105*e1eccf28SAndroid Build Coastguard Worker filename = package_name(build_number, host) 106*e1eccf28SAndroid Build Coastguard Worker return download_file(host, build_number, android_branch, filename, download_dir) 107*e1eccf28SAndroid Build Coastguard Worker 108*e1eccf28SAndroid Build Coastguard Worker 109*e1eccf28SAndroid Build Coastguard Workerdef download_manifest(host, build_number, android_branch, download_dir): 110*e1eccf28SAndroid Build Coastguard Worker filename = manifest_name(build_number) 111*e1eccf28SAndroid Build Coastguard Worker return download_file(host, build_number, android_branch, filename, download_dir) 112*e1eccf28SAndroid Build Coastguard Worker 113*e1eccf28SAndroid Build Coastguard Worker 114*e1eccf28SAndroid Build Coastguard Workerdef download_file(host, build_number, android_branch, pkg_name, download_dir): 115*e1eccf28SAndroid Build Coastguard Worker url_base = 'https://android-build-uber.corp.google.com' 116*e1eccf28SAndroid Build Coastguard Worker path = 'builds/{build_branch}-{build_host}-{build_name}/{build_num}'.format( 117*e1eccf28SAndroid Build Coastguard Worker build_branch=android_branch, 118*e1eccf28SAndroid Build Coastguard Worker build_host=host_to_build_host(host), 119*e1eccf28SAndroid Build Coastguard Worker build_name='renderscript', 120*e1eccf28SAndroid Build Coastguard Worker build_num=build_number) 121*e1eccf28SAndroid Build Coastguard Worker 122*e1eccf28SAndroid Build Coastguard Worker url = '{}/{}/{}'.format(url_base, path, pkg_name) 123*e1eccf28SAndroid Build Coastguard Worker 124*e1eccf28SAndroid Build Coastguard Worker TIMEOUT = '60' # In seconds. 125*e1eccf28SAndroid Build Coastguard Worker out_file_path = os.path.join(download_dir, pkg_name) 126*e1eccf28SAndroid Build Coastguard Worker with open(out_file_path, 'w') as out_file: 127*e1eccf28SAndroid Build Coastguard Worker print('Downloading {} to {}'.format(url, out_file_path)) 128*e1eccf28SAndroid Build Coastguard Worker subprocess.check_call( 129*e1eccf28SAndroid Build Coastguard Worker ['sso_client', '--location', '--request_timeout', TIMEOUT, url], 130*e1eccf28SAndroid Build Coastguard Worker stdout=out_file) 131*e1eccf28SAndroid Build Coastguard Worker return out_file_path 132*e1eccf28SAndroid Build Coastguard Worker 133*e1eccf28SAndroid Build Coastguard Worker 134*e1eccf28SAndroid Build Coastguard Workerdef extract_package(package, install_dir): 135*e1eccf28SAndroid Build Coastguard Worker cmd = ['tar', 'xf', package, '-C', install_dir] 136*e1eccf28SAndroid Build Coastguard Worker print('Extracting {}...'.format(package)) 137*e1eccf28SAndroid Build Coastguard Worker subprocess.check_call(cmd) 138*e1eccf28SAndroid Build Coastguard Worker 139*e1eccf28SAndroid Build Coastguard Worker 140*e1eccf28SAndroid Build Coastguard Workerdef update_renderscript(host, build_number, android_branch, use_current_branch, download_dir, bug): 141*e1eccf28SAndroid Build Coastguard Worker host_tag = host + '-x86' 142*e1eccf28SAndroid Build Coastguard Worker prebuilt_dir = android_path('prebuilts/renderscript/host', host_tag) 143*e1eccf28SAndroid Build Coastguard Worker os.chdir(prebuilt_dir) 144*e1eccf28SAndroid Build Coastguard Worker 145*e1eccf28SAndroid Build Coastguard Worker if not use_current_branch: 146*e1eccf28SAndroid Build Coastguard Worker subprocess.check_call( 147*e1eccf28SAndroid Build Coastguard Worker ['repo', 'start', 'update-renderscript-{}'.format(build_number), '.']) 148*e1eccf28SAndroid Build Coastguard Worker 149*e1eccf28SAndroid Build Coastguard Worker package = download_build(host, build_number, android_branch, download_dir) 150*e1eccf28SAndroid Build Coastguard Worker manifest = download_manifest(host, build_number, android_branch, download_dir) 151*e1eccf28SAndroid Build Coastguard Worker 152*e1eccf28SAndroid Build Coastguard Worker install_subdir = 'current' 153*e1eccf28SAndroid Build Coastguard Worker extract_package(package, prebuilt_dir) 154*e1eccf28SAndroid Build Coastguard Worker shutil.rmtree(install_subdir) 155*e1eccf28SAndroid Build Coastguard Worker shutil.move('renderscript-{}'.format(build_number), install_subdir) 156*e1eccf28SAndroid Build Coastguard Worker shutil.copy(manifest, install_subdir) 157*e1eccf28SAndroid Build Coastguard Worker 158*e1eccf28SAndroid Build Coastguard Worker print('Adding files to index...') 159*e1eccf28SAndroid Build Coastguard Worker subprocess.check_call(['git', 'add', install_subdir]) 160*e1eccf28SAndroid Build Coastguard Worker 161*e1eccf28SAndroid Build Coastguard Worker print('Committing update...') 162*e1eccf28SAndroid Build Coastguard Worker message_lines = [ 163*e1eccf28SAndroid Build Coastguard Worker 'Update prebuilt RenderScript to build {}.'.format(build_number), 164*e1eccf28SAndroid Build Coastguard Worker '', 165*e1eccf28SAndroid Build Coastguard Worker 'Built from {build_branch}, build {build_number}.'.format( 166*e1eccf28SAndroid Build Coastguard Worker build_branch=android_branch, 167*e1eccf28SAndroid Build Coastguard Worker build_number=build_number), 168*e1eccf28SAndroid Build Coastguard Worker ] 169*e1eccf28SAndroid Build Coastguard Worker if bug is not None: 170*e1eccf28SAndroid Build Coastguard Worker message_lines.append('') 171*e1eccf28SAndroid Build Coastguard Worker message_lines.append('Bug: http://b/{}'.format(bug)) 172*e1eccf28SAndroid Build Coastguard Worker message = '\n'.join(message_lines) 173*e1eccf28SAndroid Build Coastguard Worker subprocess.check_call(['git', 'commit', '-m', message]) 174*e1eccf28SAndroid Build Coastguard Worker 175*e1eccf28SAndroid Build Coastguard Worker 176*e1eccf28SAndroid Build Coastguard Workerdef main(): 177*e1eccf28SAndroid Build Coastguard Worker args = ArgParser().parse_args() 178*e1eccf28SAndroid Build Coastguard Worker 179*e1eccf28SAndroid Build Coastguard Worker download_dir = os.path.realpath('.download') 180*e1eccf28SAndroid Build Coastguard Worker if os.path.isdir(download_dir): 181*e1eccf28SAndroid Build Coastguard Worker shutil.rmtree(download_dir) 182*e1eccf28SAndroid Build Coastguard Worker os.makedirs(download_dir) 183*e1eccf28SAndroid Build Coastguard Worker 184*e1eccf28SAndroid Build Coastguard Worker try: 185*e1eccf28SAndroid Build Coastguard Worker hosts = ('darwin', 'linux', 'windows') 186*e1eccf28SAndroid Build Coastguard Worker for host in hosts: 187*e1eccf28SAndroid Build Coastguard Worker update_renderscript(host, args.build_number, args.android_branch, 188*e1eccf28SAndroid Build Coastguard Worker args.use_current_branch, download_dir, args.bug) 189*e1eccf28SAndroid Build Coastguard Worker finally: 190*e1eccf28SAndroid Build Coastguard Worker shutil.rmtree(download_dir) 191*e1eccf28SAndroid Build Coastguard Worker 192*e1eccf28SAndroid Build Coastguard Worker 193*e1eccf28SAndroid Build Coastguard Workerif __name__ == '__main__': 194*e1eccf28SAndroid Build Coastguard Worker main() 195