📄 cygwin-downloader.py
字号:
#!/usr/bin/env pythonimport os, random, sys, time, urllib## Options#dry_run = len(sys.argv) > 1 and "--dry-run" in set(sys.argv[1:])quiet = len(sys.argv) > 1 and "--quiet" in set(sys.argv[1:])## Functions and constants#def download_progress_hook(block_count, block_size, total_blocks): if quiet or random.random() > 0.5: return sys.stdout.write(".") sys.stdout.flush()def download_url_to_file(url, file, message): if not quiet: print message + " ", if not dry_run: dir = os.path.dirname(file) if len(dir) and not os.path.exists(dir): os.makedirs(dir) urllib.urlretrieve(url, file, download_progress_hook) if not quiet: print # This is mostly just the list of North America http mirrors from http://cygwin.com/mirrors.html,# but a few have been removed that seemed unresponsive from Cupertino.mirror_servers = ["http://cygwin.elite-systems.org/", "http://mirror.mcs.anl.gov/cygwin/", "http://cygwin.osuosl.org/", "http://mirrors.kernel.org/sourceware/cygwin/", "http://mirrors.xmission.com/cygwin/", "http://sourceware.mirrors.tds.net/pub/sourceware.org/cygwin/"]package_mirror_url = mirror_servers[random.choice(range(len(mirror_servers)))]def download_package(package, message): download_url_to_file(package_mirror_url + package["path"], package["path"], message)required_packages = frozenset(["apache", "bc", "bison", "curl", "diffutils", "e2fsprogs", "emacs", "flex", "gcc", "gperf", "keychain", "make", "nano", "openssh", "patch", "perl", "perl-libwin32", "python", "rebase", "rsync", "ruby", "subversion", "unzip", "vim", "zip"])## Main#print "Using Cygwin mirror server " + package_mirror_url + " to download setup.ini..."urllib.urlretrieve(package_mirror_url + "setup.ini", "setup.ini.orig")downloaded_packages_file_path = "setup.ini.orig"downloaded_packages_file = file(downloaded_packages_file_path, "r")if not dry_run: modified_packages_file = file("setup.ini", "w")packages = {}current_package = ''for line in downloaded_packages_file.readlines(): if line[0] == "@": current_package = line[2:-1] packages[current_package] = {"name": current_package, "needs_download": False, "requires": [], "path": ""} elif line[:10] == "category: ": if current_package in required_packages: line = "category: Base\n" if "Base" in set(line[10:-1].split()): packages[current_package]["needs_download"] = True elif line[:10] == "requires: ": packages[current_package]["requires"] = line[10:].split() packages[current_package]["requires"].sort() elif line[:9] == "install: " and not len(packages[current_package]["path"]): end_of_path = line.find(" ", 9) if end_of_path != -1: packages[current_package]["path"] = line[9:end_of_path] if not dry_run: modified_packages_file.write(line)downloaded_packages_file.close()os.remove(downloaded_packages_file_path)if not dry_run: modified_packages_file.close()names_to_download = set()package_names = packages.keys()package_names.sort()def add_package_and_dependencies(name): if name in names_to_download: return if not name in packages: return packages[name]["needs_download"] = True names_to_download.add(name) for dep in packages[name]["requires"]: add_package_and_dependencies(dep)for name in package_names: if packages[name]["needs_download"]: add_package_and_dependencies(name)downloaded_so_far = 0for name in package_names: if packages[name]["needs_download"]: downloaded_so_far += 1 download_package(packages[name], "Downloading package %3d of %3d (%s)" % (downloaded_so_far, len(names_to_download), name))download_url_to_file("http://cygwin.com/setup.exe", "setup.exe", "Downloading setup.exe")seconds_to_sleep = 10print """Finished downloading Cygwin. In %d seconds,I will run setup.exe. Select the "Installfrom Local Directory" option and browse to"%s"when asked for the "Local Package Directory".""" % (seconds_to_sleep, os.getcwd())while seconds_to_sleep > 0: print "%d..." % seconds_to_sleep, sys.stdout.flush() time.sleep(1) seconds_to_sleep -= 1printif not dry_run: os.execl("setup.exe")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -