~ztk-steering-group/zope.annotation/trunk

7 by Michael Bernstein
Buildoutification of zope.annotation, added setuptools as a dependency. Changed dependency on zope.app.container to zope.app.
1
##############################################################################
2
#
29 by Tres Seaver
Conform to repository policy.
3
# Copyright (c) 2006 Zope Foundation and Contributors.
7 by Michael Bernstein
Buildoutification of zope.annotation, added setuptools as a dependency. Changed dependency on zope.app.container to zope.app.
4
# All Rights Reserved.
5
#
6
# This software is subject to the provisions of the Zope Public License,
7
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
8
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11
# FOR A PARTICULAR PURPOSE.
12
#
13
##############################################################################
14
"""Bootstrap a buildout-based project
15
16
Simply run this script in a directory containing a buildout.cfg.
17
The script accepts buildout command-line options, so you can
18
use the -c option to specify an alternate configuration file.
19
"""
20
50 by Tres Seaver
Update to latest bootstrap.
21
import os
22
import shutil
23
import sys
24
import tempfile
25
46 by Marius Gedminas
Update to latest v1 bootstrap
26
from optparse import OptionParser
27
86 by Adam Groszer
update bootstrap.py
28
__version__ = '2015-07-01'
29
# See zc.buildout's changelog if this version is up to date.
30
31
tmpeggs = tempfile.mkdtemp(prefix='bootstrap-')
46 by Marius Gedminas
Update to latest v1 bootstrap
32
33
usage = '''\
34
[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
35
36
Bootstraps a buildout-based project.
37
38
Simply run this script in a directory containing a buildout.cfg, using the
39
Python that you want bin/buildout to use.
40
50 by Tres Seaver
Update to latest bootstrap.
41
Note that by using --find-links to point to local resources, you can keep
42
this script from going over the network.
46 by Marius Gedminas
Update to latest v1 bootstrap
43
'''
44
45
parser = OptionParser(usage=usage)
86 by Adam Groszer
update bootstrap.py
46
parser.add_option("--version",
47
                  action="store_true", default=False,
48
                  help=("Return bootstrap.py version."))
46 by Marius Gedminas
Update to latest v1 bootstrap
49
parser.add_option("-t", "--accept-buildout-test-releases",
50
                  dest='accept_buildout_test_releases',
51
                  action="store_true", default=False,
52
                  help=("Normally, if you do not specify a --version, the "
53
                        "bootstrap script and buildout gets the newest "
54
                        "*final* versions of zc.buildout and its recipes and "
55
                        "extensions for you.  If you use this flag, "
56
                        "bootstrap and buildout will get the newest releases "
57
                        "even if they are alphas or betas."))
50 by Tres Seaver
Update to latest bootstrap.
58
parser.add_option("-c", "--config-file",
59
                  help=("Specify the path to the buildout configuration "
60
                        "file to be used."))
61
parser.add_option("-f", "--find-links",
62
                  help=("Specify a URL to search for buildout releases"))
63
parser.add_option("--allow-site-packages",
64
                  action="store_true", default=False,
65
                  help=("Let bootstrap.py use existing site packages"))
86 by Adam Groszer
update bootstrap.py
66
parser.add_option("--buildout-version",
67
                  help="Use a specific zc.buildout version")
50 by Tres Seaver
Update to latest bootstrap.
68
parser.add_option("--setuptools-version",
86 by Adam Groszer
update bootstrap.py
69
                  help="Use a specific setuptools version")
70
parser.add_option("--setuptools-to-dir",
71
                  help=("Allow for re-use of existing directory of "
72
                        "setuptools versions"))
46 by Marius Gedminas
Update to latest v1 bootstrap
73
74
options, args = parser.parse_args()
86 by Adam Groszer
update bootstrap.py
75
if options.version:
76
    print("bootstrap.py version %s" % __version__)
77
    sys.exit(0)
78
46 by Marius Gedminas
Update to latest v1 bootstrap
79
50 by Tres Seaver
Update to latest bootstrap.
80
######################################################################
81
# load/install setuptools
46 by Marius Gedminas
Update to latest v1 bootstrap
82
83
try:
50 by Tres Seaver
Update to latest bootstrap.
84
    from urllib.request import urlopen
46 by Marius Gedminas
Update to latest v1 bootstrap
85
except ImportError:
50 by Tres Seaver
Update to latest bootstrap.
86
    from urllib2 import urlopen
87
88
ez = {}
86 by Adam Groszer
update bootstrap.py
89
if os.path.exists('ez_setup.py'):
90
    exec(open('ez_setup.py').read(), ez)
91
else:
92
    exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
50 by Tres Seaver
Update to latest bootstrap.
93
94
if not options.allow_site_packages:
95
    # ez_setup imports site, which adds site packages
96
    # this will remove them from the path to ensure that incompatible versions
97
    # of setuptools are not in the path
98
    import site
99
    # inside a virtualenv, there is no 'getsitepackages'.
100
    # We can't remove these reliably
101
    if hasattr(site, 'getsitepackages'):
102
        for sitepackage_path in site.getsitepackages():
86 by Adam Groszer
update bootstrap.py
103
            # Strip all site-packages directories from sys.path that
104
            # are not sys.prefix; this is because on Windows
