1#! /usr/bin/env python 2 3# Copyright 2018 Google Inc. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7import hashlib 8import multiprocessing 9import os 10import shutil 11import sys 12import tempfile 13import urllib2 14 15def checksum(path): 16 if not os.path.exists(path): 17 return None 18 m = hashlib.md5() 19 with open(path, 'rb') as f: 20 while True: 21 buf = f.read(4096) 22 if 0 == len(buf): 23 return m.hexdigest() 24 m.update(buf) 25 26def download(md5, path): 27 if not md5 == checksum(path): 28 dirname = os.path.dirname(path) 29 if dirname and not os.path.exists(dirname): 30 try: 31 os.makedirs(dirname) 32 except: 33 # ignore race condition 34 if not os.path.exists(dirname): 35 raise 36 url = 'https://storage.googleapis.com/skia-skqp-assets/' + md5 37 with open(path, 'wb') as o: 38 shutil.copyfileobj(urllib2.urlopen(url), o) 39 40def tmp(prefix): 41 fd, path = tempfile.mkstemp(prefix=prefix) 42 os.close(fd) 43 return path 44 45def main(): 46 target_dir = os.path.join('platform_tools', 'android', 'apps', 'skqp', 'src', 'main', 'assets') 47 os.chdir(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, target_dir)) 48 checksum_path = 'files.checksum' 49 if not os.path.isfile(checksum_path): 50 sys.stderr.write('Error: "%s" is missing.\n' % os.path.join(target_dir, checksum_path)) 51 sys.exit(1) 52 file_list_file = tmp('files_') 53 with open(checksum_path, 'r') as f: 54 md5 = f.read().strip() 55 assert(len(md5) == 32) 56 download(md5, file_list_file) 57 with open(file_list_file, 'r') as f: 58 records = [] 59 for line in f: 60 md5, path = line.strip().split(';', 1) 61 records.append((md5, path)) 62 sys.stderr.write('Downloading %d files.\n' % len(records)) 63 pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() * 2) 64 for record in records: 65 pool.apply_async(download, record, callback=lambda x: sys.stderr.write('.')) 66 pool.close() 67 pool.join() 68 sys.stderr.write('\n') 69 70if __name__ == '__main__': 71 main() 72