Commit 81c979b4 authored by tarek's avatar tarek

simplifying the bootstrap process

--HG--
branch : distribute
extra : rebase_source : bf37715d8a5bc2c0be0867da88dbd717f716bb95
parent fab8f93e
......@@ -26,55 +26,13 @@ is_jython = sys.platform.startswith('java')
if is_jython:
import subprocess
DEFAULT_VERSION = "0.6.1"
DEFAULT_URL = "http://pypi.python.org/packages/%s/d/distribute/" % sys.version[:3]
def use_setuptools(
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
download_delay=15
):
"""Automatically find/download setuptools and make it available on sys.path
`version` should be a valid setuptools version number that is available
as an egg for download under the `download_base` URL (which should end with
a '/'). `to_dir` is the directory where setuptools will be downloaded, if
it is not already available. If `download_delay` is specified, it should
be the number of seconds that will be paused before initiating a download,
should one be required. If an older version of setuptools is installed,
this routine will print a message to ``sys.stderr`` and raise SystemExit in
an attempt to abort the calling script.
"""
was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
def do_download():
egg = download_setuptools(version, download_base, to_dir, download_delay)
sys.path.insert(0, egg)
import setuptools; setuptools.bootstrap_install_from = egg
try:
import pkg_resources
if not hasattr(pkg_resources, '_distribute'):
raise ImportError
except ImportError:
return do_download()
try:
pkg_resources.require("distribute>="+version); return
except pkg_resources.VersionConflict, e:
if was_imported:
print >>sys.stderr, (
"The required version of distribute (>=%s) is not available, and\n"
"can't be installed while this script is running. Please install\n"
" a more recent version first, using 'easy_install -U distribute'."
"\n\n(Currently using %r)"
) % (version, e.args[0])
sys.exit(2)
else:
del pkg_resources, sys.modules['pkg_resources'] # reload ok
return do_download()
except pkg_resources.DistributionNotFound:
return do_download()
DEFAULT_VERSION = "0.6.1"
#DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"
DEFAULT_URL = "http://nightly.ziade.org/"
def download_setuptools(
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
delay = 15
):
"""Download distribute from a specified location and return its filename
......@@ -84,39 +42,25 @@ def download_setuptools(
`delay` is the number of seconds to pause before an actual download attempt.
"""
import urllib2, shutil
egg_name = "distribute-%s-py%s.egg" % (version,sys.version[:3])
url = download_base + egg_name
saveto = os.path.join(to_dir, egg_name)
tgz_name = "distribute-%s.tar.gz" % version
url = download_base + tgz_name
saveto = os.path.join(to_dir, tgz_name)
src = dst = None
if not os.path.exists(saveto): # Avoid repeated downloads
try:
from distutils import log
if delay:
log.warn("""
---------------------------------------------------------------------------
This script requires distribute version %s to run (even to display
help). I will attempt to download it for you (from
%s), but
you may need to enable firewall access for this script first.
I will start the download in %d seconds.
(Note: if this machine does not have network access, please obtain the file
%s
and place it in this directory before rerunning this script.)
---------------------------------------------------------------------------""",
version, download_base, delay, url
); from time import sleep; sleep(delay)
log.warn("Downloading %s", url)
src = urllib2.urlopen(url)
# Read/write all in one block, so we don't create a corrupt file
# if the download is interrupted.
data = src.read()
dst = open(saveto,"wb"); dst.write(data)
dst = open(saveto, "wb")
dst.write(data)
finally:
if src: src.close()
if dst: dst.close()
if src:
src.close()
if dst:
dst.close()
return os.path.realpath(saveto)
......@@ -316,91 +260,34 @@ def _relaunch():
else:
sys.exit(os.spawnv(os.P_WAIT, sys.executable, args))
def _easy_install(argv, egg=None):
from setuptools import setup
from setuptools.dist import Distribution
import distutils.core
if egg is not None:
setup_args = list(argv) + [egg]
else:
setup_args = list(argv)
import tempfile
import tarfile
def _install(tarball):
# extracting the tarball
tmpdir = tempfile.mkdtemp()
log.warn('Extracting in %s' % tmpdir)
old_wd = os.getcwd()
try:
return setup(script_args = ['-q','easy_install',
'-v'] + setup_args,
script_name = sys.argv[0] or 'easy_install',
distclass=Distribution)
except DistutilsError:
return sys.exit(2)
os.chdir(tmpdir)
tar = tarfile.open(tarball)
tar.extractall()
tar.close()
# going in the directory
subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
os.chdir(subdir)
log.warn('Now working in %s' % subdir)
# installing distribute
os.system('%s setup.py install' % sys.executable)
finally:
os.chdir(old_wd)
def main(argv, version=DEFAULT_VERSION):
"""Install or upgrade setuptools and EasyInstall"""
# let's deactivate any existing setuptools installation first
fake_setuptools()
try:
import setuptools
# we need to check if the installed setuptools
# is from Distribute or from setuptools
if not hasattr(setuptools, '_distribute'):
# now we are ready to install distribute
raise ImportError
except ImportError:
egg = None
try:
egg = download_setuptools(version, delay=0)
sys.path.insert(0, egg)
import setuptools
if not hasattr(setuptools, '_distribute'):
placeholder = os.path.split(os.path.dirname(setuptools.__file__))[0]
if not placeholder.endswith('.egg'):
res = _remove_flat_installation(placeholder)
if res:
_relaunch()
print >> sys.stderr, (
"The patch didn't work, Setuptools is still active.\n"
"Possible reason: your have a system-wide setuptools installed "
"and you are in a virtualenv.\n"
"If you are inside a virtualenv, make sure you used the --no-site-packages option"
)
sys.exit(2)
dist = _easy_install(argv, egg)
after_install(dist)
return
#from setuptools.command import easy_install
#try:
# return easy_install.main(list(argv)+['-v']+[egg])
#except DistutilsError:
# return sys.exit(2)
finally:
if egg and os.path.exists(egg):
os.unlink(egg)
else:
if setuptools.__version__ == '0.0.1':
print >>sys.stderr, (
"You have an obsolete version of setuptools installed. Please\n"
"remove it from your system entirely before rerunning this script."
)
sys.exit(2)
req = "distribute>="+version
import pkg_resources
try:
pkg_resources.require(req)
except pkg_resources.VersionConflict:
try:
_easy_install(argv, [download_setuptools(delay=0)])
#from setuptools.command.easy_install import main
except ImportError:
from easy_install import main
main(list(argv)+[download_setuptools(delay=0)])
sys.exit(0) # try to force an exit
else:
if argv:
_easy_install(argv)
#from setuptools.command.easy_install import main
#main(argv)
else:
print "distribute version",version,"or greater has been installed."
print '(Run "distribute_setup.py -U distribute" to reinstall or upgrade.)'
tarball = download_setuptools()
_install(tarball)
if __name__ == '__main__':
main(sys.argv[1:])
......
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