From cafe263883920372bb0539647f348c754ab80315 Mon Sep 17 00:00:00 2001 From: James Chen Date: Tue, 6 May 2014 18:33:52 +0800 Subject: [PATCH] Re-adds download-deps.py, comments unzip functionality, please help to test the download functionality. Thanks. --- download-deps.py | 152 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 download-deps.py diff --git a/download-deps.py b/download-deps.py new file mode 100755 index 0000000000..4264d6f852 --- /dev/null +++ b/download-deps.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +#coding=utf-8 +# +# ./download-deps.py +# +# Download Cocos2D-X resources from github (https://github.com/cocos2d/cocos2d-x-external) and extract from ZIP +# +# Helps prevent repo bloat due to large binary files since they can +# be hosted separately. +# + +import urllib2 +import os.path,zipfile +import shutil +import sys +import traceback +import distutils + +from time import time +from sys import stdout +from distutils.errors import DistutilsError +from distutils.dir_util import copy_tree, remove_tree + +prefix = 'https://github.com/cocos2d/cocos2d-x-external/archive/' +filename = 'v3-deps-1' +extracted_folder_name='cocos2d-x-resources-' + filename + +def download_file(url, file_name): + print("--> Ready to download %s from %s" % (file_name, url)) + + u = urllib2.urlopen(url) + f = open(file_name, 'wb') + meta = u.info() + content_len = meta.getheaders("Content-Length") + file_size = 0 + if content_len and len(content_len) > 0: + file_size = int(content_len[0]) + print("--> Get file size succeed!") + else: + print("WARNING: Couldn't grab the file size, ignore it") + + print("--> Start to download, please wait ...") + + file_size_dl = 0 + block_sz = 8192 + + old_time=time() + + while True: + buffer = u.read(block_sz) + if not buffer: + break + + file_size_dl += len(buffer) + + f.write(buffer) + new_time = time() + if (new_time - old_time) > 1: + speed = len(buffer) / (new_time - old_time) / 1000 + status = "" + if file_size != 0: + percent = int(file_size_dl * 100. / file_size) + status = r" Downloaded: %6dK / Total: %dK, Percent: %3.2f%%, Speed: %6.2f KB/S" % (file_size_dl / 1000, file_size / 1000, percent, speed) + else: + status = r" Downloaded: %6dK, Speed: %6.2f KB/S" % (file_size_dl / 1000, speed) + + status = status + chr(8)*(len(status)+1) + print(status), + sys.stdout.flush() + old_time = new_time + + print("--> Downloading finished!") + f.close() + +def default_filter(src,dst): + """The default progress/filter callback; returns True for all files""" + return dst + +def ensure_directory(target): + if not os.path.exists(target): + os.mkdir(target) + +def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): + """Unpack zip `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined + by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + + if not zipfile.is_zipfile(filename): + raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + + z = zipfile.ZipFile(filename) + try: + for info in z.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + target = progress_filter(name, target) + if not target: + continue + if name.endswith('/'): + # directory + ensure_directory(target) + else: + # file + data = z.read(info.filename) + f = open(target,'wb') + try: + f.write(data) + finally: + f.close() + del data + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) + finally: + z.close() + +def main(): + workpath = os.path.dirname(os.path.realpath(__file__)) + + if os.path.exists(extracted_folder_name): + shutil.rmtree(extracted_folder_name) + + # if not os.path.isfile(filename + '.zip'): + download_file(prefix+filename+'.zip', filename+'.zip') + + print("--> Extracting files, please wait ...") + # unpack_zipfile(filename+'.zip', workpath) + print("--> Extraction done!") + print("--> Copying files ...") + # distutils.dir_util.copy_tree(extracted_folder_name, workpath) + print("--> Cleaning ...") + # if os.path.isfile(filename+'.zip'): + # os.remove(filename+'.zip') + # if os.path.exists(extracted_folder_name): + # shutil.rmtree(extracted_folder_name) + print("--> DONE! Cheers!") + +# -------------- main -------------- +if __name__ == '__main__': + try: + main() + except Exception as e: + traceback.print_exc() + sys.exit(1)