blob: fb305585d7bae6962b03dafe5a0c319eac13ddb9 [file] [log] [blame]
arobenc3aee5a2007-06-12 23:58:50 +00001#!/usr/bin/env python
2
3import os, random, sys, time, urllib
4
5#
6# Options
7#
8
9dry_run = len(sys.argv) > 1 and "--dry-run" in set(sys.argv[1:])
10quiet = len(sys.argv) > 1 and "--quiet" in set(sys.argv[1:])
11
12#
13# Functions and constants
14#
15
16def download_progress_hook(block_count, block_size, total_blocks):
17 if quiet or random.random() > 0.5:
18 return
19 sys.stdout.write(".")
20 sys.stdout.flush()
21
22def download_url_to_file(url, file, message):
23 if not quiet:
24 print message + " ",
25 if not dry_run:
26 dir = os.path.dirname(file)
27 if len(dir) and not os.path.exists(dir):
28 os.makedirs(dir)
29 urllib.urlretrieve(url, file, download_progress_hook)
30 if not quiet:
31 print
32
33# This is mostly just the list of North America http mirrors from http://cygwin.com/mirrors.html,
34# but a few have been removed that seemed unresponsive from Cupertino.
35mirror_servers = ["http://cygwin.elite-systems.org/",
36 "http://mirror.mcs.anl.gov/cygwin/",
37 "http://cygwin.osuosl.org/",
38 "http://mirrors.kernel.org/sourceware/cygwin/",
arobenc3aee5a2007-06-12 23:58:50 +000039 "http://mirrors.xmission.com/cygwin/",
40 "http://sourceware.mirrors.tds.net/pub/sourceware.org/cygwin/"]
41
42package_mirror_url = mirror_servers[random.choice(range(len(mirror_servers)))]
43
44def download_package(package, message):
45 download_url_to_file(package_mirror_url + package["path"], package["path"], message)
46
agomez@igalia.com6d022e82014-04-04 08:11:34 +000047required_packages = frozenset(["bc",
arobenc3aee5a2007-06-12 23:58:50 +000048 "bison",
49 "curl",
weinig04411e82007-06-14 21:42:56 +000050 "diffutils",
arobenc3aee5a2007-06-12 23:58:50 +000051 "e2fsprogs",
52 "emacs",
53 "flex",
agomez@igalia.com6d022e82014-04-04 08:11:34 +000054 "gcc-g++",
arobenc3aee5a2007-06-12 23:58:50 +000055 "gperf",
aroben24ab02e2007-10-03 00:18:47 +000056 "keychain",
roger_fong@apple.com29ea4662013-09-09 21:59:18 +000057 "lighttpd",
arobenc3aee5a2007-06-12 23:58:50 +000058 "make",
59 "nano",
60 "openssh",
61 "patch",
62 "perl",
63 "perl-libwin32",
arobenfb01b1b2007-09-26 01:56:43 +000064 "python",
arobenc3aee5a2007-06-12 23:58:50 +000065 "rebase",
arobenfb01b1b2007-09-26 01:56:43 +000066 "rsync",
aroben@apple.com5bae8ab2008-03-21 16:29:09 +000067 "ruby",
arobenc3aee5a2007-06-12 23:58:50 +000068 "subversion",
69 "unzip",
70 "vim",
71 "zip"])
72
agomez@igalia.comac65be92014-04-17 16:47:56 +000073required_packages_versions = {"curl": "7.33.0-1",
74 "libcurl4": "7.33.0-1",
75 "python": "2.6.8-2",
76 "subversion": "1.7.14-1"}
agomez@igalia.com6d022e82014-04-04 08:11:34 +000077
arobenc3aee5a2007-06-12 23:58:50 +000078#
79# Main
80#
81
82print "Using Cygwin mirror server " + package_mirror_url + " to download setup.ini..."
83
roger_fong@apple.coma9a13672013-09-12 22:46:57 +000084urllib.urlretrieve(package_mirror_url + "x86/setup.ini", "setup.ini.orig")
arobenc3aee5a2007-06-12 23:58:50 +000085
86downloaded_packages_file_path = "setup.ini.orig"
87downloaded_packages_file = file(downloaded_packages_file_path, "r")
88if not dry_run:
89 modified_packages_file = file("setup.ini", "w")
90
91packages = {}
92current_package = ''
93for line in downloaded_packages_file.readlines():
94 if line[0] == "@":
95 current_package = line[2:-1]
agomez@igalia.com6d022e82014-04-04 08:11:34 +000096 packages[current_package] = {"name": current_package, "needs_download": False, "requires": [], "path": "", "version": "", "found_version": False}
97 if current_package in required_packages_versions:
98 packages[current_package]["version"] = required_packages_versions[current_package]
arobenc3aee5a2007-06-12 23:58:50 +000099 elif line[:10] == "category: ":
100 if current_package in required_packages:
101 line = "category: Base\n"
102 if "Base" in set(line[10:-1].split()):
103 packages[current_package]["needs_download"] = True
104 elif line[:10] == "requires: ":
105 packages[current_package]["requires"] = line[10:].split()
106 packages[current_package]["requires"].sort()
agomez@igalia.com6d022e82014-04-04 08:11:34 +0000107 elif line[:9] == "version: " and not packages[current_package]["found_version"]:
108 if not len(packages[current_package]["version"]):
109 packages[current_package]["version"] = line[9:-1]
110 packages[current_package]["found_version"] = True
111 else:
112 packages[current_package]["found_version"] = (packages[current_package]["version"] == line[9:-1])
113 elif line[:9] == "install: " and packages[current_package]["found_version"] and not len(packages[current_package]["path"]):
arobenc3aee5a2007-06-12 23:58:50 +0000114 end_of_path = line.find(" ", 9)
115 if end_of_path != -1:
116 packages[current_package]["path"] = line[9:end_of_path]
117 if not dry_run:
118 modified_packages_file.write(line)
119
120downloaded_packages_file.close()
121os.remove(downloaded_packages_file_path)
122if not dry_run:
123 modified_packages_file.close()
124
125names_to_download = set()
126package_names = packages.keys()
127package_names.sort()
128
129def add_package_and_dependencies(name):
130 if name in names_to_download:
131 return
jhoneycutt@apple.com5525faa2008-07-17 06:20:23 +0000132 if not name in packages:
alp@webkit.org422ef292008-05-25 05:25:11 +0000133 return
arobenc3aee5a2007-06-12 23:58:50 +0000134 packages[name]["needs_download"] = True
135 names_to_download.add(name)
136 for dep in packages[name]["requires"]:
137 add_package_and_dependencies(dep)
138
139for name in package_names:
140 if packages[name]["needs_download"]:
141 add_package_and_dependencies(name)
142
143downloaded_so_far = 0
144for name in package_names:
145 if packages[name]["needs_download"]:
146 downloaded_so_far += 1
147 download_package(packages[name], "Downloading package %3d of %3d (%s)" % (downloaded_so_far, len(names_to_download), name))
148
roger_fong@apple.com29ea4662013-09-09 21:59:18 +0000149download_url_to_file("http://cygwin.com/setup-x86.exe", "setup.exe", "Downloading setup.exe")
arobenc3aee5a2007-06-12 23:58:50 +0000150
151seconds_to_sleep = 10
152
153print """
154Finished downloading Cygwin. In %d seconds,
agomez@igalia.comee1256c2014-04-16 18:51:56 +0000155I will run setup.exe. All the suitable options have
156been already selected for you.
157""" % (seconds_to_sleep)
arobenc3aee5a2007-06-12 23:58:50 +0000158
159
160while seconds_to_sleep > 0:
161 print "%d..." % seconds_to_sleep,
162 sys.stdout.flush()
163 time.sleep(1)
164 seconds_to_sleep -= 1
165print
166
167if not dry_run:
agomez@igalia.comee1256c2014-04-16 18:51:56 +0000168 os.execv("setup.exe", list(("-L", "-l", os.getcwd(), "-P", ",".join(required_packages))))