new bootstrap.py to stay in the land of zc.buildout 1.x

This commit is contained in:
Nejc Zupan 2013-09-30 10:26:54 -03:00
parent fd8f59d3f8
commit 63b030ecdf
2 changed files with 38 additions and 18 deletions

View File

@ -18,14 +18,13 @@ 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, textwrap, urllib, urllib2, subprocess import os, shutil, sys, tempfile, urllib, urllib2, subprocess
from optparse import OptionParser from optparse import OptionParser
if sys.platform == 'win32': if sys.platform == 'win32':
def quote(c): def quote(c):
if ' ' in c: if ' ' in c:
return '"%s"' % c # work around spawn lamosity on windows return '"%s"' % c # work around spawn lamosity on windows
else: else:
return c return c
else: else:
@ -58,13 +57,13 @@ if not has_broken_dash_S and 'site' in sys.modules:
# out any namespace packages from site-packages that might have been # out any namespace packages from site-packages that might have been
# loaded by .pth files. # loaded by .pth files.
clean_path = sys.path[:] clean_path = sys.path[:]
import site import site # imported because of its side effects
sys.path[:] = clean_path sys.path[:] = clean_path
for k, v in sys.modules.items(): for k, v in sys.modules.items():
if k in ('setuptools', 'pkg_resources') or ( if k in ('setuptools', 'pkg_resources') or (
hasattr(v, '__path__') and hasattr(v, '__path__') and
len(v.__path__)==1 and len(v.__path__) == 1 and
not os.path.exists(os.path.join(v.__path__[0],'__init__.py'))): not os.path.exists(os.path.join(v.__path__[0], '__init__.py'))):
# This is a namespace package. Remove it. # This is a namespace package. Remove it.
sys.modules.pop(k) sys.modules.pop(k)
@ -73,10 +72,11 @@ is_jython = sys.platform.startswith('java')
setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py' setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
distribute_source = 'http://python-distribute.org/distribute_setup.py' distribute_source = 'http://python-distribute.org/distribute_setup.py'
# parsing arguments # parsing arguments
def normalize_to_url(option, opt_str, value, parser): def normalize_to_url(option, opt_str, value, parser):
if value: if value:
if '://' not in value: # It doesn't smell like a URL. if '://' not in value: # It doesn't smell like a URL.
value = 'file://%s' % ( value = 'file://%s' % (
urllib.pathname2url( urllib.pathname2url(
os.path.abspath(os.path.expanduser(value))),) os.path.abspath(os.path.expanduser(value))),)
@ -111,7 +111,7 @@ parser.add_option("--setup-source", action="callback", dest="setup_source",
help=("Specify a URL or file location for the setup file. " help=("Specify a URL or file location for the setup file. "
"If you use Setuptools, this will default to " + "If you use Setuptools, this will default to " +
setuptools_source + "; if you use Distribute, this " setuptools_source + "; if you use Distribute, this "
"will default to " + distribute_source +".")) "will default to " + distribute_source + "."))
parser.add_option("--download-base", action="callback", dest="download_base", parser.add_option("--download-base", action="callback", dest="download_base",
callback=normalize_to_url, nargs=1, type="string", callback=normalize_to_url, nargs=1, type="string",
help=("Specify a URL or directory for downloading " help=("Specify a URL or directory for downloading "
@ -136,10 +136,6 @@ parser.add_option("-c", None, action="store", dest="config_file",
options, args = parser.parse_args() options, args = parser.parse_args()
# if -c was provided, we push it back into args for buildout's main function
if options.config_file is not None:
args += ['-c', options.config_file]
if options.eggs: if options.eggs:
eggs_dir = os.path.abspath(os.path.expanduser(options.eggs)) eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
else: else:
@ -152,12 +148,11 @@ if options.setup_source is None:
options.setup_source = setuptools_source options.setup_source = setuptools_source
if options.accept_buildout_test_releases: if options.accept_buildout_test_releases:
args.append('buildout:accept-buildout-test-releases=true') args.insert(0, 'buildout:accept-buildout-test-releases=true')
args.append('bootstrap')
try: try:
import pkg_resources import pkg_resources
import setuptools # A flag. Sometimes pkg_resources is installed alone. import setuptools # A flag. Sometimes pkg_resources is installed alone.
if not hasattr(pkg_resources, '_distribute'): if not hasattr(pkg_resources, '_distribute'):
raise ImportError raise ImportError
except ImportError: except ImportError:
@ -170,6 +165,8 @@ except ImportError:
setup_args['download_base'] = options.download_base setup_args['download_base'] = options.download_base
if options.use_distribute: if options.use_distribute:
setup_args['no_fake'] = True setup_args['no_fake'] = True
if sys.version_info[:2] == (2, 4):
setup_args['version'] = '0.6.32'
ez['use_setuptools'](**setup_args) ez['use_setuptools'](**setup_args)
if 'pkg_resources' in sys.modules: if 'pkg_resources' in sys.modules:
reload(sys.modules['pkg_resources']) reload(sys.modules['pkg_resources'])
@ -192,6 +189,8 @@ if not has_broken_dash_S:
find_links = options.download_base find_links = options.download_base
if not find_links: if not find_links:
find_links = os.environ.get('bootstrap-testing-find-links') find_links = os.environ.get('bootstrap-testing-find-links')
if not find_links and options.accept_buildout_test_releases:
find_links = 'http://downloads.buildout.org/'
if find_links: if find_links:
cmd.extend(['-f', quote(find_links)]) cmd.extend(['-f', quote(find_links)])
@ -212,6 +211,7 @@ 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: for part in parsed_version:
if (part[:1] == '*') and (part not in _final_parts): if (part[:1] == '*') and (part not in _final_parts):
@ -227,6 +227,8 @@ if version is None and not options.accept_buildout_test_releases:
bestv = None bestv = None
for dist in index[req.project_name]: for dist in index[req.project_name]:
distv = dist.parsed_version distv = dist.parsed_version
if distv >= pkg_resources.parse_version('2dev'):
continue
if _final_version(distv): if _final_version(distv):
if bestv is None or distv > bestv: if bestv is None or distv > bestv:
best = [dist] best = [dist]
@ -236,14 +238,18 @@ if version is None and not options.accept_buildout_test_releases:
if best: if best:
best.sort() best.sort()
version = best[-1].version version = best[-1].version
if version: if version:
requirement = '=='.join((requirement, version)) requirement += '=='+version
else:
requirement += '<2dev'
cmd.append(requirement) cmd.append(requirement)
if is_jython: if is_jython:
import subprocess import subprocess
exitcode = subprocess.Popen(cmd, env=env).wait() exitcode = subprocess.Popen(cmd, env=env).wait()
else: # Windows prefers this, apparently; otherwise we would prefer subprocess else: # Windows prefers this, apparently; otherwise we would prefer subprocess
exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env])) exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
if exitcode != 0: if exitcode != 0:
sys.stdout.flush() sys.stdout.flush()
@ -256,6 +262,16 @@ if exitcode != 0:
ws.add_entry(eggs_dir) ws.add_entry(eggs_dir)
ws.require(requirement) ws.require(requirement)
import zc.buildout.buildout import zc.buildout.buildout
# If there isn't already a command in the args, add bootstrap
if not [a for a in args if '=' not in a]:
args.append('bootstrap')
# if -c was provided, we push it back into args for buildout's main function
if options.config_file is not None:
args[0:0] = ['-c', options.config_file]
zc.buildout.buildout.main(args) zc.buildout.buildout.main(args)
if not options.eggs: # clean up temporary egg directory if not options.eggs: # clean up temporary egg directory
shutil.rmtree(eggs_dir) shutil.rmtree(eggs_dir)

View File

@ -6,12 +6,16 @@ Changes
1.0.0-rc.2 (unreleased) 1.0.0-rc.2 (unreleased)
----------------------- -----------------------
- New bootstrap.py to stay in the land of zc.buildout 1.x.
[zupo]
- Package now includes a copy of the GPLv2 license as stated in the GNU - Package now includes a copy of the GPLv2 license as stated in the GNU
General Public License documentation. General Public License documentation.
[hvelarde] [hvelarde]
- Fixed copying folderish objects. - Fixed copying folderish objects.
[pingviini] [pingviini]
- Fixed moving folderish objects. - Fixed moving folderish objects.
[pingviini] [pingviini]