~launchpad-pqm/launchpad/devel

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