| #!/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/$HOST_OS/. 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', host_os) |
| 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)) |