~cjwatson/storm/psycopg-2.5

415.1.19 by Gavin Panella
Go completely over to the Dark, ahem, setuptools side.
1
#!python
2
"""Bootstrap setuptools installation
3
4
If you want to use setuptools in your package's setup.py, just include this
5
file in the same directory with it, and add this to the top of your setup.py::
6
7
    from ez_setup import use_setuptools
8
    use_setuptools()
9
10
If you want to require a specific version of setuptools, set a download
11
mirror, or use an alternate download directory, you can do so by supplying
12
the appropriate options to ``use_setuptools()``.
13
14
This file can also be run as a script to install or upgrade setuptools.
15
"""
16
import sys
17
DEFAULT_VERSION = "0.6c11"
18
DEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
19
20
md5_data = {
21
    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
22
    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
23
    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
24
    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
25
    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
26
    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
27
    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
28
    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
29
    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
30
    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
31
    'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090',
32
    'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4',
33
    'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7',
34
    'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5',
35
    'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de',
36
    'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b',
37
    'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2',
38
    'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086',
39
    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
40
    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
41
    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
42
    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
43
    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
44
    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
45
    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
46
    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
47
    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
48
    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
49
    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
50
    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
51
    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
52
    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
53
    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
54
    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
55
    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
56
    'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
57
    'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
58
    'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
59
    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
60
    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
61
    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
62
    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
63
}
64
65
import sys, os
66
try: from hashlib import md5
67
except ImportError: from md5 import md5
68
69
def _validate_md5(egg_name, data):
70
    if egg_name in md5_data:
71
        digest = md5(data).hexdigest()
72
        if digest != md5_data[egg_name]:
73
            print >>sys.stderr, (
74
                "md5 validation of %s failed!  (Possible download problem?)"
75
                % egg_name
76
            )
77
            sys.exit(2)
78
    return data
79
80
def use_setuptools(
81
    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
82
    download_delay=15
83
):
84
    """Automatically find/download setuptools and make it available on sys.path
85
86
    `version` should be a valid setuptools version number that is available
87
    as an egg for download under the `download_base` URL (which should end with
88
    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
89
    it is not already available.  If `download_delay` is specified, it should
90
    be the number of seconds that will be paused before initiating a download,
91
    should one be required.  If an older version of setuptools is installed,
92
    this routine will print a message to ``sys.stderr`` and raise SystemExit in
93
    an attempt to abort the calling script.
94
    """
95
    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
96
    def do_download():
97
        egg = download_setuptools(version, download_base, to_dir, download_delay)
98
        sys.path.insert(0, egg)
99
        import setuptools; setuptools.bootstrap_install_from = egg
100
    try:
101
        import pkg_resources
102
    except ImportError:
103
        return do_download()       
104
    try:
105
        pkg_resources.require("setuptools>="+version); return
106
    except pkg_resources.VersionConflict, e:
107
        if was_imported:
108
            print >>sys.stderr, (
109
            "The required version of setuptools (>=%s) is not available, and\n"
110
            "can't be installed while this script is running. Please install\n"
111
            " a more recent version first, using 'easy_install -U setuptools'."
112
            "\n\n(Currently using %r)"
113
            ) % (version, e.args[0])
114
            sys.exit(2)
115
    except pkg_resources.DistributionNotFound:
116
        pass
117
118
    del pkg_resources, sys.modules['pkg_resources']    # reload ok
119
    return do_download()
120
121
def download_setuptools(
122
    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
123
    delay = 15
124
):
125
    """Download setuptools from a specified location and return its filename
126
127
    `version` should be a valid setuptools version number that is available
128
    as an egg for download under the `download_base` URL (which should end
129
    with a '/'). `to_dir` is the directory where the egg will be downloaded.
130
    `delay` is the number of seconds to pause before an actual download attempt.
131
    """
132
    import urllib2, shutil
133
    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
134
    url = download_base + egg_name
135
    saveto = os.path.join(to_dir, egg_name)
136
    src = dst = None
137
    if not os.path.exists(saveto):  # Avoid repeated downloads
138
        try:
139
            from distutils import log
140
            if delay:
141
                log.warn("""
142
---------------------------------------------------------------------------
143
This script requires setuptools version %s to run (even to display
144
help).  I will attempt to download it for you (from
145
%s), but
146
you may need to enable firewall access for this script first.
147
I will start the download in %d seconds.
148
149
(Note: if this machine does not have network access, please obtain the file
150
151
   %s
152
153
and place it in this directory before rerunning this script.)
154
---------------------------------------------------------------------------""",
155
                    version, download_base, delay, url
156
                ); from time import sleep; sleep(delay)
157
            log.warn("Downloading %s", url)
158
            src = urllib2.urlopen(url)
159
            # Read/write all in one block, so we don't create a corrupt file
160
            # if the download is interrupted.
161
            data = _validate_md5(egg_name, src.read())
162
            dst = open(saveto,"wb"); dst.write(data)
163
        finally:
164
            if src: src.close()
165
            if dst: dst.close()
166
    return os.path.realpath(saveto)
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
def main(argv, version=DEFAULT_VERSION):
204
    """Install or upgrade setuptools and EasyInstall"""
205
    try:
206
        import setuptools
207
    except ImportError:
208
        egg = None
209
        try:
210
            egg = download_setuptools(version, delay=0)
211
            sys.path.insert(0,egg)
212
            from setuptools.command.easy_install import main
213
            return main(list(argv)+[egg])   # we're done here
214
        finally:
215
            if egg and os.path.exists(egg):
216
                os.unlink(egg)
217
    else:
218
        if setuptools.__version__ == '0.0.1':
219
            print >>sys.stderr, (
220
            "You have an obsolete version of setuptools installed.  Please\n"
221
            "remove it from your system entirely before rerunning this script."
222
            )
223
            sys.exit(2)
224
225
    req = "setuptools>="+version
226
    import pkg_resources
227
    try:
228
        pkg_resources.require(req)
229
    except pkg_resources.VersionConflict:
230
        try:
231
            from setuptools.command.easy_install import main
232
        except ImportError:
233
            from easy_install import main
234
        main(list(argv)+[download_setuptools(delay=0)])
235
        sys.exit(0) # try to force an exit
236
    else:
237
        if argv:
238
            from setuptools.command.easy_install import main
239
            main(argv)
240
        else:
241
            print "Setuptools version",version,"or greater has been installed."
242
            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
243
244
def update_md5(filenames):
245
    """Update our built-in md5 registry"""
246
247
    import re
248
249
    for name in filenames:
250
        base = os.path.basename(name)
251
        f = open(name,'rb')
252
        md5_data[base] = md5(f.read()).hexdigest()
253
        f.close()
254
255
    data = ["    %r: %r,\n" % it for it in md5_data.items()]
256
    data.sort()
257
    repl = "".join(data)
258
259
    import inspect
260
    srcfile = inspect.getsourcefile(sys.modules[__name__])
261
    f = open(srcfile, 'rb'); src = f.read(); f.close()
262
263
    match = re.search("\nmd5_data = {\n([^}]+)}", src)
264
    if not match:
265
        print >>sys.stderr, "Internal error!"
266
        sys.exit(2)
267
268
    src = src[:match.start(1)] + repl + src[match.end(1):]
269
    f = open(srcfile,'w')
270
    f.write(src)
271
    f.close()
272
273
274
if __name__=='__main__':
275
    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
276
        update_md5(sys.argv[2:])
277
    else:
278
        main(sys.argv[1:])
279
280
281
282
283
284