From b49b9d673c5828a36aefa3f65c738d6189fb3766 Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 7 May 2014 13:36:08 +0800 Subject: [PATCH] download-deps.py will unzip the download zip file. Output more detail informations --- download-deps.py | 161 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 132 insertions(+), 29 deletions(-) diff --git a/download-deps.py b/download-deps.py index 6cbf4efbf4..f472ad7490 100755 --- a/download-deps.py +++ b/download-deps.py @@ -9,37 +9,83 @@ # be hosted separately. # +"""**************************************************************************** +Copyright (c) 2014 cocos2d-x.org +Copyright (c) 2014 Chukong Technologies Inc. + +http://www.cocos2d-x.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +****************************************************************************""" + + import urllib2 import os.path,zipfile import shutil import sys import traceback import distutils +import fileinput +from optparse import OptionParser 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 +_workpath='' -def download_file(url, file_name): - print("--> Ready to download %s from %s" % (file_name, url)) +# -- Section for configuring file url ----- +# github server may not reponse a header information which contains `Content-Length`, +# therefore, the size needs to be written hardcode here. While server doesn't return +# `Content-Length`, use it instead +_zip_file_bytes = 57132755 +_repo_name = 'cocos2d-x-external' +_filename_prefix = 'v3-deps-1' +_filename = _filename_prefix + '.zip' +_downloaded_file_url = 'https://github.com/cocos2d/' + _repo_name + '/archive/' + _filename +# 'v' letter was swallowed by github, so we need to substring it from the 2nd letter +_extracted_folder_name = _repo_name + '-' + _filename_prefix[1:] +# ---------------------------------------- + +_remove_downloaded_zip_file = None + +def get_input_value(prompt): + ret = raw_input(prompt) + ret.rstrip(" \t") + return ret + +def download_file(url, filename): + print("==> Ready to download '%s' from '%s'" % (filename, url)) u = urllib2.urlopen(url) - f = open(file_name, 'wb') + f = open(filename, '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("==> WARNING: Couldn't grab the file size!") + file_size = _zip_file_bytes - print("--> Start to download, please wait ...") + print("==> Start to download, please wait ...") file_size_dl = 0 block_sz = 8192 @@ -60,9 +106,9 @@ def download_file(url, file_name): status = "" if file_size != 0: percent = 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) + 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 = r"Downloaded: %6dK, Speed: %6.2f KB/S " % (file_size_dl / 1000, speed) status = status + chr(8)*(len(status)+1) print(status), @@ -70,7 +116,7 @@ def download_file(url, file_name): block_size_per_second = 0 old_time = new_time - print("--> Downloading finished!") + print("==> Downloading finished!") f.close() def default_filter(src,dst): @@ -81,6 +127,13 @@ def ensure_directory(target): if not os.path.exists(target): os.mkdir(target) + +class UnrecognizedFormat: + def __init__(self, prompt): + self._prompt = prompt + def __str__(self): + return self._prompt + def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): """Unpack zip `filename` to `extract_dir` @@ -90,8 +143,9 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): """ if not zipfile.is_zipfile(filename): - raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + raise UnrecognizedFormat("%s is not a zip file" % (filename)) + print("==> Extracting files, please wait ...") z = zipfile.ZipFile(filename) try: for info in z.infolist(): @@ -122,31 +176,80 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): os.chmod(target, unix_attributes) finally: z.close() + print("==> Extraction done!") + + +def ask_to_delete_downloaded_zip_file(filename): + ret = get_input_value("==> Whether to delete the downloaded zip file? It may be reused when you execute this script next time! (yes/no): ") + ret = ret.strip() + if ret != 'yes' and ret != 'no': + print("==> Invalid answer, please answer 'yes' or 'no'!") + ask_to_delete_downloaded_zip_file(filename) + + if ret == "yes": + os.remove(filename) + +def download_and_unzip_file(url, filename): + if not os.path.isfile(filename): + download_file(url, filename) + try: + unpack_zipfile(filename, _workpath) + except UnrecognizedFormat as e: + print("==> Unrecognized zip format from your local '%s' file!" % (filename)) + if os.path.isfile(filename): + os.remove(filename) + print("==> Download it from internet again, please wait...") + download_and_unzip_file(url, filename) def main(): - workpath = os.path.dirname(os.path.realpath(__file__)) + _workpath = os.path.dirname(os.path.realpath(__file__)) - if os.path.exists(extracted_folder_name): - shutil.rmtree(extracted_folder_name) + 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') + download_and_unzip_file(_downloaded_file_url, _filename) - 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!") + print("==> Copying files...") + folder_for_extracting = os.path.join(_workpath, 'external') + if not os.path.exists(folder_for_extracting): + os.mkdir(folder_for_extracting) + distutils.dir_util.copy_tree(_extracted_folder_name, folder_for_extracting) + print("==> Cleaning...") + if os.path.exists(_extracted_folder_name): + shutil.rmtree(_extracted_folder_name) + if _remove_downloaded_zip_file: + if os.path.isfile(_filename): + os.remove(_filename) + else: + if os.path.isfile(_filename): + ask_to_delete_downloaded_zip_file(_filename) + print("==> DONE! Prebuilt libraries were installed successfully! Cheers!") + + +def _check_python_version(): + major_ver = sys.version_info[0] + if major_ver > 2: + print ("The python version is %d.%d. But python 2.x is required. (Version 2.7 is well tested)\n" + "Download it here: https://www.python.org/" % (major_ver, sys.version_info[1])) + return False + + return True # -------------- main -------------- if __name__ == '__main__': try: + if not _check_python_version(): + exit() + + parser = OptionParser() + parser.add_option('-r', '--remove-download', + action="store_true", dest='to_remove_downloaded_zip_file', default=False, + help='Whether to remove downloaded zip file') + (opts, args) = parser.parse_args() + + if opts.to_remove_downloaded_zip_file: + _remove_downloaded_zip_file = True + main() except Exception as e: traceback.print_exc()