105
            # sys.prefix is a site-package directory.
106
            if sitepackage_path != sys.prefix:
107
                sys.path[:] = [x for x in sys.path
108
                               if sitepackage_path not in x]
50 by Tres Seaver
Update to latest bootstrap.
109
110
setup_args = dict(to_dir=tmpeggs, download_delay=0)
111
112
if options.setuptools_version is not None:
113
    setup_args['version'] = options.setuptools_version
86 by Adam Groszer
update bootstrap.py
114
if options.setuptools_to_dir is not None:
115
    setup_args['to_dir'] = options.setuptools_to_dir
50 by Tres Seaver
Update to latest bootstrap.
116
117
ez['use_setuptools'](**setup_args)
118
import setuptools
119
import pkg_resources
120
121
# This does not (always?) update the default working set.  We will
122
# do it.
123
for path in sys.path:
124
    if path not in pkg_resources.working_set.entries:
125
        pkg_resources.working_set.add_entry(path)
126
127
######################################################################
128
# Install buildout
129
130
ws = pkg_resources.working_set
131
86 by Adam Groszer
update bootstrap.py
132
setuptools_path = ws.find(
133
    pkg_resources.Requirement.parse('setuptools')).location
134
135
# Fix sys.path here as easy_install.pth added before PYTHONPATH
50 by Tres Seaver
Update to latest bootstrap.
136
cmd = [sys.executable, '-c',
86 by Adam Groszer
update bootstrap.py
137
       'import sys; sys.path[0:0] = [%r]; ' % setuptools_path +
50 by Tres Seaver
Update to latest bootstrap.
138
       'from setuptools.command.easy_install import main; main()',
139
       '-mZqNxd', tmpeggs]
140
141
find_links = os.environ.get(
142
    'bootstrap-testing-find-links',
143
    options.find_links or
144
    ('http://downloads.buildout.org/'
145
     if options.accept_buildout_test_releases else None)
146
    )
46 by Marius Gedminas
Update to latest v1 bootstrap
147
if find_links:
50 by Tres Seaver
Update to latest bootstrap.
148
    cmd.extend(['-f', find_links])
46 by Marius Gedminas
Update to latest v1 bootstrap
149
150
requirement = 'zc.buildout'
86 by Adam Groszer
update bootstrap.py
151
version = options.buildout_version
46 by Marius Gedminas
Update to latest v1 bootstrap
152
if version is None and not options.accept_buildout_test_releases:
153
    # Figure out the most recent final version of zc.buildout.
154
    import setuptools.package_index
155
    _final_parts = '*final-', '*final'
156
157
    def _final_version(parsed_version):
50 by Tres Seaver
Update to latest bootstrap.
158
        try:
159
            return not parsed_version.is_prerelease
160
        except AttributeError:
161
            # Older setuptools
162
            for part in parsed_version:
163
                if (part[:1] == '*') and (part not in _final_parts):
164
                    return False
165
            return True
166
46 by Marius Gedminas
Update to latest v1 bootstrap
167
    index = setuptools.package_index.PackageIndex(
50 by Tres Seaver
Update to latest bootstrap.
168
        search_path=[setuptools_path])
46 by Marius Gedminas
Update to latest v1 bootstrap
169
    if find_links:
170
        index.add_find_links((find_links,))
171
    req = pkg_resources.Requirement.parse(requirement)
172
    if index.obtain(req) is not None:
173
        best = []
174
        bestv = None
175
        for dist in index[req.project_name]:
176
            distv = dist.parsed_version
177
            if _final_version(distv):
178
                if bestv is None or distv > bestv:
179
                    best = [dist]
180
                    bestv = distv
181
                elif distv == bestv:
182
                    best.append(dist)
183
        if best:
184
            best.sort()
185
            version = best[-1].version
186
if version:
50 by Tres Seaver
Update to latest bootstrap.
187
    requirement = '=='.join((requirement, version))
46 by Marius Gedminas
Update to latest v1 bootstrap
188
cmd.append(requirement)
189
50 by Tres Seaver
Update to latest bootstrap.
190
import subprocess
86 by Adam Groszer
update bootstrap.py
191
if subprocess.call(cmd) != 0:
50 by Tres Seaver
Update to latest bootstrap.
192
    raise Exception(
193
        "Failed to execute command:\n%s" % repr(cmd)[1:-1])
194
195
######################################################################
196
# Import and run buildout
197
198
ws.add_entry(tmpeggs)
46 by Marius Gedminas
Update to latest v1 bootstrap
199
ws.require(requirement)
7 by Michael Bernstein
Buildoutification of zope.annotation, added setuptools as a dependency. Changed dependency on zope.app.container to zope.app.
200
import zc.buildout.buildout
46 by Marius Gedminas
Update to latest v1 bootstrap
201
202
if not [a for a in args if '=' not in a]:
203
    args.append('bootstrap')
204
50 by Tres Seaver
Update to latest bootstrap.
205
# if -c was provided, we push it back into args for buildout' main function
46 by Marius Gedminas
Update to latest v1 bootstrap
206
if options.config_file is not None:
207
    args[0:0] = ['-c', options.config_file]
208
209
zc.buildout.buildout.main(args)
50 by Tres Seaver
Update to latest bootstrap.
210
shutil.rmtree(tmpeggs)