upgrade auf.django.admingroup
[auf_rh_dae.git] / bootstrap.py
CommitLineData
5e23d90d
OL
1##############################################################################
2#
9378faf6 3# Copyright (c) 2006 Zope Foundation and Contributors.
5e23d90d
OL
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
16Simply run this script in a directory containing a buildout.cfg.
17The script accepts buildout command-line options, so you can
18use the -c option to specify an alternate configuration file.
5e23d90d
OL
19"""
20
26a7d503
OL
21import os
22import shutil
23import sys
24import tempfile
9378faf6 25
26a7d503 26from optparse import OptionParser
9378faf6 27
26a7d503 28tmpeggs = tempfile.mkdtemp()
9378faf6
EMS
29
30usage = '''\
31[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
32
33Bootstraps a buildout-based project.
34
35Simply run this script in a directory containing a buildout.cfg, using the
36Python that you want bin/buildout to use.
37
26a7d503
OL
38Note that by using --find-links to point to local resources, you can keep
39this script from going over the network.
9378faf6
EMS
40'''
41
42parser = OptionParser(usage=usage)
26a7d503
OL
43parser.add_option("-v", "--version", help="use a specific zc.buildout version")
44
9378faf6
EMS
45parser.add_option("-t", "--accept-buildout-test-releases",
46 dest='accept_buildout_test_releases',
47 action="store_true", default=False,
48 help=("Normally, if you do not specify a --version, the "
49 "bootstrap script and buildout gets the newest "
50 "*final* versions of zc.buildout and its recipes and "
51 "extensions for you. If you use this flag, "
52 "bootstrap and buildout will get the newest releases "
53 "even if they are alphas or betas."))
26a7d503
OL
54parser.add_option("-c", "--config-file",
55 help=("Specify the path to the buildout configuration "
56 "file to be used."))
57parser.add_option("-f", "--find-links",
58 help=("Specify a URL to search for buildout releases"))
9378faf6 59
9378faf6 60
26a7d503 61options, args = parser.parse_args()
9378faf6 62
26a7d503
OL
63######################################################################
64# load/install setuptools
9378faf6 65
26a7d503 66to_reload = False
5e23d90d
OL
67try:
68 import pkg_resources
26a7d503 69 import setuptools
5e23d90d
OL
70except ImportError:
71 ez = {}
26a7d503
OL
72
73 try:
74 from urllib.request import urlopen
75 except ImportError:
76 from urllib2 import urlopen
77
78 # XXX use a more permanent ez_setup.py URL when available.
79 exec(urlopen('https://bitbucket.org/pypa/setuptools/raw/0.7.2/ez_setup.py'
80 ).read(), ez)
81 setup_args = dict(to_dir=tmpeggs, download_delay=0)
9378faf6 82 ez['use_setuptools'](**setup_args)
26a7d503
OL
83
84 if to_reload:
85 reload(pkg_resources)
5e23d90d 86 import pkg_resources
9378faf6
EMS
87 # This does not (always?) update the default working set. We will
88 # do it.
89 for path in sys.path:
90 if path not in pkg_resources.working_set.entries:
91 pkg_resources.working_set.add_entry(path)
5e23d90d 92
26a7d503
OL
93######################################################################
94# Install buildout
95
96ws = pkg_resources.working_set
9378faf6 97
26a7d503
OL
98cmd = [sys.executable, '-c',
99 'from setuptools.command.easy_install import main; main()',
100 '-mZqNxd', tmpeggs]
9378faf6 101
26a7d503
OL
102find_links = os.environ.get(
103 'bootstrap-testing-find-links',
104 options.find_links or
105 ('http://downloads.buildout.org/'
106 if options.accept_buildout_test_releases else None)
107 )
9378faf6 108if find_links:
26a7d503 109 cmd.extend(['-f', find_links])
9378faf6 110
26a7d503
OL
111setuptools_path = ws.find(
112 pkg_resources.Requirement.parse('setuptools')).location
5e23d90d 113
9378faf6
EMS
114requirement = 'zc.buildout'
115version = options.version
116if version is None and not options.accept_buildout_test_releases:
117 # Figure out the most recent final version of zc.buildout.
118 import setuptools.package_index
119 _final_parts = '*final-', '*final'
120
121 def _final_version(parsed_version):
122 for part in parsed_version:
123 if (part[:1] == '*') and (part not in _final_parts):
124 return False
125 return True
126 index = setuptools.package_index.PackageIndex(
26a7d503 127 search_path=[setuptools_path])
9378faf6
EMS
128 if find_links:
129 index.add_find_links((find_links,))
130 req = pkg_resources.Requirement.parse(requirement)
131 if index.obtain(req) is not None:
132 best = []
133 bestv = None
134 for dist in index[req.project_name]:
135 distv = dist.parsed_version
136 if _final_version(distv):
137 if bestv is None or distv > bestv:
138 best = [dist]
139 bestv = distv
140 elif distv == bestv:
141 best.append(dist)
142 if best:
143 best.sort()
144 version = best[-1].version
145if version:
146 requirement = '=='.join((requirement, version))
147cmd.append(requirement)
5e23d90d 148
26a7d503
OL
149import subprocess
150if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0:
151 raise Exception(
152 "Failed to execute command:\n%s",
153 repr(cmd)[1:-1])
154
155######################################################################
156# Import and run buildout
5e23d90d 157
26a7d503 158ws.add_entry(tmpeggs)
9378faf6 159ws.require(requirement)
5e23d90d 160import zc.buildout.buildout
26a7d503
OL
161
162if not [a for a in args if '=' not in a]:
163 args.append('bootstrap')
164
165# if -c was provided, we push it back into args for buildout' main function
166if options.config_file is not None:
167 args[0:0] = ['-c', options.config_file]
168
9378faf6 169zc.buildout.buildout.main(args)
26a7d503 170shutil.rmtree(tmpeggs)