Commit ef7d9fd2 authored by Tres Seaver's avatar Tres Seaver

Update to latest bootstrap.

parent a1640078
...@@ -18,7 +18,11 @@ The script accepts buildout command-line options, so you can ...@@ -18,7 +18,11 @@ The script accepts buildout command-line options, so you can
use the -c option to specify an alternate configuration file. use the -c option to specify an alternate configuration file.
""" """
import os, shutil, sys, tempfile import os
import shutil
import sys
import tempfile
from optparse import OptionParser from optparse import OptionParser
tmpeggs = tempfile.mkdtemp() tmpeggs = tempfile.mkdtemp()
...@@ -31,8 +35,8 @@ Bootstraps a buildout-based project. ...@@ -31,8 +35,8 @@ Bootstraps a buildout-based project.
Simply run this script in a directory containing a buildout.cfg, using the Simply run this script in a directory containing a buildout.cfg, using the
Python that you want bin/buildout to use. Python that you want bin/buildout to use.
Note that by using --setup-source and --download-base to point to Note that by using --find-links to point to local resources, you can keep
local resources, you can keep this script from going over the network. this script from going over the network.
''' '''
parser = OptionParser(usage=usage) parser = OptionParser(usage=usage)
...@@ -48,48 +52,63 @@ parser.add_option("-t", "--accept-buildout-test-releases", ...@@ -48,48 +52,63 @@ parser.add_option("-t", "--accept-buildout-test-releases",
"bootstrap and buildout will get the newest releases " "bootstrap and buildout will get the newest releases "
"even if they are alphas or betas.")) "even if they are alphas or betas."))
parser.add_option("-c", "--config-file", parser.add_option("-c", "--config-file",
help=("Specify the path to the buildout configuration " help=("Specify the path to the buildout configuration "
"file to be used.")) "file to be used."))
parser.add_option("-f", "--find-links", parser.add_option("-f", "--find-links",
help=("Specify a URL to search for buildout releases")) help=("Specify a URL to search for buildout releases"))
parser.add_option("--allow-site-packages",
action="store_true", default=False,
help=("Let bootstrap.py use existing site packages"))
parser.add_option("--setuptools-version",
help="use a specific setuptools version")
options, args = parser.parse_args() options, args = parser.parse_args()
###################################################################### ######################################################################
# load/install distribute # load/install setuptools
to_reload = False
try: try:
import pkg_resources, setuptools if options.allow_site_packages:
if not hasattr(pkg_resources, '_distribute'): import setuptools
to_reload = True import pkg_resources
raise ImportError from urllib.request import urlopen
except ImportError: except ImportError:
ez = {} from urllib2 import urlopen
try: ez = {}
from urllib.request import urlopen exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
except ImportError:
from urllib2 import urlopen if not options.allow_site_packages:
# ez_setup imports site, which adds site packages
exec(urlopen('http://python-distribute.org/distribute_setup.py').read(), ez) # this will remove them from the path to ensure that incompatible versions
setup_args = dict(to_dir=tmpeggs, download_delay=0, no_fake=True) # of setuptools are not in the path
ez['use_setuptools'](**setup_args) import site
# inside a virtualenv, there is no 'getsitepackages'.
if to_reload: # We can't remove these reliably
reload(pkg_resources) if hasattr(site, 'getsitepackages'):
import pkg_resources for sitepackage_path in site.getsitepackages():
# This does not (always?) update the default working set. We will sys.path[:] = [x for x in sys.path if sitepackage_path not in x]
# do it.
for path in sys.path: setup_args = dict(to_dir=tmpeggs, download_delay=0)
if path not in pkg_resources.working_set.entries:
pkg_resources.working_set.add_entry(path) if options.setuptools_version is not None:
setup_args['version'] = options.setuptools_version
ez['use_setuptools'](**setup_args)
import setuptools
import pkg_resources
# This does not (always?) update the default working set. We will
# do it.
for path in sys.path:
if path not in pkg_resources.working_set.entries:
pkg_resources.working_set.add_entry(path)
###################################################################### ######################################################################
# Install buildout # Install buildout
ws = pkg_resources.working_set ws = pkg_resources.working_set
cmd = [sys.executable, '-c', cmd = [sys.executable, '-c',
'from setuptools.command.easy_install import main; main()', 'from setuptools.command.easy_install import main; main()',
...@@ -104,8 +123,8 @@ find_links = os.environ.get( ...@@ -104,8 +123,8 @@ find_links = os.environ.get(
if find_links: if find_links:
cmd.extend(['-f', find_links]) cmd.extend(['-f', find_links])
distribute_path = ws.find( setuptools_path = ws.find(
pkg_resources.Requirement.parse('distribute')).location pkg_resources.Requirement.parse('setuptools')).location
requirement = 'zc.buildout' requirement = 'zc.buildout'
version = options.version version = options.version
...@@ -113,13 +132,19 @@ if version is None and not options.accept_buildout_test_releases: ...@@ -113,13 +132,19 @@ if version is None and not options.accept_buildout_test_releases:
# Figure out the most recent final version of zc.buildout. # Figure out the most recent final version of zc.buildout.
import setuptools.package_index import setuptools.package_index
_final_parts = '*final-', '*final' _final_parts = '*final-', '*final'
def _final_version(parsed_version): def _final_version(parsed_version):
for part in parsed_version: try:
if (part[:1] == '*') and (part not in _final_parts): return not parsed_version.is_prerelease
return False except AttributeError:
return True # Older setuptools
for part in parsed_version:
if (part[:1] == '*') and (part not in _final_parts):
return False
return True
index = setuptools.package_index.PackageIndex( index = setuptools.package_index.PackageIndex(
search_path=[distribute_path]) search_path=[setuptools_path])
if find_links: if find_links:
index.add_find_links((find_links,)) index.add_find_links((find_links,))
req = pkg_resources.Requirement.parse(requirement) req = pkg_resources.Requirement.parse(requirement)
...@@ -142,10 +167,9 @@ if version: ...@@ -142,10 +167,9 @@ if version:
cmd.append(requirement) cmd.append(requirement)
import subprocess import subprocess
if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=distribute_path)) != 0: if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0:
raise Exception( raise Exception(
"Failed to execute command:\n%s", "Failed to execute command:\n%s" % repr(cmd)[1:-1])
repr(cmd)[1:-1])
###################################################################### ######################################################################
# Import and run buildout # Import and run buildout
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment