|  | #!/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. | 
|  |  | 
|  | """Updates the Fuchsia SDK to the given revision. Should be used in a 'hooks_os' | 
|  | entry so that it only runs when .gclient's target_os includes 'fuchsia'.""" | 
|  |  | 
|  | import os | 
|  | import shutil | 
|  | import subprocess | 
|  | import sys | 
|  | import tarfile | 
|  | import tempfile | 
|  |  | 
|  | SDK_HASH_FILE = os.path.join(os.path.dirname(__file__), 'sdk.sha1') | 
|  |  | 
|  | REPOSITORY_ROOT = os.path.abspath(os.path.join( | 
|  | os.path.dirname(__file__), '..', '..')) | 
|  | sys.path.append(os.path.join(REPOSITORY_ROOT, 'build')) | 
|  |  | 
|  | import find_depot_tools | 
|  |  | 
|  | SDK_SUBDIRS = ["arch", "pkg", "qemu", "sysroot", "target", | 
|  | "toolchain_libs", "tools"] | 
|  |  | 
|  |  | 
|  | def EnsureDirExists(path): | 
|  | if not os.path.exists(path): | 
|  | print 'Creating directory %s' % path | 
|  | os.makedirs(path) | 
|  |  | 
|  |  | 
|  | # Removes previous SDK from the specified path if it's detected there. | 
|  | def Cleanup(path): | 
|  | hash_file = os.path.join(path, '.hash') | 
|  | if os.path.exists(hash_file): | 
|  | print 'Removing old SDK from %s.' % path | 
|  | for d in SDK_SUBDIRS: | 
|  | to_remove = os.path.join(path, d) | 
|  | if os.path.isdir(to_remove): | 
|  | shutil.rmtree(to_remove) | 
|  | os.remove(hash_file) | 
|  |  | 
|  |  | 
|  | # Updates the modification timestamps of |path| and its contents to the | 
|  | # current time. | 
|  | def UpdateTimestampsRecursive(path): | 
|  | for root, dirs, files in os.walk(path): | 
|  | for f in files: | 
|  | os.utime(os.path.join(root, f), None) | 
|  | for d in dirs: | 
|  | os.utime(os.path.join(root, d), None) | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | if len(sys.argv) != 1: | 
|  | print >>sys.stderr, 'usage: %s' % sys.argv[0] | 
|  | return 1 | 
|  |  | 
|  | # Previously SDK was unpacked in //third_party/fuchsia-sdk instead of | 
|  | # //third_party/fuchsia-sdk/sdk . Remove the old files if they are still | 
|  | # there. | 
|  | Cleanup(os.path.join(REPOSITORY_ROOT, 'third_party', 'fuchsia-sdk')) | 
|  |  | 
|  | with open(SDK_HASH_FILE, 'r') as f: | 
|  | sdk_hash = f.read().strip() | 
|  |  | 
|  | if not sdk_hash: | 
|  | print >>sys.stderr, 'No SHA1 found in %s' % SDK_HASH_FILE | 
|  | return 1 | 
|  |  | 
|  | output_dir = os.path.join(REPOSITORY_ROOT, 'third_party', 'fuchsia-sdk', | 
|  | 'sdk') | 
|  |  | 
|  | hash_filename = os.path.join(output_dir, '.hash') | 
|  | if os.path.exists(hash_filename): | 
|  | with open(hash_filename, 'r') as f: | 
|  | if f.read().strip() == sdk_hash: | 
|  | # Nothing to do. | 
|  | return 0 | 
|  |  | 
|  | print 'Downloading SDK %s...' % sdk_hash | 
|  |  | 
|  | if os.path.isdir(output_dir): | 
|  | shutil.rmtree(output_dir) | 
|  |  | 
|  | fd, tmp = tempfile.mkstemp() | 
|  | os.close(fd) | 
|  |  | 
|  | try: | 
|  | bucket = 'gs://fuchsia/sdk/linux-amd64/' | 
|  | cmd = [os.path.join(find_depot_tools.DEPOT_TOOLS_PATH, 'gsutil.py'), | 
|  | 'cp', bucket + sdk_hash, tmp] | 
|  | subprocess.check_call(cmd) | 
|  | with open(tmp, 'rb') as f: | 
|  | EnsureDirExists(output_dir) | 
|  | tarfile.open(mode='r:gz', fileobj=f).extractall(path=output_dir) | 
|  | finally: | 
|  | os.remove(tmp) | 
|  |  | 
|  | with open(hash_filename, 'w') as f: | 
|  | f.write(sdk_hash) | 
|  |  | 
|  | UpdateTimestampsRecursive(output_dir) | 
|  |  | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |