Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Refresh distribute (now at 0.6.30), add integration tests, fix distribute call #346

Merged
merged 4 commits into from

2 participants

@g2p

distribute 0.6.30 fixes #301 and integrates another local change we had made to
distribute_setup.py: https://bitbucket.org/tarek/distribute/issue/328/

It also broke virtualenv, because we passed unrecognised arguments that used to be silently ignored.
Fix that and add integration tests.

@g2p g2p Refresh bundled copy of distribute (now at 0.6.30).
This fixes #301 and integrates another local change we had made to
distribute_setup.py: https://bitbucket.org/tarek/distribute/issue/328/
5e09944
@g2p

I see this breaks tox. Investigating…

@g2p

distribute_setup used to ignore argv entirely (unlike distribute_from_egg and ez_setup); now it doesn't, and passing it --always-copy breaks it.

@g2p

(The breakage I mentioned above is fixed. This should be ready to merge.)

@pnasrat pnasrat merged commit 890a636 into pypa:develop
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Oct 22, 2012
  1. @g2p

    Refresh bundled copy of distribute (now at 0.6.30).

    g2p authored
    This fixes #301 and integrates another local change we had made to
    distribute_setup.py: https://bitbucket.org/tarek/distribute/issue/328/
  2. @g2p
  3. @g2p
  4. @g2p

    Restore PyPy compatibility.

    g2p authored
    PyPy's interaction with virtualenv is strange and should probably
    be rethought.
