#!/usr/bin/env python # Copyright 2016 The Dart project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # This script downloads the latest dev SDK from # http://gsdview.appspot.com/dart-archive/channels/dev/raw/latest/sdk/ # into tools/sdks/. It is intended to be invoked from Jiri hooks in # a Fuchsia checkout. import os import sys import zipfile import urllib import utils HOST_OS = utils.GuessOS() HOST_ARCH = utils.GuessArchitecture() SCRIPT_DIR = os.path.dirname(sys.argv[0]) DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..')) DEFAULT_DART_VERSION = 'latest' BASE_URL = 'http://gsdview.appspot.com/dart-archive/channels/dev/raw/%s/sdk/%s' def host_os_for_sdk(host_os): if host_os.startswith('macos'): return 'mac' if host_os.startswith('win'): return 'windows' return host_os # Python's zipfile doesn't preserve file permissions during extraction, so we # have to do it manually. def extract_file(zf, info, extract_dir): try: zf.extract(info.filename, path=extract_dir) out_path = os.path.join(extract_dir, info.filename) perm = info.external_attr >> 16L os.chmod(out_path, perm) except IOError as err: if 'dart-sdk/bin/dart' in err.filename: print( 'Failed to extract the new Dart SDK dart binary. ' + 'Kill stale instances (like the analyzer) and try the update again' ) return False raise return True def main(argv): host_os = host_os_for_sdk(HOST_OS) zip_file = ('dartsdk-%s-x64-release.zip' % HOST_OS) sha_file = zip_file + '.sha256sum' sdk_path = os.path.join(DART_ROOT, 'tools', 'sdks') local_sha_path = os.path.join(sdk_path, sha_file) remote_sha_path = os.path.join(sdk_path, sha_file + '.remote') zip_path = os.path.join(sdk_path, zip_file) sdk_version = DEFAULT_DART_VERSION sha_url = (BASE_URL % (sdk_version, sha_file)) zip_url = (BASE_URL % (sdk_version, zip_file)) local_sha = '' if os.path.isfile(local_sha_path): with open(local_sha_path, 'r') as fp: local_sha = fp.read() remote_sha = '' urllib.urlretrieve(sha_url, remote_sha_path) with open(remote_sha_path, 'r') as fp: remote_sha = fp.read() os.remove(remote_sha_path) if local_sha == '' or local_sha != remote_sha: print 'Downloading prebuilt Dart SDK from: ' + zip_url urllib.urlretrieve(zip_url, zip_path) with zipfile.ZipFile(zip_path, 'r') as zf: for info in zf.infolist(): if not extract_file(zf, info, sdk_path): return -1 with open(local_sha_path, 'w') as fp: fp.write(remote_sha) return 0 if __name__ == '__main__': sys.exit(main(sys.argv))