~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to bootstrap.py

  • Committer: Gary Poster
  • Date: 2010-08-23 14:40:19 UTC
  • mto: (11057.9.14 lsprof-on-demand)
  • mto: This revision was merged to the branch mainline in revision 11419.
  • Revision ID: gary.poster@canonical.com-20100823144019-yfohz9vwzklr9jss
use the newest zc.buildout, zc.recipe.egg, z3c.recipe.scripts, and bootstrap.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
##############################################################################
2
2
#
3
 
# Copyright (c) 2006 Zope Corporation and Contributors.
 
3
# Copyright (c) 2006 Zope Foundation and Contributors.
4
4
# All Rights Reserved.
5
5
#
6
6
# This software is subject to the provisions of the Zope Public License,
16
16
Simply run this script in a directory containing a buildout.cfg.
17
17
The script accepts buildout command-line options, so you can
18
18
use the -c option to specify an alternate configuration file.
19
 
 
20
 
$Id$
21
19
"""
22
20
 
23
 
import os, shutil, sys, tempfile, textwrap, urllib, urllib2
 
21
import os, shutil, sys, tempfile, textwrap, urllib, urllib2, subprocess
24
22
from optparse import OptionParser
25
23
 
26
24
if sys.platform == 'win32':
32
30
else:
33
31
    quote = str
34
32
 
 
33
# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
 
34
stdout, stderr = subprocess.Popen(
 
35
    [sys.executable, '-Sc',
 
36
     'try:\n'
 
37
     '    import ConfigParser\n'
 
38
     'except ImportError:\n'
 
39
     '    print 1\n'
 
40
     'else:\n'
 
41
     '    print 0\n'],
 
42
    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
 
43
has_broken_dash_S = bool(int(stdout.strip()))
 
44
 
35
45
# In order to be more robust in the face of system Pythons, we want to
36
46
# run without site-packages loaded.  This is somewhat tricky, in
37
47
# particular because Python 2.6's distutils imports site, so starting
38
48
# with the -S flag is not sufficient.  However, we'll start with that:
39
 
if 'site' in sys.modules:
 
49
if not has_broken_dash_S and 'site' in sys.modules:
40
50
    # We will restart with python -S.
41
51
    args = sys.argv[:]
42
52
    args[0:0] = [sys.executable, '-S']
109
119
                  help=("Specify a directory for storing eggs.  Defaults to "
110
120
                        "a temporary directory that is deleted when the "
111
121
                        "bootstrap script completes."))
 
122
parser.add_option("-t", "--accept-buildout-test-releases",
 
123
                  dest='accept_buildout_test_releases',
 
124
                  action="store_true", default=False,
 
125
                  help=("Normally, if you do not specify a --version, the "
 
126
                        "bootstrap script and buildout gets the newest "
 
127
                        "*final* versions of zc.buildout and its recipes and "
 
128
                        "extensions for you.  If you use this flag, "
 
129
                        "bootstrap and buildout will get the newest releases "
 
130
                        "even if they are alphas or betas."))
112
131
parser.add_option("-c", None, action="store", dest="config_file",
113
132
                   help=("Specify the path to the buildout configuration "
114
133
                         "file to be used."))
115
134
 
116
135
options, args = parser.parse_args()
117
136
 
118
 
# if -c was provided, we push it back into args for buildout' main function
 
137
# if -c was provided, we push it back into args for buildout's main function
119
138
if options.config_file is not None:
120
139
    args += ['-c', options.config_file]
121
140
 
130
149
    else:
131
150
        options.setup_source = setuptools_source
132
151
 
133
 
args = args + ['bootstrap']
134
 
 
 
152
if options.accept_buildout_test_releases:
 
153
    args.append('buildout:accept-buildout-test-releases=true')
 
154
args.append('bootstrap')
135
155
 
136
156
try:
137
 
    to_reload = False
138
157
    import pkg_resources
139
 
    to_reload = True
 
158
    import setuptools # A flag.  Sometimes pkg_resources is installed alone.
140
159
    if not hasattr(pkg_resources, '_distribute'):
141
160
        raise ImportError
142
 
    import setuptools # A flag.  Sometimes pkg_resources is installed alone.
143
161
except ImportError:
144
162
    ez_code = urllib2.urlopen(
145
163
        options.setup_source).read().replace('\r\n', '\n')
151
169
    if options.use_distribute:
152
170
        setup_args['no_fake'] = True
153
171
    ez['use_setuptools'](**setup_args)
154
 
    if to_reload:
155
 
        reload(pkg_resources)
156
 
    else:
157
 
        import pkg_resources
 
172
    reload(sys.modules['pkg_resources'])
 
173
    import pkg_resources
158
174
    # This does not (always?) update the default working set.  We will
159
175
    # do it.
160
176
    for path in sys.path:
167
183
       '-mqNxd',
168
184
       quote(eggs_dir)]
169
185
 
170
 
if options.download_base:
171
 
    cmd.extend(['-f', quote(options.download_base)])
 
186
if not has_broken_dash_S:
 
187
    cmd.insert(1, '-S')
172
188
 
173
 
requirement = 'zc.buildout'
174
 
if options.version:
175
 
    requirement = '=='.join((requirement, options.version))
176
 
cmd.append(requirement)
 
189
find_links = options.download_base
 
190
if not find_links:
 
191
    find_links = os.environ.get('bootstrap-testing-find-links')
 
192
if find_links:
 
193
    cmd.extend(['-f', quote(find_links)])
177
194
 
178
195
if options.use_distribute:
179
196
    setup_requirement = 'distribute'
180
197
else:
181
198
    setup_requirement = 'setuptools'
182
199
ws = pkg_resources.working_set
 
200
setup_requirement_path = ws.find(
 
201
    pkg_resources.Requirement.parse(setup_requirement)).location
183
202
env = dict(
184
203
    os.environ,
185
 
    PYTHONPATH=ws.find(
186
 
        pkg_resources.Requirement.parse(setup_requirement)).location)
 
204
    PYTHONPATH=setup_requirement_path)
 
205
 
 
206
requirement = 'zc.buildout'
 
207
version = options.version
 
208
if version is None and not options.accept_buildout_test_releases:
 
209
    # Figure out the most recent final version of zc.buildout.
 
210
    import setuptools.package_index
 
211
    _final_parts = '*final-', '*final'
 
212
    def _final_version(parsed_version):
 
213
        for part in parsed_version:
 
214
            if (part[:1] == '*') and (part not in _final_parts):
 
215
                return False
 
216
        return True
 
217
    index = setuptools.package_index.PackageIndex(
 
218
        search_path=[setup_requirement_path])
 
219
    if find_links:
 
220
        index.add_find_links((find_links,))
 
221
    req = pkg_resources.Requirement.parse(requirement)
 
222
    if index.obtain(req) is not None:
 
223
        best = []
 
224
        bestv = None
 
225
        for dist in index[req.project_name]:
 
226
            distv = dist.parsed_version
 
227
            if _final_version(distv):
 
228
                if bestv is None or distv > bestv:
 
229
                    best = [dist]
 
230
                    bestv = distv
 
231
                elif distv == bestv:
 
232
                    best.append(dist)
 
233
        if best:
 
234
            best.sort()
 
235
            version = best[-1].version
 
236
if version:
 
237
    requirement = '=='.join((requirement, version))
 
238
cmd.append(requirement)
187
239
 
188
240
if is_jython:
189
241
    import subprocess
193
245
if exitcode != 0:
194
246
    sys.stdout.flush()
195
247
    sys.stderr.flush()
196
 
    print ("An error occured when trying to install zc.buildout. "
 
248
    print ("An error occurred when trying to install zc.buildout. "
197
249
           "Look above this message for any errors that "
198
250
           "were output by easy_install.")
199
251
    sys.exit(exitcode)