This page is out of date. Refresh to see the latest.
View
6 .travis.yml
@@ -5,9 +5,13 @@ python:
- "2.7"
- "3.2"
- "pypy"
-install: pip install nose
+install:
+ - pip install --use-mirrors nose
script:
+# Unit tests
- python setup.py test
+# Integration test
+ - python virtualenv.py --distribute ./test-venv
notifications:
irc:
channels: "irc.freenode.org#pip"
View
2  bin/refresh-support-files.py
@@ -23,7 +23,7 @@
('http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg', 'setuptools-0.6c11-py2.6.egg'),
('http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c11-py2.5.egg', 'setuptools-0.6c11-py2.5.egg'),
('http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg', 'setuptools-0.6c11-py2.4.egg'),
- ('http://pypi.python.org/packages/source/d/distribute/distribute-0.6.28.tar.gz', 'distribute-0.6.28.tar.gz'),
+ ('http://pypi.python.org/packages/source/d/distribute/distribute-0.6.30.tar.gz', 'distribute-0.6.30.tar.gz'),
('http://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz', 'pip-1.2.1.tar.gz'),
]
View
364 virtualenv.py
@@ -489,26 +489,25 @@ def _install_req(py_executable, unzip=False, distribute=False,
search_dirs = file_search_dirs()
if not distribute:
- setup_fn = 'setuptools-*-py%s.egg' % sys.version[:3]
- found, setup_fn = _find_file(setup_fn, search_dirs)
+ egg_path = 'setuptools-*-py%s.egg' % sys.version[:3]
+ found, egg_path = _find_file(egg_path, search_dirs)
project_name = 'setuptools'
bootstrap_script = EZ_SETUP_PY
- source = None
+ tgz_path = None
else:
# Look for a distribute egg (these are not distributed by default,
# but can be made available by the user)
- setup_fn = 'distribute-*-py%s.egg' % sys.version[:3]
- found, setup_fn = _find_file(setup_fn, search_dirs)
+ egg_path = 'distribute-*-py%s.egg' % sys.version[:3]
+ found, egg_path = _find_file(egg_path, search_dirs)
+ project_name = 'distribute'
if found:
- source = None
- project_name = 'distribute'
+ tgz_path = None
bootstrap_script = DISTRIBUTE_FROM_EGG_PY
else:
# Fall back to sdist
- setup_fn = None
- source = 'distribute-*.tar.gz'
- found, source = _find_file(source, search_dirs)
- project_name = 'distribute'
+ egg_path = None
+ tgz_path = 'distribute-*.tar.gz'
+ found, tgz_path = _find_file(tgz_path, search_dirs)
bootstrap_script = DISTRIBUTE_SETUP_PY
if is_jython and os._name == 'nt':
@@ -520,26 +519,26 @@ def _install_req(py_executable, unzip=False, distribute=False,
cmd = [py_executable, ez_setup]
else:
cmd = [py_executable, '-c', bootstrap_script]
- if unzip:
+ if unzip and egg_path:
cmd.append('--always-unzip')
env = {}
remove_from_env = ['__PYVENV_LAUNCHER__']
- if logger.stdout_level_matches(logger.DEBUG):
+ if logger.stdout_level_matches(logger.DEBUG) and egg_path:
cmd.append('-v')
old_chdir = os.getcwd()
- if setup_fn is not None and os.path.exists(setup_fn):
- logger.info('Using existing %s egg: %s' % (project_name, setup_fn))
- cmd.append(setup_fn)
+ if egg_path is not None and os.path.exists(egg_path):
+ logger.info('Using existing %s egg: %s' % (project_name, egg_path))
+ cmd.append(egg_path)
if os.environ.get('PYTHONPATH'):
- env['PYTHONPATH'] = setup_fn + os.path.pathsep + os.environ['PYTHONPATH']
+ env['PYTHONPATH'] = egg_path + os.path.pathsep + os.environ['PYTHONPATH']
else:
- env['PYTHONPATH'] = setup_fn
+ env['PYTHONPATH'] = egg_path
else:
- # the source is found, let's chdir
- if source is not None and os.path.exists(source):
- logger.info('Using existing %s egg: %s' % (project_name, source))
- os.chdir(os.path.dirname(source))
+ # Found a tgz source dist, let's chdir
+ if tgz_path is not None and os.path.exists(tgz_path):
+ logger.info('Using existing %s egg: %s' % (project_name, tgz_path))
+ os.chdir(os.path.dirname(tgz_path))
# in this case, we want to be sure that PYTHONPATH is unset (not
# just empty, really unset), else CPython tries to import the
# site.py that it's in virtualenv_support
@@ -551,12 +550,12 @@ def _install_req(py_executable, unzip=False, distribute=False,
"without the --never-download option, or place a %s "
"distribution (%s) in one of these "
"locations: %r" % (project_name, project_name,
- setup_fn or source,
+ egg_path or tgz_path,
search_dirs))
sys.exit(1)
logger.info('No %s egg found; downloading' % project_name)
- cmd.extend(['--always-copy', '-U', project_name])
+ cmd.extend(['--always-copy', '-U', project_name])
logger.start_progress('Installing %s...' % project_name)
logger.indent += 2
cwd = None
@@ -568,11 +567,11 @@ def _filter_ez_setup(line):
if not os.access(os.getcwd(), os.W_OK):
cwd = tempfile.mkdtemp()
- if source is not None and os.path.exists(source):
+ if tgz_path is not None and os.path.exists(tgz_path):
# the current working dir is hostile, let's copy the
# tarball to a temp dir
- target = os.path.join(cwd, os.path.split(source)[-1])
- shutil.copy(source, target)
+ target = os.path.join(cwd, os.path.split(tgz_path)[-1])
+ shutil.copy(tgz_path, target)
try:
call_subprocess(cmd, show_stdout=False,
filter_stdout=_filter_ez_setup,
@@ -1267,7 +1266,12 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):
# Do platinc_dest manually due to a CPython bug;
# not http://bugs.python.org/issue3386 but a close cousin
platinc_dest = subst_path(platinc_dir, prefix, home_dir)
- copyfile(platinc_dir, platinc_dest)
+ if platinc_dest:
+ # PyPy's stdinc_dir and prefix are relative to the original binary
+ # (traversing virtualenvs), whereas the platinc_dir is relative to
+ # the inner virtualenv and ignores the prefix argument.
+ # This seems more evolved than designed.
+ copyfile(platinc_dir, platinc_dest)
# pypy never uses exec_prefix, just ignore it
if sys.exec_prefix != prefix and not is_pypy:
@@ -2010,73 +2014,73 @@ def convert(s):
##file ez_setup.py
EZ_SETUP_PY = convert("""
-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
-BDaonX65d/fwEjNqlDjLVIvM9X+XVxF7
+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
+qL7+C1AkCcw=
""")
##file distribute_from_egg.py
@@ -2089,89 +2093,93 @@ def convert(s):
##file distribute_setup.py
DISTRIBUTE_SETUP_PY = convert("""
-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
-9g==
+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
""")
##file activate.sh
View
67 virtualenv_embedded/distribute_setup.py
@@ -20,6 +20,8 @@
import fnmatch
import tempfile
import tarfile
+import optparse
+
from distutils import log
try:
@@ -47,7 +49,7 @@ def quote(arg):
args = [quote(arg) for arg in args]
return os.spawnl(os.P_WAIT, sys.executable, *args) == 0
-DEFAULT_VERSION = "0.6.28"
+DEFAULT_VERSION = "0.6.30"
DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"
SETUPTOOLS_FAKED_VERSION = "0.6c11"
@@ -85,6 +87,8 @@ def _install(tarball, install_args=()):
if not _python_cmd('setup.py', 'install', *install_args):
log.warn('Something went wrong during the installation.')
log.warn('See the error message above.')
+ # exitcode will be 2
+ return 2
finally:
os.chdir(old_wd)
shutil.rmtree(tmpdir)
@@ -258,7 +262,7 @@ def _same_content(path, content):
def _rename_path(path):
new_name = path + '.OLD.%s' % time.time()
- log.warn('Renaming %s into %s', path, new_name)
+ log.warn('Renaming %s to %s', path, new_name)
os.rename(path, new_name)
return new_name
@@ -276,7 +280,7 @@ def _remove_flat_installation(placeholder):
log.warn('Could not locate setuptools*.egg-info')
return
- log.warn('Removing elements out of the way...')
+ log.warn('Moving elements out of the way...')
pkg_info = os.path.join(placeholder, file)
if os.path.isdir(pkg_info):
patched = _patch_egg_dir(pkg_info)
@@ -317,11 +321,12 @@ def _create_fake_setuptools_pkg_info(placeholder):
log.warn('%s already exists', pkg_info)
return
- if not os.access(pkg_info, os.W_OK):
- log.warn("Don't have permissions to write %s, skipping", pkg_info)
-
log.warn('Creating %s', pkg_info)
- f = open(pkg_info, 'w')
+ try:
+ f = open(pkg_info, 'w')
+ except EnvironmentError:
+ log.warn("Don't have permissions to write %s, skipping", pkg_info)
+ return
try:
f.write(SETUPTOOLS_PKG_INFO)
finally:
@@ -435,7 +440,7 @@ def _fake_setuptools():
res = _patch_egg_dir(setuptools_location)
if not res:
return
- log.warn('Patched done.')
+ log.warn('Patching complete.')
_relaunch()
@@ -443,8 +448,9 @@ def _relaunch():
log.warn('Relaunching...')
# we have to relaunch the process
# pip marker to avoid a relaunch bug
- _cmd = ['-c', 'install', '--single-version-externally-managed']
- if sys.argv[:3] == _cmd:
+ _cmd1 = ['-c', 'install', '--single-version-externally-managed']
+ _cmd2 = ['-c', 'install', '--record']
+ if sys.argv[:3] == _cmd1 or sys.argv[:3] == _cmd2:
sys.argv[0] = 'setup.py'
args = [sys.executable] + sys.argv
sys.exit(subprocess.call(args))
@@ -497,22 +503,39 @@ def sorter(dir1, dir2):
self._dbg(1, "tarfile: %s" % e)
-def _build_install_args(argv):
+def _build_install_args(options):
+ """
+ Build the arguments to 'python setup.py install' on the distribute package
+ """
install_args = []
- user_install = '--user' in argv
- if user_install and sys.version_info < (2, 6):
- log.warn("--user requires Python 2.6 or later")
- raise SystemExit(1)
- if user_install:
+ if options.user_install:
+ if sys.version_info < (2, 6):
+ log.warn("--user requires Python 2.6 or later")
+ raise SystemExit(1)
install_args.append('--user')
return install_args
-
-def main(argv, version=DEFAULT_VERSION):
+def _parse_args():
+ """
+ Parse the command line for options
+ """
+ parser = optparse.OptionParser()
+ parser.add_option(
+ '--user', dest='user_install', action='store_true', default=False,
+ help='install in user site package (requires Python 2.6 or later)')
+ parser.add_option(
+ '--download-base', dest='download_base', metavar="URL",
+ default=DEFAULT_URL,
+ help='alternative URL from where to download the distribute package')
+ options, args = parser.parse_args()
+ # positional arguments are ignored
+ return options
+
+def main(version=DEFAULT_VERSION):
"""Install or upgrade setuptools and EasyInstall"""
- tarball = download_setuptools()
- _install(tarball, _build_install_args(argv))
-
+ options = _parse_args()
+ tarball = download_setuptools(download_base=options.download_base)
+ return _install(tarball, _build_install_args(options))
if __name__ == '__main__':
- main(sys.argv[1:])
+ sys.exit(main())
View
7 virtualenv_embedded/ez_setup.py
@@ -103,8 +103,7 @@ def do_download():
return do_download()
try:
pkg_resources.require("setuptools>="+version); return
- except pkg_resources.VersionConflict:
- e = sys.exc_info()[1]
+ except pkg_resources.VersionConflict, e:
if was_imported:
print >>sys.stderr, (
"The required version of setuptools (>=%s) is not available, and\n"
@@ -239,8 +238,8 @@ def main(argv, version=DEFAULT_VERSION):
from setuptools.command.easy_install import main
main(argv)
else:
- print("Setuptools version",version,"or greater has been installed.")
- print('(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)')
+ print "Setuptools version",version,"or greater has been installed."
+ print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
def update_md5(filenames):
"""Update our built-in md5 registry"""
View
BIN  virtualenv_support/distribute-0.6.28.tar.gz
Binary file not shown
View
BIN  virtualenv_support/distribute-0.6.30.tar.gz
Binary file not shown
Something went wrong with that request. Please try again.