Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
zope-container
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
zope-container
Commits
da123e68
Commit
da123e68
authored
Feb 14, 2013
by
Albertas Agejevas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Renewed the bootstrap.py version.
parent
4f097fa9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
221 additions
and
63 deletions
+221
-63
bootstrap.py
bootstrap.py
+221
-63
No files found.
bootstrap.py
View file @
da123e68
...
@@ -18,102 +18,260 @@ The script accepts buildout command-line options, so you can
...
@@ -18,102 +18,260 @@ 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
,
urllib
2
import
os
,
shutil
,
sys
,
tempfile
,
urllib
,
urllib2
,
subprocess
from
optparse
import
OptionParser
from
optparse
import
OptionParser
tmpeggs
=
tempfile
.
mkdtemp
()
if
sys
.
platform
==
'win32'
:
def
quote
(
c
):
if
' '
in
c
:
return
'"%s"'
%
c
# work around spawn lamosity on windows
else
:
return
c
else
:
quote
=
str
# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
stdout
,
stderr
=
subprocess
.
Popen
(
[
sys
.
executable
,
'-Sc'
,
'try:
\
n
'
' import ConfigParser
\
n
'
'except ImportError:
\
n
'
' print 1
\
n
'
'else:
\
n
'
' print 0
\
n
'
],
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
).
communicate
()
has_broken_dash_S
=
bool
(
int
(
stdout
.
strip
()))
# In order to be more robust in the face of system Pythons, we want to
# run without site-packages loaded. This is somewhat tricky, in
# particular because Python 2.6's distutils imports site, so starting
# with the -S flag is not sufficient. However, we'll start with that:
if
not
has_broken_dash_S
and
'site'
in
sys
.
modules
:
# We will restart with python -S.
args
=
sys
.
argv
[:]
args
[
0
:
0
]
=
[
sys
.
executable
,
'-S'
]
args
=
map
(
quote
,
args
)
os
.
execv
(
sys
.
executable
,
args
)
# Now we are running with -S. We'll get the clean sys.path, import site
# because distutils will do it later, and then reset the path and clean
# out any namespace packages from site-packages that might have been
# loaded by .pth files.
clean_path
=
sys
.
path
[:]
import
site
# imported because of its side effects
sys
.
path
[:]
=
clean_path
for
k
,
v
in
sys
.
modules
.
items
():
if
k
in
(
'setuptools'
,
'pkg_resources'
)
or
(
hasattr
(
v
,
'__path__'
)
and
len
(
v
.
__path__
)
==
1
and
not
os
.
path
.
exists
(
os
.
path
.
join
(
v
.
__path__
[
0
],
'__init__.py'
))):
# This is a namespace package. Remove it.
sys
.
modules
.
pop
(
k
)
is_jython
=
sys
.
platform
.
startswith
(
'java'
)
is_jython
=
sys
.
platform
.
startswith
(
'java'
)
setuptools_source
=
'http://peak.telecommunity.com/dist/ez_setup.py'
distribute_source
=
'http://python-distribute.org/distribute_setup.py'
# parsing arguments
# parsing arguments
parser
=
OptionParser
()
def
normalize_to_url
(
option
,
opt_str
,
value
,
parser
):
if
value
:
if
'://'
not
in
value
:
# It doesn't smell like a URL.
value
=
'file://%s'
%
(
urllib
.
pathname2url
(
os
.
path
.
abspath
(
os
.
path
.
expanduser
(
value
))),)
if
opt_str
==
'--download-base'
and
not
value
.
endswith
(
'/'
):
# Download base needs a trailing slash to make the world happy.
value
+=
'/'
else
:
value
=
None
name
=
opt_str
[
2
:].
replace
(
'-'
,
'_'
)
setattr
(
parser
.
values
,
name
,
value
)
usage
=
'''
\
[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
Bootstraps a buildout-based project.
Simply run this script in a directory containing a buildout.cfg, using the
Python that you want bin/buildout to use.
Note that by using --setup-source and --download-base to point to
local resources, you can keep this script from going over the network.
'''
parser
=
OptionParser
(
usage
=
usage
)
parser
.
add_option
(
"-v"
,
"--version"
,
dest
=
"version"
,
parser
.
add_option
(
"-v"
,
"--version"
,
dest
=
"version"
,
help
=
"use a specific zc.buildout version"
)
help
=
"use a specific zc.buildout version"
)
parser
.
add_option
(
"-d"
,
"--distribute"
,
parser
.
add_option
(
"-d"
,
"--distribute"
,
action
=
"store_true"
,
dest
=
"distribute"
,
default
=
False
,
action
=
"store_true"
,
dest
=
"use_distribute"
,
default
=
False
,
help
=
"Use Disribute rather than Setuptools."
)
help
=
"Use Distribute rather than Setuptools."
)
parser
.
add_option
(
"--setup-source"
,
action
=
"callback"
,
dest
=
"setup_source"
,
callback
=
normalize_to_url
,
nargs
=
1
,
type
=
"string"
,
help
=
(
"Specify a URL or file location for the setup file. "
"If you use Setuptools, this will default to "
+
setuptools_source
+
"; if you use Distribute, this "
"will default to "
+
distribute_source
+
"."
))
parser
.
add_option
(
"--download-base"
,
action
=
"callback"
,
dest
=
"download_base"
,
callback
=
normalize_to_url
,
nargs
=
1
,
type
=
"string"
,
help
=
(
"Specify a URL or directory for downloading "
"zc.buildout and either Setuptools or Distribute. "
"Defaults to PyPI."
))
parser
.
add_option
(
"--eggs"
,
help
=
(
"Specify a directory for storing eggs. Defaults to "
"a temporary directory that is deleted when the "
"bootstrap script completes."
))
parser
.
add_option
(
"-t"
,
"--accept-buildout-test-releases"
,
dest
=
'accept_buildout_test_releases'
,
action
=
"store_true"
,
default
=
False
,
help
=
(
"Normally, if you do not specify a --version, the "
"bootstrap script and buildout gets the newest "
"*final* versions of zc.buildout and its recipes and "
"extensions for you. If you use this flag, "
"bootstrap and buildout will get the newest releases "
"even if they are alphas or betas."
))
parser
.
add_option
(
"-c"
,
None
,
action
=
"store"
,
dest
=
"config_file"
,
parser
.
add_option
(
"-c"
,
None
,
action
=
"store"
,
dest
=
"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."
))
options
,
args
=
parser
.
parse_args
()
options
,
args
=
parser
.
parse_args
()
# if -c was provided, we push it back into args for buildout' main function
if
options
.
eggs
:
if
options
.
config_file
is
not
None
:
eggs_dir
=
os
.
path
.
abspath
(
os
.
path
.
expanduser
(
options
.
eggs
))
args
+=
[
'-c'
,
options
.
config_file
]
if
options
.
version
is
not
None
:
VERSION
=
'==%s'
%
options
.
version
else
:
else
:
VERSION
=
''
eggs_dir
=
tempfile
.
mkdtemp
()
if
options
.
setup_source
is
None
:
if
options
.
use_distribute
:
options
.
setup_source
=
distribute_source
else
:
options
.
setup_source
=
setuptools_source
USE_DISTRIBUTE
=
options
.
distribute
if
options
.
accept_buildout_test_releases
:
args
=
args
+
[
'bootstrap'
]
args
.
insert
(
0
,
'buildout:accept-buildout-test-releases=true'
)
to_reload
=
False
try
:
try
:
import
pkg_resources
import
pkg_resources
import
setuptools
# A flag. Sometimes pkg_resources is installed alone.
if
not
hasattr
(
pkg_resources
,
'_distribute'
):
if
not
hasattr
(
pkg_resources
,
'_distribute'
):
to_reload
=
True
raise
ImportError
raise
ImportError
except
ImportError
:
except
ImportError
:
ez_code
=
urllib2
.
urlopen
(
options
.
setup_source
).
read
().
replace
(
'
\
r
\
n
'
,
'
\
n
'
)
ez
=
{}
ez
=
{}
if
USE_DISTRIBUTE
:
exec
ez_code
in
ez
exec
urllib2
.
urlopen
(
'http://python-distribute.org/distribute_setup.py'
setup_args
=
dict
(
to_dir
=
eggs_dir
,
download_delay
=
0
)
).
read
()
in
ez
if
options
.
download_base
:
ez
[
'use_setuptools'
](
to_dir
=
tmpeggs
,
download_delay
=
0
,
no_fake
=
True
)
setup_args
[
'download_base'
]
=
options
.
download_base
else
:
if
options
.
use_distribute
:
exec
urllib2
.
urlopen
(
'http://peak.telecommunity.com/dist/ez_setup.py'
setup_args
[
'no_fake'
]
=
True
).
read
()
in
ez
if
sys
.
version_info
[:
2
]
==
(
2
,
4
):
ez
[
'use_setuptools'
](
to_dir
=
tmpeggs
,
download_delay
=
0
)
setup_args
[
'version'
]
=
'0.6.32'
ez
[
'use_setuptools'
](
**
setup_args
)
if
'pkg_resources'
in
sys
.
modules
:
reload
(
sys
.
modules
[
'pkg_resources'
])
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
)
if
to_reload
:
cmd
=
[
quote
(
sys
.
executable
),
reload
(
pkg_resources
)
'-c'
,
else
:
quote
(
'from setuptools.command.easy_install import main; main()'
),
import
pkg_resources
'-mqNxd'
,
quote
(
eggs_dir
)]
if
sys
.
platform
==
'win32'
:
if
not
has_broken_dash_S
:
def
quote
(
c
):
cmd
.
insert
(
1
,
'-S'
)
if
' '
in
c
:
return
'"%s"'
%
c
# work around spawn lamosity on windows
find_links
=
options
.
download_base
else
:
if
not
find_links
:
return
c
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
:
cmd
.
extend
([
'-f'
,
quote
(
find_links
)])
if
options
.
use_distribute
:
setup_requirement
=
'distribute'
else
:
else
:
def
quote
(
c
):
setup_requirement
=
'setuptools'
return
c
ws
=
pkg_resources
.
working_set
setup_requirement_path
=
ws
.
find
(
pkg_resources
.
Requirement
.
parse
(
setup_requirement
)).
location
env
=
dict
(
os
.
environ
,
PYTHONPATH
=
setup_requirement_path
)
requirement
=
'zc.buildout'
version
=
options
.
version
if
version
is
None
and
not
options
.
accept_buildout_test_releases
:
# Figure out the most recent final version of zc.buildout.
import
setuptools.package_index
_final_parts
=
'*final-'
,
'*final'
cmd
=
'from setuptools.command.easy_install import main; main()'
def
_final_version
(
parsed_version
):
ws
=
pkg_resources
.
working_set
for
part
in
parsed_version
:
if
(
part
[:
1
]
==
'*'
)
and
(
part
not
in
_final_parts
):
return
False
return
True
index
=
setuptools
.
package_index
.
PackageIndex
(
search_path
=
[
setup_requirement_path
])
if
find_links
:
index
.
add_find_links
((
find_links
,))
req
=
pkg_resources
.
Requirement
.
parse
(
requirement
)
if
index
.
obtain
(
req
)
is
not
None
:
best
=
[]
bestv
=
None
for
dist
in
index
[
req
.
project_name
]:
distv
=
dist
.
parsed_version
if
distv
>=
pkg_resources
.
parse_version
(
'2dev'
):
continue
if
_final_version
(
distv
):
if
bestv
is
None
or
distv
>
bestv
:
best
=
[
dist
]
bestv
=
distv
elif
distv
==
bestv
:
best
.
append
(
dist
)
if
best
:
best
.
sort
()
version
=
best
[
-
1
].
version
if
USE_DISTRIBUTE
:
if
version
:
requirement
=
'distribute'
requirement
+=
'=='
+
version
else
:
else
:
requirement
=
'setuptools'
requirement
+=
'<2dev'
cmd
.
append
(
requirement
)
if
is_jython
:
if
is_jython
:
import
subprocess
import
subprocess
exitcode
=
subprocess
.
Popen
(
cmd
,
env
=
env
).
wait
()
else
:
# Windows prefers this, apparently; otherwise we would prefer subprocess
exitcode
=
os
.
spawnle
(
*
([
os
.
P_WAIT
,
sys
.
executable
]
+
cmd
+
[
env
]))
if
exitcode
!=
0
:
sys
.
stdout
.
flush
()
sys
.
stderr
.
flush
()
print
(
"An error occurred when trying to install zc.buildout. "
"Look above this message for any errors that "
"were output by easy_install."
)
sys
.
exit
(
exitcode
)
assert
subprocess
.
Popen
([
sys
.
executable
]
+
[
'-c'
,
quote
(
cmd
),
'-mqNxd'
,
ws
.
add_entry
(
eggs_dir
)
quote
(
tmpeggs
),
'zc.buildout'
+
VERSION
],
ws
.
require
(
requirement
)
env
=
dict
(
os
.
environ
,
PYTHONPATH
=
ws
.
find
(
pkg_resources
.
Requirement
.
parse
(
requirement
)).
location
),
).
wait
()
==
0
else
:
assert
os
.
spawnle
(
os
.
P_WAIT
,
sys
.
executable
,
quote
(
sys
.
executable
),
'-c'
,
quote
(
cmd
),
'-mqNxd'
,
quote
(
tmpeggs
),
'zc.buildout'
+
VERSION
,
dict
(
os
.
environ
,
PYTHONPATH
=
ws
.
find
(
pkg_resources
.
Requirement
.
parse
(
requirement
)).
location
),
)
==
0
ws
.
add_entry
(
tmpeggs
)
ws
.
require
(
'zc.buildout'
+
VERSION
)
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
)
shutil
.
rmtree
(
tmpeggs
)
if
not
options
.
eggs
:
# clean up temporary egg directory
shutil
.
rmtree
(
eggs_dir
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment