Removed virtualenv from depot_tools
This effectively reverts http://crrev.com/1195423002 and http://crrev.com/1205873002. R=pgervais@chromium.org, tandrii@chromium.org TBR=pgervais@chromium.org # i wanna get my Fixit credit today :-) BUG=542922,503067 Review URL: https://codereview.chromium.org/1437483002 . git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@297491 0039d316-1c4b-4281-b951-d872f2087c98changes/01/332501/1
parent
ff7840a87c
commit
9ca2fc13f9
@ -1,2 +0,0 @@
|
||||
BUILD_ENV
|
||||
wheelhouse
|
@ -1,234 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Copyright 2014 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
import argparse
|
||||
import contextlib
|
||||
import glob
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
from util import STORAGE_URL, OBJECT_URL, LOCAL_STORAGE_PATH, LOCAL_OBJECT_URL
|
||||
from util import read_deps, merge_deps, print_deps, platform_tag
|
||||
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
|
||||
# /path/to/infra
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
PYTHON_BAT_WIN = '@%~dp0\\..\\Scripts\\python.exe %*'
|
||||
|
||||
|
||||
class NoWheelException(Exception):
|
||||
def __init__(self, name, version, build, source_sha):
|
||||
super(NoWheelException, self).__init__(
|
||||
'No matching wheel found for (%s==%s (build %s_%s))' %
|
||||
(name, version, build, source_sha))
|
||||
|
||||
|
||||
def check_pydistutils():
|
||||
if os.path.exists(os.path.expanduser('~/.pydistutils.cfg')):
|
||||
print >> sys.stderr, '\n'.join([
|
||||
'',
|
||||
'',
|
||||
'=========== ERROR ===========',
|
||||
'You have a ~/.pydistutils.cfg file, which interferes with the ',
|
||||
'infra virtualenv environment. Please move it to the side and bootstrap ',
|
||||
'again. Once infra has bootstrapped, you may move it back.',
|
||||
'',
|
||||
'Upstream bug: https://github.com/pypa/virtualenv/issues/88/',
|
||||
''
|
||||
])
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def ls(prefix):
|
||||
from pip._vendor import requests # pylint: disable=E0611
|
||||
data = requests.get(STORAGE_URL, params=dict(
|
||||
prefix=prefix,
|
||||
fields='items(name,md5Hash)'
|
||||
)).json()
|
||||
entries = data.get('items', [])
|
||||
for entry in entries:
|
||||
entry['md5Hash'] = entry['md5Hash'].decode('base64').encode('hex')
|
||||
entry['local'] = False
|
||||
# Also look in the local cache
|
||||
entries.extend([
|
||||
{'name': fname, 'md5Hash': None, 'local': True}
|
||||
for fname in glob.glob(os.path.join(LOCAL_STORAGE_PATH,
|
||||
prefix.split('/')[-1] + '*'))])
|
||||
return entries
|
||||
|
||||
|
||||
def sha_for(deps_entry):
|
||||
if 'rev' in deps_entry:
|
||||
return deps_entry['rev']
|
||||
else:
|
||||
return deps_entry['gs'].split('.')[0]
|
||||
|
||||
|
||||
def get_links(deps):
|
||||
import pip.wheel # pylint: disable=E0611
|
||||
plat_tag = platform_tag()
|
||||
|
||||
links = []
|
||||
|
||||
for name, dep in deps.iteritems():
|
||||
version, source_sha = dep['version'] , sha_for(dep)
|
||||
prefix = 'wheels/{}-{}-{}_{}'.format(name, version, dep['build'],
|
||||
source_sha)
|
||||
generic_link = None
|
||||
binary_link = None
|
||||
local_link = None
|
||||
|
||||
for entry in ls(prefix):
|
||||
fname = entry['name'].split('/')[-1]
|
||||
md5hash = entry['md5Hash']
|
||||
wheel_info = pip.wheel.Wheel.wheel_file_re.match(fname)
|
||||
if not wheel_info:
|
||||
LOGGER.warn('Skipping invalid wheel: %r', fname)
|
||||
continue
|
||||
|
||||
if pip.wheel.Wheel(fname).supported():
|
||||
if entry['local']:
|
||||
link = LOCAL_OBJECT_URL.format(entry['name'])
|
||||
local_link = link
|
||||
continue
|
||||
else:
|
||||
link = OBJECT_URL.format(entry['name'], md5hash)
|
||||
if fname.endswith('none-any.whl'):
|
||||
if generic_link:
|
||||
LOGGER.error(
|
||||
'Found more than one generic matching wheel for %r: %r',
|
||||
prefix, dep)
|
||||
continue
|
||||
generic_link = link
|
||||
elif plat_tag in fname:
|
||||
if binary_link:
|
||||
LOGGER.error(
|
||||
'Found more than one binary matching wheel for %r: %r',
|
||||
prefix, dep)
|
||||
continue
|
||||
binary_link = link
|
||||
|
||||
if not binary_link and not generic_link and not local_link:
|
||||
raise NoWheelException(name, version, dep['build'], source_sha)
|
||||
|
||||
links.append(local_link or binary_link or generic_link)
|
||||
|
||||
return links
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def html_index(links):
|
||||
tf = tempfile.mktemp('.html')
|
||||
try:
|
||||
with open(tf, 'w') as f:
|
||||
print >> f, '<html><body>'
|
||||
for link in links:
|
||||
print >> f, '<a href="%s">wat</a>' % link
|
||||
print >> f, '</body></html>'
|
||||
yield tf
|
||||
finally:
|
||||
os.unlink(tf)
|
||||
|
||||
|
||||
def install(deps):
|
||||
bin_dir = 'Scripts' if sys.platform.startswith('win') else 'bin'
|
||||
pip = os.path.join(sys.prefix, bin_dir, 'pip')
|
||||
|
||||
links = get_links(deps)
|
||||
with html_index(links) as ipath:
|
||||
requirements = []
|
||||
# TODO(iannucci): Do this as a requirements.txt
|
||||
for name, deps_entry in deps.iteritems():
|
||||
if not deps_entry.get('implicit'):
|
||||
requirements.append('%s==%s' % (name, deps_entry['version']))
|
||||
subprocess.check_call(
|
||||
[pip, 'install', '--no-index', '--download-cache',
|
||||
os.path.join(ROOT, '.wheelcache'), '-f', ipath] + requirements)
|
||||
|
||||
|
||||
def activate_env(env, deps, quiet=False):
|
||||
if hasattr(sys, 'real_prefix'):
|
||||
LOGGER.error('Already activated environment!')
|
||||
return
|
||||
|
||||
if not quiet:
|
||||
print 'Activating environment: %r' % env
|
||||
assert isinstance(deps, dict)
|
||||
|
||||
manifest_path = os.path.join(env, 'manifest.pyl')
|
||||
cur_deps = read_deps(manifest_path)
|
||||
if cur_deps != deps:
|
||||
if not quiet:
|
||||
print ' Removing old environment: %r' % cur_deps
|
||||
shutil.rmtree(env, ignore_errors=True)
|
||||
cur_deps = None
|
||||
|
||||
if cur_deps is None:
|
||||
check_pydistutils()
|
||||
|
||||
if not quiet:
|
||||
print ' Building new environment'
|
||||
# Add in bundled virtualenv lib
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'virtualenv'))
|
||||
import virtualenv # pylint: disable=F0401
|
||||
virtualenv.create_environment(
|
||||
env, search_dirs=virtualenv.file_search_dirs())
|
||||
|
||||
if not quiet:
|
||||
print ' Activating environment'
|
||||
# Ensure hermeticity during activation.
|
||||
os.environ.pop('PYTHONPATH', None)
|
||||
bin_dir = 'Scripts' if sys.platform.startswith('win') else 'bin'
|
||||
activate_this = os.path.join(env, bin_dir, 'activate_this.py')
|
||||
execfile(activate_this, dict(__file__=activate_this))
|
||||
|
||||
if cur_deps is None:
|
||||
if not quiet:
|
||||
print ' Installing deps'
|
||||
print_deps(deps, indent=2, with_implicit=False)
|
||||
install(deps)
|
||||
virtualenv.make_environment_relocatable(env)
|
||||
with open(manifest_path, 'wb') as f:
|
||||
f.write(repr(deps) + '\n')
|
||||
|
||||
# Create bin\python.bat on Windows to unify path where Python is found.
|
||||
if sys.platform.startswith('win'):
|
||||
bin_path = os.path.join(env, 'bin')
|
||||
if not os.path.isdir(bin_path):
|
||||
os.makedirs(bin_path)
|
||||
python_bat_path = os.path.join(bin_path, 'python.bat')
|
||||
if not os.path.isfile(python_bat_path):
|
||||
with open(python_bat_path, 'w') as python_bat_file:
|
||||
python_bat_file.write(PYTHON_BAT_WIN)
|
||||
|
||||
if not quiet:
|
||||
print 'Done creating environment'
|
||||
|
||||
|
||||
def main(args):
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--deps-file', '--deps_file', action='append',
|
||||
help='Path to deps.pyl file (may be used multiple times)')
|
||||
parser.add_argument('-q', '--quiet', action='store_true', default=False,
|
||||
help='Supress all output')
|
||||
parser.add_argument('env_path',
|
||||
help='Path to place environment (default: %(default)s)',
|
||||
default='ENV')
|
||||
opts = parser.parse_args(args)
|
||||
|
||||
deps = merge_deps(opts.deps_file)
|
||||
activate_env(opts.env_path, deps, opts.quiet)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
logging.basicConfig()
|
||||
LOGGER.setLevel(logging.DEBUG)
|
||||
sys.exit(main(sys.argv[1:]))
|
@ -1,15 +0,0 @@
|
||||
#vim: ft=python:
|
||||
{
|
||||
'wheel': {
|
||||
'version': '0.24.0',
|
||||
'build': '0',
|
||||
'gs': 'c02262299489646af253067e8136c060a93572e3.tar.gz',
|
||||
},
|
||||
|
||||
'protobuf': {
|
||||
'version': '2.6.0',
|
||||
'build': '0',
|
||||
'repo': 'external/github.com/google/protobuf',
|
||||
'rev': '629a556879cc84e0f52546f0484b65b72ce44fe8',
|
||||
},
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
@echo off
|
||||
:: Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
||||
:: Use of this source code is governed by a BSD-style license that can be
|
||||
:: found in the LICENSE file.
|
||||
|
||||
:: IMPORTANT NOTE:
|
||||
:: The bootstrap flow has been removed. This file's only purpose is to make the
|
||||
:: transition smooth as the previous update script called bootstrap\gclient.bat
|
||||
:: The current flow took place on March 21, 2012. This file should be removed
|
||||
:: when it is believed everyone has updated since then.
|
||||
|
||||
:: At this point we know %DEPOT_TOOLS_UPDATE% != 0 as in the previous script
|
||||
:: bootstrap\gclient.bat was only called if this was the case.
|
||||
|
||||
:: Update the root directory. The previous version only supported svn so there
|
||||
:: is no need looking for git here (i.e. if someone has git they can't get to
|
||||
:: this point where the bootstrap dir is gone during the update anyways...)
|
||||
IF NOT EXIST "%~dp0..\.svn\." GOTO :EOF
|
||||
call svn up -q "%~dp0.."
|
||||
|
||||
:: Call the updated gclient.bat in the root directory to wrap the update.
|
||||
call "%~dp0..\gclient.bat"
|
@ -1,87 +0,0 @@
|
||||
# Copyright 2014 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
import ast
|
||||
import contextlib
|
||||
import os
|
||||
import platform
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
|
||||
ROOT = os.path.dirname(os.path.abspath(__file__))
|
||||
WHEELHOUSE = os.path.join(ROOT, 'wheelhouse')
|
||||
|
||||
BUCKET = 'chrome-python-wheelhouse'
|
||||
STORAGE_URL = 'https://www.googleapis.com/storage/v1/b/{}/o'.format(BUCKET)
|
||||
OBJECT_URL = 'https://storage.googleapis.com/{}/{{}}#md5={{}}'.format(BUCKET)
|
||||
LOCAL_OBJECT_URL = 'file://{}'
|
||||
|
||||
LOCAL_STORAGE_PATH = os.path.join(ROOT, 'wheelhouse_cache')
|
||||
|
||||
SOURCE_URL = 'gs://{}/sources/{{}}'.format(BUCKET)
|
||||
WHEELS_URL = 'gs://{}/wheels/'.format(BUCKET)
|
||||
|
||||
|
||||
class DepsConflictException(Exception):
|
||||
def __init__(self, name):
|
||||
super(DepsConflictException, self).__init__(
|
||||
'Package \'%s\' is defined twice in deps.pyl' % name)
|
||||
|
||||
|
||||
def platform_tag():
|
||||
if sys.platform.startswith('linux'):
|
||||
return '_{0}_{1}'.format(*platform.linux_distribution())
|
||||
return ''
|
||||
|
||||
|
||||
def print_deps(deps, indent=1, with_implicit=True):
|
||||
for dep, entry in deps.iteritems():
|
||||
if not with_implicit and entry.get('implicit'):
|
||||
continue
|
||||
print ' ' * indent + '%s: %r' % (dep, entry)
|
||||
print
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def tempdir(*args, **kwargs):
|
||||
tdir = None
|
||||
try:
|
||||
tdir = tempfile.mkdtemp(*args, **kwargs)
|
||||
yield tdir
|
||||
finally:
|
||||
if tdir:
|
||||
shutil.rmtree(tdir, ignore_errors=True)
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def tempname(*args, **kwargs):
|
||||
tmp = None
|
||||
try:
|
||||
tmp = tempfile.mktemp(*args, **kwargs)
|
||||
yield tmp
|
||||
finally:
|
||||
if tmp:
|
||||
try:
|
||||
os.unlink(tmp)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
def read_deps(path):
|
||||
if os.path.exists(path):
|
||||
with open(path, 'rb') as f:
|
||||
return ast.literal_eval(f.read())
|
||||
|
||||
|
||||
def merge_deps(paths):
|
||||
deps = {}
|
||||
for path in paths:
|
||||
d = read_deps(path)
|
||||
for key in d:
|
||||
if key in deps:
|
||||
raise DepsConflictException(key)
|
||||
deps.update(d)
|
||||
return deps
|
@ -1,10 +0,0 @@
|
||||
virtualenv.egg-info
|
||||
build
|
||||
dist
|
||||
docs/_build
|
||||
.DS_Store
|
||||
*.pyc
|
||||
mock-*.egg
|
||||
nose-*.egg
|
||||
.tox
|
||||
tests/test_activate_actual.output
|
@ -1,28 +0,0 @@
|
||||
language: python
|
||||
|
||||
env:
|
||||
- TOXENV=py26
|
||||
- TOXENV=py27
|
||||
- TOXENV=py32
|
||||
- TOXENV=py33
|
||||
- TOXENV=py34
|
||||
- TOXENV=pypy
|
||||
- TOXENV=pypy3
|
||||
- TOXENV=docs
|
||||
|
||||
install: pip install tox
|
||||
|
||||
script: tox
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- 1.11.X
|
||||
|
||||
notifications:
|
||||
irc:
|
||||
channels:
|
||||
- "irc.freenode.org#pypa-dev"
|
||||
use_notice: true
|
||||
skip_join: true
|
@ -1,91 +0,0 @@
|
||||
Author
|
||||
------
|
||||
|
||||
Ian Bicking
|
||||
|
||||
Maintainers
|
||||
-----------
|
||||
|
||||
Brian Rosner
|
||||
Carl Meyer
|
||||
Jannis Leidel
|
||||
Paul Moore
|
||||
Paul Nasrat
|
||||
Marcus Smith
|
||||
|
||||
Contributors
|
||||
------------
|
||||
|
||||
Alex Grönholm
|
||||
Anatoly Techtonik
|
||||
Antonio Cuni
|
||||
Antonio Valentino
|
||||
Armin Ronacher
|
||||
Barry Warsaw
|
||||
Benjamin Root
|
||||
Bradley Ayers
|
||||
Branden Rolston
|
||||
Brandon Carl
|
||||
Brian Kearns
|
||||
Cap Petschulat
|
||||
CBWhiz
|
||||
Chris Adams
|
||||
Chris McDonough
|
||||
Christos Kontas
|
||||
Christian Hudon
|
||||
Christian Stefanescu
|
||||
Christopher Nilsson
|
||||
Cliff Xuan
|
||||
Curt Micol
|
||||
Damien Nozay
|
||||
Dan Sully
|
||||
Daniel Hahler
|
||||
Daniel Holth
|
||||
David Schoonover
|
||||
Denis Costa
|
||||
Doug Hellmann
|
||||
Doug Napoleone
|
||||
Douglas Creager
|
||||
Eduard-Cristian Stefan
|
||||
Erik M. Bray
|
||||
Ethan Jucovy
|
||||
Gabriel de Perthuis
|
||||
Gunnlaugur Thor Briem
|
||||
Graham Dennis
|
||||
Greg Haskins
|
||||
Jason Penney
|
||||
Jason R. Coombs
|
||||
Jeff Hammel
|
||||
Jeremy Orem
|
||||
Jason Penney
|
||||
Jason R. Coombs
|
||||
John Kleint
|
||||
Jonathan Griffin
|
||||
Jonathan Hitchcock
|
||||
Jorge Vargas
|
||||
Josh Bronson
|
||||
Kamil Kisiel
|
||||
Kyle Gibson
|
||||
Konstantin Zemlyak
|
||||
Kumar McMillan
|
||||
Lars Francke
|
||||
Marc Abramowitz
|
||||
Mika Laitio
|
||||
Mike Hommey
|
||||
Miki Tebeka
|
||||
Philip Jenvey
|
||||
Philippe Ombredanne
|
||||
Piotr Dobrogost
|
||||
Preston Holmes
|
||||
Ralf Schmitt
|
||||
Raul Leal
|
||||
Ronny Pfannschmidt
|
||||
Satrajit Ghosh
|
||||
Sergio de Carvalho
|
||||
Stefano Rivera
|
||||
Tarek Ziadé
|
||||
Thomas Aglassinger
|
||||
Vinay Sajip
|
||||
Vitaly Babiy
|
||||
Vladimir Rutsky
|
||||
Wang Xuerui
|
@ -1,21 +0,0 @@
|
||||
virtualenv
|
||||
==========
|
||||
|
||||
See docs/index.rst for user documentation.
|
||||
|
||||
Contributor notes
|
||||
-----------------
|
||||
|
||||
* virtualenv is designed to work on python 2 and 3 with a single code base.
|
||||
Use Python 3 print-function syntax, and always ``use sys.exc_info()[1]``
|
||||
inside the ``except`` block to get at exception objects.
|
||||
|
||||
* virtualenv uses git-flow_ to `coordinate development`_. The latest stable
|
||||
version should exist on the *master* branch, and new work should be
|
||||
integrated to *develop*.
|
||||
|
||||
* All changes to files inside virtualenv_embedded should be integrated to
|
||||
``virtualenv.py`` with ``bin/rebuild-script.py``.
|
||||
|
||||
.. _git-flow: https://github.com/nvie/gitflow
|
||||
.. _coordinate development: http://nvie.com/posts/a-successful-git-branching-model/
|
@ -1,22 +0,0 @@
|
||||
Copyright (c) 2007 Ian Bicking and Contributors
|
||||
Copyright (c) 2009 Ian Bicking, The Open Planning Project
|
||||
Copyright (c) 2011-2014 The virtualenv developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@ -1,11 +0,0 @@
|
||||
recursive-include bin *
|
||||
recursive-include docs *
|
||||
recursive-include scripts *
|
||||
recursive-include virtualenv_support *.whl
|
||||
recursive-include virtualenv_embedded *
|
||||
recursive-exclude docs/_templates *
|
||||
recursive-exclude docs/_build *
|
||||
include virtualenv_support/__init__.py
|
||||
include *.py
|
||||
include AUTHORS.txt
|
||||
include LICENSE.txt
|
@ -1,10 +0,0 @@
|
||||
virtualenv
|
||||
==========
|
||||
|
||||
.. image:: https://pypip.in/v/virtualenv/badge.png
|
||||
:target: https://pypi.python.org/pypi/virtualenv
|
||||
|
||||
.. image:: https://secure.travis-ci.org/pypa/virtualenv.png?branch=develop
|
||||
:target: http://travis-ci.org/pypa/virtualenv
|
||||
|
||||
For documentation, see https://virtualenv.pypa.io/
|
@ -1,71 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Helper script to rebuild virtualenv.py from virtualenv_support
|
||||
"""
|
||||
|
||||
import re
|
||||
import os
|
||||
import sys
|
||||
|
||||
here = os.path.dirname(__file__)
|
||||
script = os.path.join(here, '..', 'virtualenv.py')
|
||||
|
||||
file_regex = re.compile(
|
||||
r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)',
|
||||
re.S)
|
||||
file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
|
||||
|
||||
def rebuild():
|
||||
f = open(script, 'rb')
|
||||
content = f.read()
|
||||
f.close()
|
||||
parts = []
|
||||
last_pos = 0
|
||||
match = None
|
||||
for match in file_regex.finditer(content):
|
||||
parts.append(content[last_pos:match.start()])
|
||||
last_pos = match.end()
|
||||
filename = match.group(1)
|
||||
varname = match.group(2)
|
||||
data = match.group(3)
|
||||
print('Found reference to file %s' % filename)
|
||||
pathname = os.path.join(here, '..', 'virtualenv_embedded', filename)
|
||||
f = open(pathname, 'rb')
|
||||
c = f.read()
|
||||
f.close()
|
||||
new_data = c.encode('zlib').encode('base64')
|
||||
if new_data == data:
|
||||
print(' Reference up to date (%s bytes)' % len(c))
|
||||
parts.append(match.group(0))
|
||||
continue
|
||||
print(' Content changed (%s bytes -> %s bytes)' % (
|
||||
zipped_len(data), len(c)))
|
||||
new_match = file_template % dict(
|
||||
filename=filename,
|
||||
varname=varname,
|
||||
data=new_data)
|
||||
parts.append(new_match)
|
||||
parts.append(content[last_pos:])
|
||||
new_content = ''.join(parts)
|
||||
if new_content != content:
|
||||
sys.stdout.write('Content updated; overwriting... ')
|
||||
f = open(script, 'wb')
|
||||
f.write(new_content)
|
||||
f.close()
|
||||
print('done.')
|
||||
else:
|
||||
print('No changes in content')
|
||||
if match is None:
|
||||
print('No variables were matched/found')
|
||||
|
||||
def zipped_len(data):
|
||||
if not data:
|
||||
return 'no data'
|
||||
try:
|
||||
return len(data.decode('base64').decode('zlib'))
|
||||
except:
|
||||
return 'unknown'
|
||||
|
||||
if __name__ == '__main__':
|
||||
rebuild()
|
||||
|
@ -1,130 +0,0 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-compressor.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-compressor.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/django-compressor"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-compressor"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
make -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
@ -1,747 +0,0 @@
|
||||
Release History
|
||||
===============
|
||||
|
||||
12.0 (2014-12-22)
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
* **PROCESS** Version numbers are now simply ``X.Y`` where the leading ``1``
|
||||
has been dropped.
|
||||
* Split up documentation into structured pages
|
||||
* Now using pytest framework
|
||||
* Correct sys.path ordering for debian, issue #461
|
||||
* Correctly throws error on older Pythons, issue #619
|
||||
* Allow for empty $PATH, pull #601
|
||||
* Don't set prompt if $env:VIRTUAL_ENV_DISABLE_PROMPT is set for Powershell
|
||||
* Updated setuptools to 7.0
|
||||
|
||||
1.11.6 (2014-05-16)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated setuptools to 3.6
|
||||
* Updated pip to 1.5.6
|
||||
|
||||
1.11.5 (2014-05-03)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated setuptools to 3.4.4
|
||||
* Updated documentation to use https://virtualenv.pypa.io/
|
||||
* Updated pip to 1.5.5
|
||||
|
||||
1.11.4 (2014-02-21)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated pip to 1.5.4
|
||||
|
||||
|
||||
1.11.3 (2014-02-20)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated setuptools to 2.2
|
||||
* Updated pip to 1.5.3
|
||||
|
||||
|
||||
1.11.2 (2014-01-26)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Fixed easy_install installed virtualenvs by updated pip to 1.5.2
|
||||
|
||||
1.11.1 (2014-01-20)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Fixed an issue where pip and setuptools were not getting installed when using
|
||||
the ``--system-site-packages`` flag.
|
||||
* Updated setuptools to fix an issue when installed with easy_install
|
||||
* Fixed an issue with Python 3.4 and sys.stdout encoding being set to ascii
|
||||
* Upgraded pip to v1.5.1
|
||||
* Upgraded setuptools to v2.1
|
||||
|
||||
1.11 (2014-01-02)
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
* **BACKWARDS INCOMPATIBLE** Switched to using wheels for the bundled copies of
|
||||
setuptools and pip. Using sdists is no longer supported - users supplying
|
||||
their own versions of pip/setuptools will need to provide wheels.
|
||||
* **BACKWARDS INCOMPATIBLE** Modified the handling of ``--extra-search-dirs``.
|
||||
This option now works like pip's ``--find-links`` option, in that it adds
|
||||
extra directories to search for compatible wheels for pip and setuptools.
|
||||
The actual wheel selected is chosen based on version and compatibility, using
|
||||
the same algorithm as ``pip install setuptools``.
|
||||
* Fixed #495, --always-copy was failing (#PR 511)
|
||||
* Upgraded pip to v1.5
|
||||
* Upgraded setuptools to v1.4
|
||||
|
||||
1.10.1 (2013-08-07)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* **New Signing Key** Release 1.10.1 is using a different key than normal with
|
||||
fingerprint: 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA
|
||||
* Upgraded pip to v1.4.1
|
||||
* Upgraded setuptools to v0.9.8
|
||||
|
||||
|
||||
1.10 (2013-07-23)
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
* **BACKWARDS INCOMPATIBLE** Dropped support for Python 2.5. The minimum
|
||||
supported Python version is now Python 2.6.
|
||||
|
||||
* **BACKWARDS INCOMPATIBLE** Using ``virtualenv.py`` as an isolated script
|
||||
(i.e. without an associated ``virtualenv_support`` directory) is no longer
|
||||
supported for security reasons and will fail with an error.
|
||||
|
||||
Along with this, ``--never-download`` is now always pinned to ``True``, and
|
||||
is only being maintained in the short term for backward compatibility
|
||||
(Pull #412).
|
||||
|
||||
* **IMPORTANT** Switched to the new setuptools (v0.9.7) which has been merged
|
||||
with Distribute_ again and works for Python 2 and 3 with one codebase.
|
||||
The ``--distribute`` and ``--setuptools`` options are now no-op.
|
||||
|
||||
* Updated to pip 1.4.
|
||||
|
||||
* Added support for PyPy3k
|
||||
|
||||
* Added the option to use a version number with the ``-p`` option to get the
|
||||
system copy of that Python version (Windows only)
|
||||
|
||||
* Removed embedded ``ez_setup.py``, ``distribute_setup.py`` and
|
||||
``distribute_from_egg.py`` files as part of switching to merged setuptools.
|
||||
|
||||
* Fixed ``--relocatable`` to work better on Windows.
|
||||
|
||||
* Fixed issue with readline on Windows.
|
||||
|
||||
.. _Distribute: https://pypi.python.org/pypi/distribute
|
||||
|
||||
1.9.1 (2013-03-08)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated to pip 1.3.1 that fixed a major backward incompatible change of
|
||||
parsing URLs to externally hosted packages that got accidentily included
|
||||
in pip 1.3.
|
||||
|
||||
1.9 (2013-03-07)
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
* Unset VIRTUAL_ENV environment variable in deactivate.bat (Pull #364)
|
||||
* Upgraded distribute to 0.6.34.
|
||||
* Added ``--no-setuptools`` and ``--no-pip`` options (Pull #336).
|
||||
* Fixed Issue #373. virtualenv-1.8.4 was failing in cygwin (Pull #382).
|
||||
* Fixed Issue #378. virtualenv is now "multiarch" aware on debian/ubuntu (Pull #379).
|
||||
* Fixed issue with readline module path on pypy and OSX (Pull #374).
|
||||
* Made 64bit detection compatible with Python 2.5 (Pull #393).
|
||||
|
||||
|
||||
1.8.4 (2012-11-25)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated distribute to 0.6.31. This fixes #359 (numpy install regression) on
|
||||
UTF-8 platforms, and provides a workaround on other platforms:
|
||||
``PYTHONIOENCODING=utf8 pip install numpy``.
|
||||
|
||||
* When installing virtualenv via curl, don't forget to filter out arguments
|
||||
the distribute setup script won't understand. Fixes #358.
|
||||
|
||||
* Added some more integration tests.
|
||||
|
||||
* Removed the unsupported embedded setuptools egg for Python 2.4 to reduce
|
||||
file size.
|
||||
|
||||
1.8.3 (2012-11-21)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Fixed readline on OS X. Thanks minrk
|
||||
|
||||
* Updated distribute to 0.6.30 (improves our error reporting, plus new
|
||||
distribute features and fixes). Thanks Gabriel (g2p)
|
||||
|
||||
* Added compatibility with multiarch Python (Python 3.3 for example). Added an
|
||||
integration test. Thanks Gabriel (g2p)
|
||||
|
||||
* Added ability to install distribute from a user-provided egg, rather than the
|
||||
bundled sdist, for better speed. Thanks Paul Moore.
|
||||
|
||||
* Make the creation of lib64 symlink smarter about already-existing symlink,
|
||||
and more explicit about full paths. Fixes #334 and #330. Thanks Jeremy Orem.
|
||||
|
||||
* Give lib64 site-dir preference over lib on 64-bit systems, to avoid wrong
|
||||
32-bit compiles in the venv. Fixes #328. Thanks Damien Nozay.
|
||||
|
||||
* Fix a bug with prompt-handling in ``activate.csh`` in non-interactive csh
|
||||
shells. Fixes #332. Thanks Benjamin Root for report and patch.
|
||||
|
||||
* Make it possible to create a virtualenv from within a Python
|
||||
3.3. pyvenv. Thanks Chris McDonough for the report.
|
||||
|
||||
* Add optional --setuptools option to be able to switch to it in case
|
||||
distribute is the default (like in Debian).
|
||||
|
||||
1.8.2 (2012-09-06)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated the included pip version to 1.2.1 to fix regressions introduced
|
||||
there in 1.2.
|
||||
|
||||
|
||||
1.8.1 (2012-09-03)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Fixed distribute version used with `--never-download`. Thanks michr for
|
||||
report and patch.
|
||||
|
||||
* Fix creating Python 3.3 based virtualenvs by unsetting the
|
||||
``__PYVENV_LAUNCHER__`` environment variable in subprocesses.
|
||||
|
||||
|
||||
1.8 (2012-09-01)
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
* **Dropped support for Python 2.4** The minimum supported Python version is
|
||||
now Python 2.5.
|
||||
|
||||
* Fix `--relocatable` on systems that use lib64. Fixes #78. Thanks Branden
|
||||
Rolston.
|
||||
|
||||
* Symlink some additional modules under Python 3. Fixes #194. Thanks Vinay
|
||||
Sajip, Ian Clelland, and Stefan Holek for the report.
|
||||
|
||||
* Fix ``--relocatable`` when a script uses ``__future__`` imports. Thanks
|
||||
Branden Rolston.
|
||||
|
||||
* Fix a bug in the config option parser that prevented setting negative
|
||||
options with environment variables. Thanks Ralf Schmitt.
|
||||
|
||||
* Allow setting ``--no-site-packages`` from the config file.
|
||||
|
||||
* Use ``/usr/bin/multiarch-platform`` if available to figure out the include
|
||||
directory. Thanks for the patch, Mika Laitio.
|
||||
|
||||
* Fix ``install_name_tool`` replacement to work on Python 3.X.
|
||||
|
||||
* Handle paths of users' site-packages on Mac OS X correctly when changing
|
||||
the prefix.
|
||||
|
||||
* Updated the embedded version of distribute to 0.6.28 and pip to 1.2.
|
||||
|
||||
|
||||
1.7.2 (2012-06-22)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated to distribute 0.6.27.
|
||||
|
||||
* Fix activate.fish on OS X. Fixes #8. Thanks David Schoonover.
|
||||
|
||||
* Create a virtualenv-x.x script with the Python version when installing, so
|
||||
virtualenv for multiple Python versions can be installed to the same
|
||||
script location. Thanks Miki Tebeka.
|
||||
|
||||
* Restored ability to create a virtualenv with a path longer than 78
|
||||
characters, without breaking creation of virtualenvs with non-ASCII paths.
|
||||
Thanks, Bradley Ayers.
|
||||
|
||||
* Added ability to create virtualenvs without having installed Apple's
|
||||
developers tools (using an own implementation of ``install_name_tool``).
|
||||
Thanks Mike Hommey.
|
||||
|
||||
* Fixed PyPy and Jython support on Windows. Thanks Konstantin Zemlyak.
|
||||
|
||||
* Added pydoc script to ease use. Thanks Marc Abramowitz. Fixes #149.
|
||||
|
||||
* Fixed creating a bootstrap script on Python 3. Thanks Raul Leal. Fixes #280.
|
||||
|
||||
* Fixed inconsistency when having set the ``PYTHONDONTWRITEBYTECODE`` env var
|
||||
with the --distribute option or the ``VIRTUALENV_USE_DISTRIBUTE`` env var.
|
||||
``VIRTUALENV_USE_DISTRIBUTE`` is now considered again as a legacy alias.
|
||||
|
||||
|
||||
1.7.1.2 (2012-02-17)
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Fixed minor issue in `--relocatable`. Thanks, Cap Petschulat.
|
||||
|
||||
|
||||
1.7.1.1 (2012-02-16)
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Bumped the version string in ``virtualenv.py`` up, too.
|
||||
|
||||
* Fixed rST rendering bug of long description.
|
||||
|
||||
|
||||
1.7.1 (2012-02-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Update embedded pip to version 1.1.
|
||||
|
||||
* Fix `--relocatable` under Python 3. Thanks Doug Hellmann.
|
||||
|
||||
* Added environ PATH modification to activate_this.py. Thanks Doug
|
||||
Napoleone. Fixes #14.
|
||||
|
||||
* Support creating virtualenvs directly from a Python build directory on
|
||||
Windows. Thanks CBWhiz. Fixes #139.
|
||||
|
||||
* Use non-recursive symlinks to fix things up for posix_local install
|
||||
scheme. Thanks michr.
|
||||
|
||||
* Made activate script available for use with msys and cygwin on Windows.
|
||||
Thanks Greg Haskins, Cliff Xuan, Jonathan Griffin and Doug Napoleone.
|
||||
Fixes #176.
|
||||
|
||||
* Fixed creation of virtualenvs on Windows when Python is not installed for
|
||||
all users. Thanks Anatoly Techtonik for report and patch and Doug
|
||||
Napoleone for testing and confirmation. Fixes #87.
|
||||
|
||||
* Fixed creation of virtualenvs using -p in installs where some modules
|
||||
that ought to be in the standard library (e.g. `readline`) are actually
|
||||
installed in `site-packages` next to `virtualenv.py`. Thanks Greg Haskins
|
||||
for report and fix. Fixes #167.
|
||||
|
||||
* Added activation script for Powershell (signed by Jannis Leidel). Many
|
||||
thanks to Jason R. Coombs.
|
||||
|
||||
|
||||
1.7 (2011-11-30)
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
* Gave user-provided ``--extra-search-dir`` priority over default dirs for
|
||||
finding setuptools/distribute (it already had priority for finding pip).
|
||||
Thanks Ethan Jucovy.
|
||||
|
||||
* Updated embedded Distribute release to 0.6.24. Thanks Alex Gronholm.
|
||||
|
||||
* Made ``--no-site-packages`` behavior the default behavior. The
|
||||
``--no-site-packages`` flag is still permitted, but displays a warning when
|
||||
used. Thanks Chris McDonough.
|
||||
|
||||
* New flag: ``--system-site-packages``; this flag should be passed to get the
|
||||
previous default global-site-package-including behavior back.
|
||||
|
||||
* Added ability to set command options as environment variables and options
|
||||
in a ``virtualenv.ini`` file.
|
||||
|
||||
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
|
||||
|
||||
* Made ``virtualenv.py`` script executable.
|
||||
|
||||
|
||||
1.6.4 (2011-07-21)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python 2.4, too.
|
||||
|
||||
|
||||
1.6.3 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Restored ability to run on Python < 2.7.
|
||||
|
||||
|
||||
1.6.2 (2011-07-16)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Updated embedded distribute release to 0.6.19.
|
||||
|
||||
* Updated embedded pip release to 1.0.2.
|
||||
|
||||
* Fixed #141 - Be smarter about finding pkg_resources when using the
|
||||
non-default Python interpreter (by using the ``-p`` option).
|
||||
|
||||
* Fixed #112 - Fixed path in docs.
|
||||
|
||||
* Fixed #109 - Corrected doctests of a Logger method.
|
||||
|
||||
* Fixed #118 - Fixed creating virtualenvs on platforms that use the
|
||||
"posix_local" install scheme, such as Ubuntu with Python 2.7.
|
||||
|
||||
* Add missing library to Python 3 virtualenvs (``_dummy_thread``).
|
||||
|
||||
|
||||
1.6.1 (2011-04-30)
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Start to use git-flow.
|
||||
|
||||
* Added support for PyPy 1.5
|
||||
|
||||
* Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
|
||||
|
||||
* Added progress meter for pip installation as well as setuptools. Thanks Ethan
|
||||
Jucovy.
|
||||
|
||||
* Added --never-download and --search-dir options. Thanks Ethan Jucovy.
|
||||
|
||||
|
||||
1.6
|
||||
~~~
|
||||
|
||||
* Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
|
||||
|
||||
* Fixed creation of virtualenvs on Mac OS X when standard library modules
|
||||
(readline) are installed outside the standard library.
|
||||
|
||||
* Updated bundled pip to 1.0.
|
||||
|
||||
|
||||
1.5.2
|
||||
~~~~~
|
||||
|
||||
* Moved main repository to Github: https://github.com/pypa/virtualenv
|
||||
|
||||
* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
|
||||
|
||||
* Fixed a few more pypy related bugs.
|
||||
|
||||
* Updated bundled pip to 0.8.2.
|
||||
|
||||
* Handed project over to new team of maintainers.
|
||||
|
||||
* Moved virtualenv to Github at https://github.com/pypa/virtualenv
|
||||
|
||||
|
||||
1.5.1
|
||||
~~~~~
|
||||
|
||||
* Added ``_weakrefset`` requirement for Python 2.7.1.
|
||||
|
||||
* Fixed Windows regression in 1.5
|
||||
|
||||
|
||||
1.5
|
||||
~~~
|
||||
|
||||
* Include pip 0.8.1.
|
||||
|
||||
* Add support for PyPy.
|
||||
|
||||
* Uses a proper temporary dir when installing environment requirements.
|
||||
|
||||
* Add ``--prompt`` option to be able to override the default prompt prefix.
|
||||
|
||||
* Fix an issue with ``--relocatable`` on Windows.
|
||||
|
||||
* Fix issue with installing the wrong version of distribute.
|
||||
|
||||
* Add fish and csh activate scripts.
|
||||
|
||||
|
||||
1.4.9
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7.2
|
||||
|
||||
|
||||
1.4.8
|
||||
~~~~~
|
||||
|
||||
* Fix for Mac OS X Framework builds that use
|
||||
``--universal-archs=intel``
|
||||
|
||||
* Fix ``activate_this.py`` on Windows.
|
||||
|
||||
* Allow ``$PYTHONHOME`` to be set, so long as you use ``source
|
||||
bin/activate`` it will get unset; if you leave it set and do not
|
||||
activate the environment it will still break the environment.
|
||||
|
||||
* Include pip 0.7.1
|
||||
|
||||
|
||||
1.4.7
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.7
|
||||
|
||||
|
||||
1.4.6
|
||||
~~~~~
|
||||
|
||||
* Allow ``activate.sh`` to skip updating the prompt (by setting
|
||||
``$VIRTUAL_ENV_DISABLE_PROMPT``).
|
||||
|
||||
|
||||
1.4.5
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.3
|
||||
|
||||
* Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
|
||||
``PATH`` contained a parenthesis
|
||||
|
||||
|
||||
1.4.4
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.2 and Distribute 0.6.10
|
||||
|
||||
* Create the ``virtualenv`` script even when Setuptools isn't
|
||||
installed
|
||||
|
||||
* Fix problem with ``virtualenv --relocate`` when ``bin/`` has
|
||||
subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
|
||||
|
||||
* If you set ``$VIRTUALENV_DISTRIBUTE`` then virtualenv will use
|
||||
Distribute by default (so you don't have to remember to use
|
||||
``--distribute``).
|
||||
|
||||
|
||||
1.4.3
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6.1
|
||||
|
||||
|
||||
1.4.2
|
||||
~~~~~
|
||||
|
||||
* Fix pip installation on Windows
|
||||
|
||||
* Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
|
||||
|
||||
* Exclude ~/.local (user site-packages) from environments when using
|
||||
``--no-site-packages``
|
||||
|
||||
|
||||
1.4.1
|
||||
~~~~~
|
||||
|
||||
* Include pip 0.6
|
||||
|
||||
|
||||
1.4
|
||||
~~~
|
||||
|
||||
* Updated setuptools to 0.6c11
|
||||
|
||||
* Added the --distribute option
|
||||
|
||||
* Fixed packaging problem of support-files
|
||||
|
||||
|
||||
1.3.4
|
||||
~~~~~
|
||||
|
||||
* Virtualenv now copies the actual embedded Python binary on
|
||||
Mac OS X to fix a hang on Snow Leopard (10.6).
|
||||
|
||||
* Fail more gracefully on Windows when ``win32api`` is not installed.
|
||||
|
||||
* Fix site-packages taking precedent over Jython's ``__classpath__``
|
||||
and also specially handle the new ``__pyclasspath__`` entry in
|
||||
``sys.path``.
|
||||
|
||||
* Now copies Jython's ``registry`` file to the virtualenv if it exists.
|
||||
|
||||
* Better find libraries when compiling extensions on Windows.
|
||||
|
||||
* Create ``Scripts\pythonw.exe`` on Windows.
|
||||
|
||||
* Added support for the Debian/Ubuntu
|
||||
``/usr/lib/pythonX.Y/dist-packages`` directory.
|
||||
|
||||
* Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
|
||||
``sys.real_prefix``) which is reported to help building on Windows.
|
||||
|
||||
* Make ``deactivate`` work on ksh
|
||||
|
||||
* Fixes for ``--python``: make it work with ``--relocatable`` and the
|
||||
symlink created to the exact Python version.
|
||||
|
||||
|
||||
1.3.3
|
||||
~~~~~
|
||||
|
||||
* Use Windows newlines in ``activate.bat``, which has been reported to help
|
||||
when using non-ASCII directory names.
|
||||
|
||||
* Fixed compatibility with Jython 2.5b1.
|
||||
|
||||
* Added a function ``virtualenv.install_python`` for more fine-grained
|
||||
access to what ``virtualenv.create_environment`` does.
|
||||
|
||||
* Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
|
||||
with Windows and paths that contain spaces.
|
||||
|
||||
* If ``/path/to/env/.pydistutils.cfg`` exists (or
|
||||
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
|
||||
``~/.pydistutils.cfg`` and use that other file instead.
|
||||
|
||||
* Fix ` a problem
|
||||
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
|
||||
some ``.so`` libraries in ``/usr/local``.
|
||||
|
||||
|
||||
1.3.2
|
||||
~~~~~
|
||||
|
||||
* Remove the ``[install] prefix = ...`` setting from the virtualenv
|
||||
``distutils.cfg`` -- this has been causing problems for a lot of
|
||||
people, in rather obscure ways.
|
||||
|
||||
* If you use a boot script it will attempt to import ``virtualenv``
|
||||
and find a pre-downloaded Setuptools egg using that.
|
||||
|
||||
* Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
|
||||
|
||||
|
||||
1.3.1
|
||||
~~~~~
|
||||
|
||||
* Real Python 2.6 compatibility. Backported the Python 2.6 updates to
|
||||
``site.py``, including `user directories
|
||||
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
|
||||
(this means older versions of Python will support user directories,
|
||||
whether intended or not).
|
||||
|
||||
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
|
||||
on some platforms where a system-wide ``distutils.cfg`` was present
|
||||
with a ``prefix`` setting, packages would be installed globally
|
||||
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
|
||||
|
||||
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
|
||||
workaround is added.
|
||||
|
||||
* Fix ``--python`` option.
|
||||
|
||||
* Fixed handling of Jython environments that use a
|
||||
jython-complete.jar.
|
||||
|
||||
|
||||
1.3
|
||||
~~~
|
||||
|
||||
* Update to Setuptools 0.6c9
|
||||
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
|
||||
will make an existing environment "relocatable" -- the paths will
|
||||
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
|
||||
may assist in building environments that can be moved and copied.
|
||||
You have to run this *after* any new packages installed.
|
||||
* Added ``bin/activate_this.py``, a file you can use like
|
||||
``execfile("path_to/activate_this.py",
|
||||
dict(__file__="path_to/activate_this.py"))`` -- this will activate
|
||||
the environment in place, similar to what `the mod_wsgi example
|
||||
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
* For Mac framework builds of Python, the site-packages directory
|
||||
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
|
||||
Andrea Rech.
|
||||
* Some platform-specific modules in Macs are added to the path now
|
||||
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
|
||||
from Andrea Rech.
|
||||
* Fixed a small Bashism in the ``bin/activate`` shell script.
|
||||
* Added ``__future__`` to the list of required modules, for Python
|
||||
2.3. You'll still need to backport your own ``subprocess`` module.
|
||||
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
|
||||
precedent over virtualenv's libs.
|
||||
|
||||
|
||||
1.2
|
||||
~~~
|
||||
|
||||
* Added a ``--python`` option to select the Python interpreter.
|
||||
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
|
||||
* Add ``sets`` to the module copied over for Python 2.3 (though Python
|
||||
2.3 still probably doesn't work).
|
||||
|
||||
|
||||
1.1.1
|
||||
~~~~~
|
||||
|
||||
* Added support for Jython 2.5.
|
||||
|
||||
|
||||
1.1
|
||||
~~~
|
||||
|
||||
* Added support for Python 2.6.
|
||||
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
|
||||
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
|
||||
with an interpreter named, e.g., ``python2.4``
|
||||
* Fix MacPorts Python
|
||||
* Added --unzip-setuptools option
|
||||
* Update to Setuptools 0.6c8
|
||||
* If the current directory is not writable, run ez_setup.py in ``/tmp``
|
||||
* Copy or symlink over the ``include`` directory so that packages will
|
||||
more consistently compile.
|
||||
|
||||
|
||||
1.0
|
||||
~~~
|
||||
|
||||
* Fix build on systems that use ``/usr/lib64``, distinct from
|
||||
``/usr/lib`` (specifically CentOS x64).
|
||||
* Fixed bug in ``--clear``.
|
||||
* Fixed typos in ``deactivate.bat``.
|
||||
* Preserve ``$PYTHONPATH`` when calling subprocesses.
|
||||
|
||||
|
||||
0.9.2
|
||||
~~~~~
|
||||
|
||||
* Fix include dir copying on Windows (makes compiling possible).
|
||||
* Include the main ``lib-tk`` in the path.
|
||||
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
|
||||
``get_python_lib`` to point to the global locations.
|
||||
* Install ``distutils.cfg`` before Setuptools, so that system
|
||||
customizations of ``distutils.cfg`` won't effect the installation.
|
||||
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
|
||||
``bin/python``).
|
||||
* Fixed an issue with Mac Framework Python builds, and absolute paths
|
||||
(from Ronald Oussoren).
|
||||
|
||||
|
||||
0.9.1
|
||||
~~~~~
|
||||
|
||||
* Improve ability to create a virtualenv from inside a virtualenv.
|
||||
* Fix a little bug in ``bin/activate``.
|
||||
* Actually get ``distutils.cfg`` to work reliably.
|
||||
|
||||
|
||||
0.9
|
||||
~~~
|
||||
|
||||
* Added ``lib-dynload`` and ``config`` to things that need to be
|
||||
copied over in an environment.
|
||||
* Copy over or symlink the ``include`` directory, so that you can
|
||||
build packages that need the C headers.
|
||||
* Include a ``distutils`` package, so you can locally update
|
||||
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
|
||||
* Better avoid downloading Setuptools, and hitting PyPI on environment
|
||||
creation.
|
||||
* Fix a problem creating a ``lib64/`` directory.
|
||||
* Should work on MacOSX Framework builds (the default Python
|
||||
installations on Mac). Thanks to Ronald Oussoren.
|
||||
|
||||
|
||||
0.8.4
|
||||
~~~~~
|
||||
|
||||
* Windows installs would sometimes give errors about ``sys.prefix`` that
|
||||
were inaccurate.
|
||||
* Slightly prettier output.
|
||||
|
||||
|
||||
0.8.3
|
||||
~~~~~
|
||||
|
||||
* Added support for Windows.
|
||||
|
||||
|
||||
0.8.2
|
||||
~~~~~
|
||||
|
||||
* Give a better warning if you are on an unsupported platform (Mac
|
||||
Framework Pythons, and Windows).
|
||||
* Give error about running while inside a workingenv.
|
||||
* Give better error message about Python 2.3.
|
||||
|
||||
|
||||
0.8.1
|
||||
~~~~~
|
||||
|
||||
Fixed packaging of the library.
|
||||
|
||||
|
||||
0.8
|
||||
~~~
|
||||
|
||||
Initial release. Everything is changed and new!
|
@ -1,149 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Paste documentation build configuration file, created by
|
||||
# sphinx-quickstart on Tue Apr 22 22:08:49 2008.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its containing dir.
|
||||
#
|
||||
# The contents of this file are pickled, so don't put values in the namespace
|
||||
# that aren't pickleable (module imports are okay, they're removed automatically).
|
||||
#
|
||||
# All configuration values have a default value; values that are commented out
|
||||
# serve to show the default value.
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
|
||||
|
||||
# If your extensions are in another directory, add it here.
|
||||
sys.path.insert(0, os.path.abspath(os.pardir))
|
||||
|
||||
# General configuration
|
||||
# ---------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = ['sphinx.ext.autodoc']
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
## FIXME: disabled for now because I haven't figured out how to use this:
|
||||
#templates_path = ['_templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General substitutions.
|
||||
project = 'virtualenv'
|
||||
copyright = '2007-2014, Ian Bicking, The Open Planning Project, PyPA'
|
||||
|
||||
# The default replacements for |version| and |release|, also used in various
|
||||
# other places throughout the built documents.
|
||||
try:
|
||||
from virtualenv import __version__
|
||||
# The short X.Y version.
|
||||
version = '.'.join(__version__.split('.')[:2])
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = __version__
|
||||
except ImportError:
|
||||
version = release = 'dev'
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of documents that shouldn't be included in the build.
|
||||
unused_docs = []
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
|
||||
# Options for HTML output
|
||||
# -----------------------
|
||||
|
||||
# The style sheet to use for HTML and HTML Help pages. A file of that name
|
||||
# must exist either in Sphinx' static/ path, or in one of the custom paths
|
||||
# given in html_static_path.
|
||||
#html_style = 'default.css'
|
||||
|
||||
html_theme = 'default'
|
||||
if not on_rtd:
|
||||
try:
|
||||
import sphinx_rtd_theme
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
# html_static_path = ['_static']
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Content template for the index page.
|
||||
#html_index = ''
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_use_modindex = True
|
||||
|
||||
# If true, the reST sources are included in the HTML build as _sources/<name>.
|
||||
#html_copy_source = True
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'Pastedoc'
|
||||
|
||||
|
||||
# Options for LaTeX output
|
||||
# ------------------------
|
||||
|
||||
# The paper size ('letter' or 'a4').
|
||||
#latex_paper_size = 'letter'
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#latex_font_size = '10pt'
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title, author, document class [howto/manual]).
|
||||
#latex_documents = []
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#latex_preamble = ''
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_use_modindex = True
|
@ -1,61 +0,0 @@
|
||||
Development
|
||||
===========
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Refer to the `pip development`_ documentation - it applies equally to
|
||||
virtualenv, except that virtualenv issues should filed on the `virtualenv
|
||||
repo`_ at GitHub.
|
||||
|
||||
Virtualenv's release schedule is tied to pip's -- each time there's a new pip
|
||||
release, there will be a new virtualenv release that bundles the new version of
|
||||
pip.
|
||||
|
||||
Files in the `virtualenv_embedded/` subdirectory are embedded into
|
||||
`virtualenv.py` itself as base64-encoded strings (in order to support
|
||||
single-file use of `virtualenv.py` without installing it). If your patch
|
||||
changes any file in `virtualenv_embedded/`, run `bin/rebuild-script.py` to
|
||||
update the embedded version of that file in `virtualenv.py`; commit that and
|
||||
submit it as part of your patch / pull request.
|
||||
|
||||
.. _pip development: http://www.pip-installer.org/en/latest/development.html
|
||||
.. _virtualenv repo: https://github.com/pypa/virtualenv/
|
||||
|
||||
Running the tests
|
||||
-----------------
|
||||
|
||||
Virtualenv's test suite is small and not yet at all comprehensive, but we aim
|
||||
to grow it.
|
||||
|
||||
The easy way to run tests (handles test dependencies automatically)::
|
||||
|
||||
$ python setup.py test
|
||||
|
||||
If you want to run only a selection of the tests, you'll need to run them
|
||||
directly with pytest instead. Create a virtualenv, and install required
|
||||
packages::
|
||||
|
||||
$ pip install pytest mock
|
||||
|
||||
Run pytest::
|
||||
|
||||
$ pytest
|
||||
|
||||
Or select just a single test file to run::
|
||||
|
||||
$ pytest tests/test_virtualenv
|
||||
|
||||
Status and License
|
||||
------------------
|
||||
|
||||
``virtualenv`` is a successor to `workingenv
|
||||
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
|
||||
of `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
|
||||
|
||||
It was written by Ian Bicking, sponsored by the `Open Planning
|
||||
Project <http://openplans.org>`_ and is now maintained by a
|
||||
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
|
||||
It is licensed under an
|
||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
@ -1,137 +0,0 @@
|
||||
Virtualenv
|
||||
==========
|
||||
|
||||
`Mailing list <http://groups.google.com/group/python-virtualenv>`_ |
|
||||
`Issues <https://github.com/pypa/virtualenv/issues>`_ |
|
||||
`Github <https://github.com/pypa/virtualenv>`_ |
|
||||
`PyPI <https://pypi.python.org/pypi/virtualenv/>`_ |
|
||||
User IRC: #pypa
|
||||
Dev IRC: #pypa-dev
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
``virtualenv`` is a tool to create isolated Python environments.
|
||||
|
||||
The basic problem being addressed is one of dependencies and versions,
|
||||
and indirectly permissions. Imagine you have an application that
|
||||
needs version 1 of LibFoo, but another application requires version
|
||||
2. How can you use both these applications? If you install
|
||||
everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
|
||||
platform's standard location is), it's easy to end up in a situation
|
||||
where you unintentionally upgrade an application that shouldn't be
|
||||
upgraded.
|
||||
|
||||
Or more generally, what if you want to install an application *and
|
||||
leave it be*? If an application works, any change in its libraries or
|
||||
the versions of those libraries can break the application.
|
||||
|
||||
Also, what if you can't install packages into the global
|
||||
``site-packages`` directory? For instance, on a shared host.
|
||||
|
||||
In all these cases, ``virtualenv`` can help you. It creates an
|
||||
environment that has its own installation directories, that doesn't
|
||||
share libraries with other virtualenv environments (and optionally
|
||||
doesn't access the globally installed libraries either).
|
||||
|
||||
.. comment: split here
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
installation
|
||||
userguide
|
||||
reference
|
||||
development
|
||||
changes
|
||||
|
||||
.. warning::
|
||||
|
||||
Python bugfix releases 2.6.8, 2.7.3, 3.1.5 and 3.2.3 include a change that
|
||||
will cause "import random" to fail with "cannot import name urandom" on any
|
||||
virtualenv created on a Unix host with an earlier release of Python
|
||||
2.6/2.7/3.1/3.2, if the underlying system Python is upgraded. This is due to
|
||||
the fact that a virtualenv uses the system Python's standard library but
|
||||
contains its own copy of the Python interpreter, so an upgrade to the system
|
||||
Python results in a mismatch between the version of the Python interpreter
|
||||
and the version of the standard library. It can be fixed by removing
|
||||
``$ENV/bin/python`` and re-running virtualenv on the same target directory
|
||||
with the upgraded Python.
|
||||
|
||||
Other Documentation and Links
|
||||
-----------------------------
|
||||
|
||||
* `Blog announcement of virtualenv`__.
|
||||
|
||||
.. __: http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/
|
||||
|
||||
* James Gardner has written a tutorial on using `virtualenv with
|
||||
Pylons
|
||||
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
|
||||
|
||||
* Chris Perkins created a `showmedo video including virtualenv
|
||||
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
|
||||
|
||||
* Doug Hellmann's `virtualenvwrapper`_ is a useful set of scripts to make
|
||||
your workflow with many virtualenvs even easier. `His initial blog post on it`__.
|
||||
He also wrote `an example of using virtualenv to try IPython`__.
|
||||
|
||||
.. _virtualenvwrapper: https://pypi.python.org/pypi/virtualenvwrapper/
|
||||
.. __: http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html
|
||||
.. __: http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html
|
||||
|
||||
* `Pew`_ is another wrapper for virtualenv that makes use of a different
|
||||
activation technique.
|
||||
|
||||
.. _Pew: https://pypi.python.org/pypi/pew/
|
||||
|
||||
* `Using virtualenv with mod_wsgi
|
||||
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
||||
|
||||
* `virtualenv commands
|
||||
<https://github.com/thisismedium/virtualenv-commands>`_ for some more
|
||||
workflow-related tools around virtualenv.
|
||||
|
||||
* PyCon US 2011 talk: `Reverse-engineering Ian Bicking's brain: inside pip and virtualenv
|
||||
<http://pyvideo.org/video/568/reverse-engineering-ian-bicking--39-s-brain--insi>`_.
|
||||
By the end of the talk, you'll have a good idea exactly how pip
|
||||
and virtualenv do their magic, and where to go looking in the source
|
||||
for particular behaviors or bug fixes.
|
||||
|
||||
Compare & Contrast with Alternatives
|
||||
------------------------------------
|
||||
|
||||
There are several alternatives that create isolated environments:
|
||||
|
||||
* ``workingenv`` (which I do not suggest you use anymore) is the
|
||||
predecessor to this library. It used the main Python interpreter,
|
||||
but relied on setting ``$PYTHONPATH`` to activate the environment.
|
||||
This causes problems when running Python scripts that aren't part of
|
||||
the environment (e.g., a globally installed ``hg`` or ``bzr``). It
|
||||
also conflicted a lot with Setuptools.
|
||||
|
||||
* `virtual-python
|
||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
|
||||
is also a predecessor to this library. It uses only symlinks, so it
|
||||
couldn't work on Windows. It also symlinks over the *entire*
|
||||
standard library and global ``site-packages``. As a result, it
|
||||
won't see new additions to the global ``site-packages``.
|
||||
|
||||
This script only symlinks a small portion of the standard library
|
||||
into the environment, and so on Windows it is feasible to simply
|
||||
copy these files over. Also, it creates a new/empty
|
||||
``site-packages`` and also adds the global ``site-packages`` to the
|
||||
path, so updates are tracked separately. This script also installs
|
||||
Setuptools automatically, saving a step and avoiding the need for
|
||||
network access.
|
||||
|
||||
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
|
||||
create an isolated Python environment in the same style, but
|
||||
achieves similar results through a declarative config file that sets
|
||||
up scripts with very particular packages. As a declarative system,
|
||||
it is somewhat easier to repeat and manage, but more difficult to
|
||||
experiment with. ``zc.buildout`` includes the ability to setup
|
||||
non-Python systems (e.g., a database server or an Apache instance).
|
||||
|
||||
I *strongly* recommend anyone doing application development or
|
||||
deployment use one of these tools.
|
@ -1,58 +0,0 @@
|
||||
Installation
|
||||
============
|
||||
|
||||
.. warning::
|
||||
|
||||
We advise installing virtualenv-1.9 or greater. Prior to version 1.9, the
|
||||
pip included in virtualenv did not download from PyPI over SSL.
|
||||
|
||||
.. warning::
|
||||
|
||||
When using pip to install virtualenv, we advise using pip 1.3 or greater.
|
||||
Prior to version 1.3, pip did not download from PyPI over SSL.
|
||||
|
||||
.. warning::
|
||||
|
||||
We advise against using easy_install to install virtualenv when using
|
||||
setuptools < 0.9.7, because easy_install didn't download from PyPI over SSL
|
||||
and was broken in some subtle ways.
|
||||
|
||||
To install globally with `pip` (if you have pip 1.3 or greater installed globally):
|
||||
|
||||
::
|
||||
|
||||
$ [sudo] pip install virtualenv
|
||||
|
||||
Or to get the latest unreleased dev version:
|
||||
|
||||
::
|
||||
|
||||
$ [sudo] pip install https://github.com/pypa/virtualenv/tarball/develop
|
||||
|
||||
|
||||
To install version X.X globally from source:
|
||||
|
||||
::
|
||||
|
||||
$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-X.X.tar.gz
|
||||
$ tar xvfz virtualenv-X.X.tar.gz
|
||||
$ cd virtualenv-X.X
|
||||
$ [sudo] python setup.py install
|
||||
|
||||
|
||||
To *use* locally from source:
|
||||
|
||||
::
|
||||
|
||||
$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-X.X.tar.gz
|
||||
$ tar xvfz virtualenv-X.X.tar.gz
|
||||
$ cd virtualenv-X.X
|
||||
$ python virtualenv.py myVE
|
||||
|
||||
.. note::
|
||||
|
||||
The ``virtualenv.py`` script is *not* supported if run without the
|
||||
necessary pip/setuptools/virtualenv distributions available locally. All
|
||||
of the installation methods above include a ``virtualenv_support``
|
||||
directory alongside ``virtualenv.py`` which contains a complete set of
|
||||
pip and setuptools distributions, and so are fully supported.
|
@ -1,170 +0,0 @@
|
||||
@ECHO OFF
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set BUILDDIR=_build
|
||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
|
||||
if NOT "%PAPER%" == "" (
|
||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
||||
)
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
if "%1" == "help" (
|
||||
:help
|
||||
echo.Please use `make ^<target^>` where ^<target^> is one of
|
||||
echo. html to make standalone HTML files
|
||||
echo. dirhtml to make HTML files named index.html in directories
|
||||
echo. singlehtml to make a single large HTML file
|
||||
echo. pickle to make pickle files
|
||||
echo. json to make JSON files
|
||||
echo. htmlhelp to make HTML files and a HTML help project
|
||||
echo. qthelp to make HTML files and a qthelp project
|
||||
echo. devhelp to make HTML files and a Devhelp project
|
||||
echo. epub to make an epub
|
||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
||||
echo. text to make text files
|
||||
echo. man to make manual pages
|
||||
echo. changes to make an overview over all changed/added/deprecated items
|
||||
echo. linkcheck to check all external links for integrity
|
||||
echo. doctest to run all doctests embedded in the documentation if enabled
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "clean" (
|
||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
||||
del /q /s %BUILDDIR%\*
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "html" (
|
||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "dirhtml" (
|
||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "singlehtml" (
|
||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "pickle" (
|
||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the pickle files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "json" (
|
||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the JSON files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "htmlhelp" (
|
||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run HTML Help Workshop with the ^
|
||||
.hhp project file in %BUILDDIR%/htmlhelp.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "qthelp" (
|
||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
||||
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\django-compressor.qhcp
|
||||
echo.To view the help file:
|
||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\django-compressor.ghc
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "devhelp" (
|
||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "epub" (
|
||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latex" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "text" (
|
||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The text files are in %BUILDDIR%/text.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "man" (
|
||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "changes" (
|
||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.The overview file is in %BUILDDIR%/changes.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "linkcheck" (
|
||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Link check complete; look for any errors in the above output ^
|
||||
or in %BUILDDIR%/linkcheck/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "doctest" (
|
||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Testing of doctests in the sources finished, look at the ^
|
||||
results in %BUILDDIR%/doctest/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
:end
|
@ -1,256 +0,0 @@
|
||||
Reference Guide
|
||||
===============
|
||||
|
||||
``virtualenv`` Command
|
||||
----------------------
|
||||
|
||||
.. _usage:
|
||||
|
||||
Usage
|
||||
~~~~~
|
||||
|
||||
:command:`virtualenv [OPTIONS] ENV_DIR`
|
||||
|
||||
Where ``ENV_DIR`` is an absolute or relative path to a directory to create
|
||||
the virtual environment in.
|
||||
|
||||
.. _options:
|
||||
|
||||
Options
|
||||
~~~~~~~
|
||||
|
||||
.. program: virtualenv
|
||||
|
||||
.. option:: --version
|
||||
|
||||
show program's version number and exit
|
||||
|
||||
.. option:: -h, --help
|
||||
|
||||
show this help message and exit
|
||||
|
||||
.. option:: -v, --verbose
|
||||
|
||||
Increase verbosity.
|
||||
|
||||
.. option:: -q, --quiet
|
||||
|
||||
Decrease verbosity.
|
||||
|
||||
.. option:: -p PYTHON_EXE, --python=PYTHON_EXE
|
||||
|
||||
The Python interpreter to use, e.g.,
|
||||
--python=python2.5 will use the python2.5 interpreter
|
||||
to create the new environment. The default is the
|
||||
interpreter that virtualenv was installed with
|
||||
(like ``/usr/bin/python``)
|
||||
|
||||
.. option:: --clear
|
||||
|
||||
Clear out the non-root install and start from scratch.
|
||||
|
||||
.. option:: --system-site-packages
|
||||
|
||||
Give the virtual environment access to the global
|
||||
site-packages.
|
||||
|
||||
.. option:: --always-copy
|
||||
|
||||
Always copy files rather than symlinking.
|
||||
|
||||
.. option:: --relocatable
|
||||
|
||||
Make an EXISTING virtualenv environment relocatable.
|
||||
This fixes up scripts and makes all .pth files relative.
|
||||
|
||||
.. option:: --unzip-setuptools
|
||||
|
||||
Unzip Setuptools when installing it.
|
||||
|
||||
.. option:: --no-setuptools
|
||||
|
||||
Do not install setuptools (or pip) in the new
|
||||
virtualenv.
|
||||
|
||||
.. option:: --no-pip
|
||||
|
||||
Do not install pip in the new virtualenv.
|
||||
|
||||
.. option:: --extra-search-dir=DIR
|
||||
|
||||
Directory to look for setuptools/pip distributions in.
|
||||
This option can be specified multiple times.
|
||||
|
||||
.. option:: --prompt=PROMPT
|
||||
|
||||
Provides an alternative prompt prefix for this
|
||||
environment.
|
||||
|
||||
.. option:: --never-download
|
||||
|
||||
DEPRECATED. Retained only for backward compatibility.
|
||||
This option has no effect. Virtualenv never downloads
|
||||
pip or setuptools.
|
||||
|
||||
.. option:: --no-site-packages
|
||||
|
||||
DEPRECATED. Retained only for backward compatibility.
|
||||
Not having access to global site-packages is now the
|
||||
default behavior.
|
||||
|
||||
.. option:: --distribute
|
||||
.. option:: --setuptools
|
||||
|
||||
Legacy; now have no effect. Before version 1.10 these could be used
|
||||
to choose whether to install Distribute_ or Setuptools_ into the created
|
||||
virtualenv. Distribute has now been merged into Setuptools, and the
|
||||
latter is always installed.
|
||||
|
||||
.. _Distribute: https://pypi.python.org/pypi/distribute
|
||||
.. _Setuptools: https://pypi.python.org/pypi/setuptools
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Environment Variables
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Each command line option is automatically used to look for environment
|
||||
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
|
||||
the name of the command line options are capitalized and have dashes
|
||||
(``'-'``) replaced with underscores (``'_'``).
|
||||
|
||||
For example, to automatically use a custom Python binary instead of the
|
||||
one virtualenv is run with you can also set an environment variable::
|
||||
|
||||
$ export VIRTUALENV_PYTHON=/opt/python-3.3/bin/python
|
||||
$ virtualenv ENV
|
||||
|
||||
It's the same as passing the option to virtualenv directly::
|
||||
|
||||
$ virtualenv --python=/opt/python-3.3/bin/python ENV
|
||||
|
||||
This also works for appending command line options, like ``--find-links``.
|
||||
Just leave an empty space between the passed values, e.g.::
|
||||
|
||||
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
|
||||
$ virtualenv ENV
|
||||
|
||||
is the same as calling::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
|
||||
|
||||
.. envvar:: VIRTUAL_ENV_DISABLE_PROMPT
|
||||
|
||||
Any virtualenv created when this is set to a non-empty value will not have
|
||||
it's :ref:`activate` modify the shell prompt.
|
||||
|
||||
|
||||
Configuration File
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
|
||||
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
|
||||
``%APPDATA%\virtualenv\virtualenv.ini``.
|
||||
|
||||
The names of the settings are derived from the long command line option,
|
||||
e.g. the option :option:`--python <-p>` would look like this::
|
||||
|
||||
[virtualenv]
|
||||
python = /opt/python-3.3/bin/python
|
||||
|
||||
Appending options like :option:`--extra-search-dir` can be written on multiple
|
||||
lines::
|
||||
|
||||
[virtualenv]
|
||||
extra-search-dir =
|
||||
/path/to/dists
|
||||
/path/to/other/dists
|
||||
|
||||
Please have a look at the output of :option:`--help <-h>` for a full list
|
||||
of supported options.
|
||||
|
||||
|
||||
Extending Virtualenv
|
||||
--------------------
|
||||
|
||||
|
||||
Creating Your Own Bootstrap Scripts
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
While this creates an environment, it doesn't put anything into the
|
||||
environment. Developers may find it useful to distribute a script
|
||||
that sets up a particular environment, for example a script that
|
||||
installs a particular web application.
|
||||
|
||||
To create a script like this, call
|
||||
:py:func:`virtualenv.create_bootstrap_script`, and write the
|
||||
result to your new bootstrapping script.
|
||||
|
||||
.. py:function:: create_bootstrap_script(extra_text)
|
||||
|
||||
Creates a bootstrap script from ``extra_text``, which is like
|
||||
this script but with extend_parser, adjust_options, and after_install hooks.
|
||||
|
||||
This returns a string that (written to disk of course) can be used
|
||||
as a bootstrap script with your own customizations. The script
|
||||
will be the standard virtualenv.py script, with your extra text
|
||||
added (your extra text should be Python code).
|
||||
|
||||
If you include these functions, they will be called:
|
||||
|
||||
.. py:function:: extend_parser(optparse_parser)
|
||||
|
||||
You can add or remove options from the parser here.
|
||||
|
||||
.. py:function:: adjust_options(options, args)
|
||||
|
||||
You can change options here, or change the args (if you accept
|
||||
different kinds of arguments, be sure you modify ``args`` so it is
|
||||
only ``[DEST_DIR]``).
|
||||
|
||||
.. py:function:: after_install(options, home_dir)
|
||||
|
||||
After everything is installed, this function is called. This
|
||||
is probably the function you are most likely to use. An
|
||||
example would be::
|
||||
|
||||
def after_install(options, home_dir):
|
||||
if sys.platform == 'win32':
|
||||
bin = 'Scripts'
|
||||
else:
|
||||
bin = 'bin'
|
||||
subprocess.call([join(home_dir, bin, 'easy_install'),
|
||||
'MyPackage'])
|
||||
subprocess.call([join(home_dir, bin, 'my-package-script'),
|
||||
'setup', home_dir])
|
||||
|
||||
This example immediately installs a package, and runs a setup
|
||||
script from that package.
|
||||
|
||||
Bootstrap Example
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here's a more concrete example of how you could use this::
|
||||
|
||||
import virtualenv, textwrap
|
||||
output = virtualenv.create_bootstrap_script(textwrap.dedent("""
|
||||
import os, subprocess
|
||||
def after_install(options, home_dir):
|
||||
etc = join(home_dir, 'etc')
|
||||
if not os.path.exists(etc):
|
||||
os.makedirs(etc)
|
||||
subprocess.call([join(home_dir, 'bin', 'easy_install'),
|
||||
'BlogApplication'])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'make-config', 'BlogApplication',
|
||||
join(etc, 'blog.ini')])
|
||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
||||
'setup-app', join(etc, 'blog.ini')])
|
||||
"""))
|
||||
f = open('blog-bootstrap.py', 'w').write(output)
|
||||
|
||||
Another example is available `here`__.
|
||||
|
||||
.. __: https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py
|
@ -1,249 +0,0 @@
|
||||
User Guide
|
||||
==========
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Virtualenv has one basic command::
|
||||
|
||||
$ virtualenv ENV
|
||||
|
||||
Where ``ENV`` is a directory to place the new virtual environment. It has
|
||||
a number of usual effects (modifiable by many :ref:`options`):
|
||||
|
||||
- :file:`ENV/lib/` and :file:`ENV/include/` are created, containing supporting
|
||||
library files for a new virtualenv python. Packages installed in this
|
||||
environment will live under :file:`ENV/lib/pythonX.X/site-packages/`.
|
||||
|
||||
- :file:`ENV/bin` is created, where executables live - noticeably a new
|
||||
:command:`python`. Thus running a script with ``#! /path/to/ENV/bin/python``
|
||||
would run that script under this virtualenv's python.
|
||||
|
||||
- The crucial packages pip_ and setuptools_ are installed, which allow other
|
||||
packages to be easily installed to the environment. This associated pip
|
||||
can be run from :file:`ENV/bin/pip`.
|
||||
|
||||
The python in your new virtualenv is effectively isolated from the python that
|
||||
was used to create it.
|
||||
|
||||
.. _pip: https://pypi.python.org/pypi/pip
|
||||
.. _setuptools: https://pypi.python.org/pypi/setuptools
|
||||
|
||||
|
||||
.. _activate:
|
||||
|
||||
activate script
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
In a newly created virtualenv there will also be a :command:`activate` shell
|
||||
script. For Windows systems, activation scripts are provided for
|
||||
the Command Prompt and Powershell.
|
||||
|
||||
On Posix systems, this resides in :file:`/ENV/bin/`, so you can run::
|
||||
|
||||
$ source bin/activate
|
||||
|
||||
For some shells (e.g. the original Bourne Shell) you may need to use the
|
||||
:command:`.` command, when :command:`source` does not exist.
|
||||
|
||||
This will change your ``$PATH`` so its first entry is the virtualenv's
|
||||
``bin/`` directory. (You have to use ``source`` because it changes your
|
||||
shell environment in-place.) This is all it does; it's purely a
|
||||
convenience. If you directly run a script or the python interpreter
|
||||
from the virtualenv's ``bin/`` directory (e.g. ``path/to/ENV/bin/pip``
|
||||
or ``/path/to/ENV/bin/python-script.py``) there's no need for
|
||||
activation.
|
||||
|
||||
The ``activate`` script will also modify your shell prompt to indicate
|
||||
which environment is currently active. To disable this behaviour, see
|
||||
:envvar:`VIRTUAL_ENV_DISABLE_PROMPT`.
|
||||
|
||||
To undo these changes to your path (and prompt), just run::
|
||||
|
||||
$ deactivate
|
||||
|
||||
On Windows, the equivalent `activate` script is in the ``Scripts`` folder::
|
||||
|
||||
> \path\to\env\Scripts\activate
|
||||
|
||||
And type ``deactivate`` to undo the changes.
|
||||
|
||||
Based on your active shell (CMD.exe or Powershell.exe), Windows will use
|
||||
either activate.bat or activate.ps1 (as appropriate) to activate the
|
||||
virtual environment. If using Powershell, see the notes about code signing
|
||||
below.
|
||||
|
||||
.. note::
|
||||
|
||||
If using Powershell, the ``activate`` script is subject to the
|
||||
`execution policies`_ on the system. By default on Windows 7, the system's
|
||||
excution policy is set to ``Restricted``, meaning no scripts like the
|
||||
``activate`` script are allowed to be executed. But that can't stop us
|
||||
from changing that slightly to allow it to be executed.
|
||||
|
||||
In order to use the script, you can relax your system's execution
|
||||
policy to ``AllSigned``, meaning all scripts on the system must be
|
||||
digitally signed to be executed. Since the virtualenv activation
|
||||
script is signed by one of the authors (Jannis Leidel) this level of
|
||||
the execution policy suffices. As an administrator run::
|
||||
|
||||
PS C:\> Set-ExecutionPolicy AllSigned
|
||||
|
||||
Then you'll be asked to trust the signer, when executing the script.
|
||||
You will be prompted with the following::
|
||||
|
||||
PS C:\> virtualenv .\foo
|
||||
New python executable in C:\foo\Scripts\python.exe
|
||||
Installing setuptools................done.
|
||||
Installing pip...................done.
|
||||
PS C:\> .\foo\scripts\activate
|
||||
|
||||
Do you want to run software from this untrusted publisher?
|
||||
File C:\foo\scripts\activate.ps1 is published by E=jannis@leidel.info,
|
||||
CN=Jannis Leidel, L=Berlin, S=Berlin, C=DE, Description=581796-Gh7xfJxkxQSIO4E0
|
||||
and is not trusted on your system. Only run scripts from trusted publishers.
|
||||
[V] Never run [D] Do not run [R] Run once [A] Always run [?] Help
|
||||
(default is "D"):A
|
||||
(foo) PS C:\>
|
||||
|
||||
If you select ``[A] Always Run``, the certificate will be added to the
|
||||
Trusted Publishers of your user account, and will be trusted in this
|
||||
user's context henceforth. If you select ``[R] Run Once``, the script will
|
||||
be run, but you will be prometed on a subsequent invocation. Advanced users
|
||||
can add the signer's certificate to the Trusted Publishers of the Computer
|
||||
account to apply to all users (though this technique is out of scope of this
|
||||
document).
|
||||
|
||||
Alternatively, you may relax the system execution policy to allow running
|
||||
of local scripts without verifying the code signature using the following::
|
||||
|
||||
PS C:\> Set-ExecutionPolicy RemoteSigned
|
||||
|
||||
Since the ``activate.ps1`` script is generated locally for each virtualenv,
|
||||
it is not considered a remote script and can then be executed.
|
||||
|
||||
.. _`execution policies`: http://technet.microsoft.com/en-us/library/dd347641.aspx
|
||||
|
||||
The :option:`--system-site-packages` Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you build with ``virtualenv --system-site-packages ENV``, your virtual
|
||||
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
|
||||
(or wherever your global site-packages directory is).
|
||||
|
||||
This can be used if you have control over the global site-packages directory,
|
||||
and you want to depend on the packages there. If you want isolation from the
|
||||
global system, do not use this flag.
|
||||
|
||||
Windows Notes
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Some paths within the virtualenv are slightly different on Windows: scripts and
|
||||
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
|
||||
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
|
||||
|
||||
To create a virtualenv under a path with spaces in it on Windows, you'll need
|
||||
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
|
||||
|
||||
|
||||
Using Virtualenv without ``bin/python``
|
||||
---------------------------------------
|
||||
|
||||
Sometimes you can't or don't want to use the Python interpreter
|
||||
created by the virtualenv. For instance, in a `mod_python
|
||||
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
|
||||
environment, there is only one interpreter.
|
||||
|
||||
Luckily, it's easy. You must use the custom Python interpreter to
|
||||
*install* libraries. But to *use* libraries, you just have to be sure
|
||||
the path is correct. A script is available to correct the path. You
|
||||
can setup the environment like::
|
||||
|
||||
activate_this = '/path/to/env/bin/activate_this.py'
|
||||
execfile(activate_this, dict(__file__=activate_this))
|
||||
|
||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
||||
you to use an existing interpreter. Items in your environment will show up
|
||||
first on ``sys.path``, before global items. However, global items will
|
||||
always be accessible (as if the :option:`--system-site-packages` flag had been
|
||||
used in creating the environment, whether it was or not). Also, this cannot undo
|
||||
the activation of other environments, or modules that have been imported.
|
||||
You shouldn't try to, for instance, activate an environment before a web
|
||||
request; you should activate *one* environment as early as possible, and not
|
||||
do it again in that process.
|
||||
|
||||
Making Environments Relocatable
|
||||
-------------------------------
|
||||
|
||||
**Note:** this option is somewhat experimental, and there are probably
|
||||
caveats that have not yet been identified.
|
||||
|
||||
.. warning::
|
||||
|
||||
The ``--relocatable`` option currently has a number of issues,
|
||||
and is not guaranteed to work in all circumstances. It is possible
|
||||
that the option will be deprecated in a future version of ``virtualenv``.
|
||||
|
||||
Normally environments are tied to a specific path. That means that
|
||||
you cannot move an environment around or copy it to another computer.
|
||||
You can fix up an environment to make it relocatable with the
|
||||
command::
|
||||
|
||||
$ virtualenv --relocatable ENV
|
||||
|
||||
This will make some of the files created by setuptools use relative paths,
|
||||
and will change all the scripts to use ``activate_this.py`` instead of using
|
||||
the location of the Python interpreter to select the environment.
|
||||
|
||||
**Note:** scripts which have been made relocatable will only work if
|
||||
the virtualenv is activated, specifically the python executable from
|
||||
the virtualenv must be the first one on the system PATH. Also note that
|
||||
the activate scripts are not currently made relocatable by
|
||||
``virtualenv --relocatable``.
|
||||
|
||||
**Note:** you must run this after you've installed *any* packages into
|
||||
the environment. If you make an environment relocatable, then
|
||||
install a new package, you must run ``virtualenv --relocatable``
|
||||
again.
|
||||
|
||||
Also, this **does not make your packages cross-platform**. You can
|
||||
move the directory around, but it can only be used on other similar
|
||||
computers. Some known environmental differences that can cause
|
||||
incompatibilities: a different version of Python, when one platform
|
||||
uses UCS2 for its internal unicode representation and another uses
|
||||
UCS4 (a compile-time option), obvious platform changes like Windows
|
||||
vs. Linux, or Intel vs. ARM, and if you have libraries that bind to C
|
||||
libraries on the system, if those C libraries are located somewhere
|
||||
different (either different versions, or a different filesystem
|
||||
layout).
|
||||
|
||||
If you use this flag to create an environment, currently, the
|
||||
:option:`--system-site-packages` option will be implied.
|
||||
|
||||
The :option:`--extra-search-dir` option
|
||||
---------------------------------------
|
||||
|
||||
This option allows you to provide your own versions of setuptools and/or
|
||||
pip to use instead of the embedded versions that come with virtualenv.
|
||||
|
||||
To use this feature, pass one or more ``--extra-search-dir`` options to
|
||||
virtualenv like this::
|
||||
|
||||
$ virtualenv --extra-search-dir=/path/to/distributions ENV
|
||||
|
||||
The ``/path/to/distributions`` path should point to a directory that contains
|
||||
setuptools and/or pip wheels.
|
||||
|
||||
virtualenv will look for wheels in the specified directories, but will use
|
||||
pip's standard algorithm for selecting the wheel to install, which looks for
|
||||
the latest compatible wheel.
|
||||
|
||||
As well as the extra directories, the search order includes:
|
||||
|
||||
#. The ``virtualenv_support`` directory relative to virtualenv.py
|
||||
#. The directory where virtualenv.py is located.
|
||||
#. The current directory.
|
||||
|
||||
If no satisfactory local distributions are found, virtualenv will
|
||||
fail. Virtualenv will never download packages.
|
@ -1,3 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
import virtualenv
|
||||
virtualenv.main()
|
@ -1,111 +0,0 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
|
||||
if sys.version_info[:2] < (2, 6):
|
||||
sys.exit('virtualenv requires Python 2.6 or higher.')
|
||||
|
||||
try:
|
||||
from setuptools import setup
|
||||
from setuptools.command.test import test as TestCommand
|
||||
|
||||
class PyTest(TestCommand):
|
||||
user_options = [('pytest-args=', 'a', "Arguments to pass to py.test")]
|
||||
|
||||
def initialize_options(self):
|
||||
TestCommand.initialize_options(self)
|
||||
self.pytest_args = None
|
||||
|
||||
def finalize_options(self):
|
||||
TestCommand.finalize_options(self)
|
||||
self.test_args = []
|
||||
self.test_suite = True
|
||||
|
||||
def run_tests(self):
|
||||
# import here, because outside the eggs aren't loaded
|
||||
import pytest
|
||||
errno = pytest.main(self.pytest_args)
|
||||
sys.exit(errno)
|
||||
|
||||
setup_params = {
|
||||
'entry_points': {
|
||||
'console_scripts': [
|
||||
'virtualenv=virtualenv:main',
|
||||
'virtualenv-%s.%s=virtualenv:main' % sys.version_info[:2]
|
||||
],
|
||||
},
|
||||
'zip_safe': False,
|
||||
'cmdclass': {'test': PyTest},
|
||||
'tests_require': ['pytest', 'mock'],
|
||||
}
|
||||
except ImportError:
|
||||
from distutils.core import setup
|
||||
if sys.platform == 'win32':
|
||||
print('Note: without Setuptools installed you will '
|
||||
'have to use "python -m virtualenv ENV"')
|
||||
setup_params = {}
|
||||
else:
|
||||
script = 'scripts/virtualenv'
|
||||
script_ver = script + '-%s.%s' % sys.version_info[:2]
|
||||
shutil.copy(script, script_ver)
|
||||
setup_params = {'scripts': [script, script_ver]}
|
||||
|
||||
|
||||
def read_file(*paths):
|
||||
here = os.path.dirname(os.path.abspath(__file__))
|
||||
with open(os.path.join(here, *paths)) as f:
|
||||
return f.read()
|
||||
|
||||
# Get long_description from index.rst:
|
||||
long_description = read_file('docs', 'index.rst')
|
||||
long_description = long_description.strip().split('split here', 1)[0]
|
||||
# Add release history
|
||||
long_description += "\n\n" + read_file('docs', 'changes.rst')
|
||||
|
||||
|
||||
def get_version():
|
||||
version_file = read_file('virtualenv.py')
|
||||
version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
|
||||
version_file, re.M)
|
||||
if version_match:
|
||||
return version_match.group(1)
|
||||
raise RuntimeError("Unable to find version string.")
|
||||
|
||||
|
||||
# Hack to prevent stupid TypeError: 'NoneType' object is not callable error on
|
||||
# exit of python setup.py test # in multiprocessing/util.py _exit_function when
|
||||
# running python setup.py test (see
|
||||
# http://www.eby-sarna.com/pipermail/peak/2010-May/003357.html)
|
||||
try:
|
||||
import multiprocessing # noqa
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
setup(
|
||||
name='virtualenv',
|
||||
version=get_version(),
|
||||
description="Virtual Python Environment builder",
|
||||
long_description=long_description,
|
||||
classifiers=[
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Intended Audience :: Developers',
|
||||
'License :: OSI Approved :: MIT License',
|
||||
'Programming Language :: Python :: 2',
|
||||
'Programming Language :: Python :: 2.6',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.1',
|
||||
'Programming Language :: Python :: 3.2',
|
||||
],
|
||||
keywords='setuptools deployment installation distutils',
|
||||
author='Ian Bicking',
|
||||
author_email='ianb@colorstudy.com',
|
||||
maintainer='Jannis Leidel, Carl Meyer and Brian Rosner',
|
||||
maintainer_email='python-virtualenv@groups.google.com',
|
||||
url='https://virtualenv.pypa.io/',
|
||||
license='MIT',
|
||||
py_modules=['virtualenv'],
|
||||
packages=['virtualenv_support'],
|
||||
package_data={'virtualenv_support': ['*.whl']},
|
||||
**setup_params)
|
@ -1,94 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
ROOT="$(dirname $0)/.."
|
||||
VIRTUALENV="${ROOT}/virtualenv.py"
|
||||
TESTENV="/tmp/test_virtualenv_activate.venv"
|
||||
|
||||
rm -rf ${TESTENV}
|
||||
|
||||
echo "$0: Creating virtualenv ${TESTENV}..." 1>&2
|
||||
|
||||
${VIRTUALENV} ${TESTENV} | tee ${ROOT}/tests/test_activate_actual.output
|
||||
if ! diff ${ROOT}/tests/test_activate_expected.output ${ROOT}/tests/test_activate_actual.output; then
|
||||
echo "$0: Failed to get expected output from ${VIRTUALENV}!" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$0: Created virtualenv ${TESTENV}." 1>&2
|
||||
|
||||
echo "$0: Activating ${TESTENV}..." 1>&2
|
||||
. ${TESTENV}/bin/activate
|
||||
echo "$0: Activated ${TESTENV}." 1>&2
|
||||
|
||||
echo "$0: Checking value of \$VIRTUAL_ENV..." 1>&2
|
||||
|
||||
if [ "$VIRTUAL_ENV" != "${TESTENV}" ]; then
|
||||
echo "$0: Expected \$VIRTUAL_ENV to be set to \"${TESTENV}\"; actual value: \"${VIRTUAL_ENV}\"!" 1>&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "$0: \$VIRTUAL_ENV = \"${VIRTUAL_ENV}\" -- OK." 1>&2
|
||||
|
||||
echo "$0: Checking output of \$(which python)..." 1>&2
|
||||
|
||||
if [ "$(which python)" != "${TESTENV}/bin/python" ]; then
|
||||
echo "$0: Expected \$(which python) to return \"${TESTENV}/bin/python\"; actual value: \"$(which python)\"!" 1>&2
|
||||
exit 3
|
||||
fi
|
||||
|
||||
echo "$0: Output of \$(which python) is OK." 1>&2
|
||||
|
||||
echo "$0: Checking output of \$(which pip)..." 1>&2
|
||||
|
||||
if [ "$(which pip)" != "${TESTENV}/bin/pip" ]; then
|
||||
echo "$0: Expected \$(which pip) to return \"${TESTENV}/bin/pip\"; actual value: \"$(which pip)\"!" 1>&2
|
||||
exit 4
|
||||
fi
|
||||
|
||||
echo "$0: Output of \$(which pip) is OK." 1>&2
|
||||
|
||||
echo "$0: Checking output of \$(which easy_install)..." 1>&2
|
||||
|
||||
if [ "$(which easy_install)" != "${TESTENV}/bin/easy_install" ]; then
|
||||
echo "$0: Expected \$(which easy_install) to return \"${TESTENV}/bin/easy_install\"; actual value: \"$(which easy_install)\"!" 1>&2
|
||||
exit 5
|
||||
fi
|
||||
|
||||
echo "$0: Output of \$(which easy_install) is OK." 1>&2
|
||||
|
||||
echo "$0: Executing a simple Python program..." 1>&2
|
||||
|
||||
TESTENV=${TESTENV} python <<__END__
|
||||
import os, sys
|
||||
|
||||
expected_site_packages = os.path.join(os.environ['TESTENV'], 'lib','python%s' % sys.version[:3], 'site-packages')
|
||||
site_packages = os.path.join(os.environ['VIRTUAL_ENV'], 'lib', 'python%s' % sys.version[:3], 'site-packages')
|
||||
|
||||
assert site_packages == expected_site_packages, 'site_packages did not have expected value; actual value: %r' % site_packages
|
||||
|
||||
open(os.path.join(site_packages, 'pydoc_test.py'), 'w').write('"""This is pydoc_test.py"""\n')
|
||||
__END__
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "$0: Python script failed!" 1>&2
|
||||
exit 6
|
||||
fi
|
||||
|
||||
echo "$0: Execution of a simple Python program -- OK." 1>&2
|
||||
|
||||
echo "$0: Testing pydoc..." 1>&2
|
||||
|
||||
if ! PAGER=cat pydoc pydoc_test | grep 'This is pydoc_test.py' > /dev/null; then
|
||||
echo "$0: pydoc test failed!" 1>&2
|
||||
exit 7
|
||||
fi
|
||||
|
||||
echo "$0: pydoc is OK." 1>&2
|
||||
|
||||
echo "$0: Deactivating ${TESTENV}..." 1>&2
|
||||
deactivate
|
||||
echo "$0: Deactivated ${TESTENV}." 1>&2
|
||||
echo "$0: OK!" 1>&2
|
||||
|
||||
rm -rf ${TESTENV}
|
||||
|
@ -1,2 +0,0 @@
|
||||
New python executable in /tmp/test_virtualenv_activate.venv/bin/python
|
||||
Installing setuptools, pip...done.
|
@ -1,139 +0,0 @@
|
||||
import virtualenv
|
||||
import optparse
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
from mock import patch, Mock
|
||||
|
||||
|
||||
def test_version():
|
||||
"""Should have a version string"""
|
||||
assert virtualenv.virtualenv_version, "Should have version"
|
||||
|
||||
|
||||
@patch('os.path.exists')
|
||||
def test_resolve_interpreter_with_absolute_path(mock_exists):
|
||||
"""Should return absolute path if given and exists"""
|
||||
mock_exists.return_value = True
|
||||
virtualenv.is_executable = Mock(return_value=True)
|
||||
|
||||
exe = virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||
|
||||
assert exe == "/usr/bin/python42", "Absolute path should return as is"
|
||||
mock_exists.assert_called_with("/usr/bin/python42")
|
||||
virtualenv.is_executable.assert_called_with("/usr/bin/python42")
|
||||
|
||||
|
||||
@patch('os.path.exists')
|
||||
def test_resolve_interpreter_with_nonexistent_interpreter(mock_exists):
|
||||
"""Should exit when with absolute path if not exists"""
|
||||
mock_exists.return_value = False
|
||||
|
||||
try:
|
||||
virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||
assert False, "Should raise exception"
|
||||
except SystemExit:
|
||||
pass
|
||||
|
||||
mock_exists.assert_called_with("/usr/bin/python42")
|
||||
|
||||
|
||||
@patch('os.path.exists')
|
||||
def test_resolve_interpreter_with_invalid_interpreter(mock_exists):
|
||||
"""Should exit when with absolute path if not exists"""
|
||||
mock_exists.return_value = True
|
||||
virtualenv.is_executable = Mock(return_value=False)
|
||||
|
||||
try:
|
||||
virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||
assert False, "Should raise exception"
|
||||
except SystemExit:
|
||||
pass
|
||||
|
||||
mock_exists.assert_called_with("/usr/bin/python42")
|
||||
virtualenv.is_executable.assert_called_with("/usr/bin/python42")
|
||||
|
||||
|
||||
def test_activate_after_future_statements():
|
||||
"""Should insert activation line after last future statement"""
|
||||
script = [
|
||||
'#!/usr/bin/env python',
|
||||
'from __future__ import with_statement',
|
||||
'from __future__ import print_function',
|
||||
'print("Hello, world!")'
|
||||
]
|
||||
assert virtualenv.relative_script(script) == [
|
||||
'#!/usr/bin/env python',
|
||||
'from __future__ import with_statement',
|
||||
'from __future__ import print_function',
|
||||
'',
|
||||
"import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); exec(compile(open(activate_this).read(), activate_this, 'exec'), dict(__file__=activate_this)); del os, activate_this",
|
||||
'',
|
||||
'print("Hello, world!")'
|
||||
]
|
||||
|
||||
|
||||
def test_cop_update_defaults_with_store_false():
|
||||
"""store_false options need reverted logic"""
|
||||
class MyConfigOptionParser(virtualenv.ConfigOptionParser):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.config = virtualenv.ConfigParser.RawConfigParser()
|
||||
self.files = []
|
||||
optparse.OptionParser.__init__(self, *args, **kwargs)
|
||||
|
||||
def get_environ_vars(self, prefix='VIRTUALENV_'):
|
||||
yield ("no_site_packages", "1")
|
||||
|
||||
cop = MyConfigOptionParser()
|
||||
cop.add_option(
|
||||
'--no-site-packages',
|
||||
dest='system_site_packages',
|
||||
action='store_false',
|
||||
help="Don't give access to the global site-packages dir to the "
|
||||
"virtual environment (default)")
|
||||
|
||||
defaults = {}
|
||||
cop.update_defaults(defaults)
|
||||
assert defaults == {'system_site_packages': 0}
|
||||
|
||||
def test_install_python_bin():
|
||||
"""Should create the right python executables and links"""
|
||||
tmp_virtualenv = tempfile.mkdtemp()
|
||||
try:
|
||||
home_dir, lib_dir, inc_dir, bin_dir = \
|
||||
virtualenv.path_locations(tmp_virtualenv)
|
||||
virtualenv.install_python(home_dir, lib_dir, inc_dir, bin_dir, False,
|
||||
False)
|
||||
|
||||
if virtualenv.is_win:
|
||||
required_executables = [ 'python.exe', 'pythonw.exe']
|
||||
else:
|
||||
py_exe_no_version = 'python'
|
||||
py_exe_version_major = 'python%s' % sys.version_info[0]
|
||||
py_exe_version_major_minor = 'python%s.%s' % (
|
||||
sys.version_info[0], sys.version_info[1])
|
||||
required_executables = [ py_exe_no_version, py_exe_version_major,
|
||||
py_exe_version_major_minor ]
|
||||
|
||||
for pth in required_executables:
|
||||
assert os.path.exists(os.path.join(bin_dir, pth)), ("%s should "
|
||||
"exist in bin_dir" % pth)
|
||||
finally:
|
||||
shutil.rmtree(tmp_virtualenv)
|
||||
|
||||
|
||||
def test_always_copy_option():
|
||||
"""Should be no symlinks in directory tree"""
|
||||
tmp_virtualenv = tempfile.mkdtemp()
|
||||
ve_path = os.path.join(tmp_virtualenv, 'venv')
|
||||
try:
|
||||
virtualenv.create_environment(ve_path, symlink=False)
|
||||
|
||||
for root, dirs, files in os.walk(tmp_virtualenv):
|
||||
for f in files + dirs:
|
||||
full_name = os.path.join(root, f)
|
||||
assert not os.path.islink(full_name), "%s should not be a" \
|
||||
" symlink (to %s)" % (full_name, os.readlink(full_name))
|
||||
finally:
|
||||
shutil.rmtree(tmp_virtualenv)
|
@ -1,12 +0,0 @@
|
||||
# Tox (http://codespeak.net/~hpk/tox/) is a tool for running tests
|
||||
# in multiple virtualenvs. This configuration file will run the
|
||||
# test suite on all supported python versions. To use it, "pip install tox"
|
||||
# and then run "tox" from this directory.
|
||||
|
||||
[tox]
|
||||
envlist = py25, py26, py27, py31, py32, pypy, jython
|
||||
setupdir = ..
|
||||
|
||||
[testenv]
|
||||
commands = python setup.py test
|
||||
changedir = ..
|
@ -1,17 +0,0 @@
|
||||
[tox]
|
||||
envlist =
|
||||
py26,py27,py32,py33,py34,pypy,pypy3,docs
|
||||
|
||||
[testenv]
|
||||
deps =
|
||||
mock
|
||||
pytest
|
||||
commands =
|
||||
py.test []
|
||||
python virtualenv.py {envtmpdir}/test-venv-01
|
||||
|
||||
[testenv:docs]
|
||||
deps = sphinx
|
||||
basepython = python2.7
|
||||
commands =
|
||||
sphinx-build -W -b html -d {envtmpdir}/doctrees docs docs/_build/html
|
File diff suppressed because it is too large
Load Diff
@ -1,26 +0,0 @@
|
||||
@echo off
|
||||
set "VIRTUAL_ENV=__VIRTUAL_ENV__"
|
||||
|
||||
if defined _OLD_VIRTUAL_PROMPT (
|
||||
set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
|
||||
) else (
|
||||
if not defined PROMPT (
|
||||
set "PROMPT=$P$G"
|
||||
)
|
||||
set "_OLD_VIRTUAL_PROMPT=%PROMPT%"
|
||||
)
|
||||
set "PROMPT=__VIRTUAL_WINPROMPT__ %PROMPT%"
|
||||
|
||||
if not defined _OLD_VIRTUAL_PYTHONHOME (
|
||||
set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%"
|
||||
)
|
||||
set PYTHONHOME=
|
||||
|
||||
if defined _OLD_VIRTUAL_PATH (
|
||||
set "PATH=%_OLD_VIRTUAL_PATH%"
|
||||
) else (
|
||||
set "_OLD_VIRTUAL_PATH=%PATH%"
|
||||
)
|
||||
set "PATH=%VIRTUAL_ENV%\__BIN_NAME__;%PATH%"
|
||||
|
||||
:END
|
@ -1,42 +0,0 @@
|
||||
# This file must be used with "source bin/activate.csh" *from csh*.
|
||||
# You cannot run it directly.
|
||||
# Created by Davide Di Blasi <davidedb@gmail.com>.
|
||||
|
||||
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc'
|
||||
|
||||
# Unset irrelevant variables.
|
||||
deactivate nondestructive
|
||||
|
||||
setenv VIRTUAL_ENV "__VIRTUAL_ENV__"
|
||||
|
||||
set _OLD_VIRTUAL_PATH="$PATH"
|
||||
setenv PATH "$VIRTUAL_ENV/__BIN_NAME__:$PATH"
|
||||
|
||||
|
||||
|
||||
if ("__VIRTUAL_PROMPT__" != "") then
|
||||
set env_name = "__VIRTUAL_PROMPT__"
|
||||
else
|
||||
if (`basename "$VIRTUAL_ENV"` == "__") then
|
||||
# special case for Aspen magic directories
|
||||
# see http://www.zetadev.com/software/aspen/
|
||||
set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
|
||||
else
|
||||
set env_name = `basename "$VIRTUAL_ENV"`
|
||||
endif
|
||||
endif
|
||||
|
||||
# Could be in a non-interactive environment,
|
||||
# in which case, $prompt is undefined and we wouldn't
|
||||
# care about the prompt anyway.
|
||||
if ( $?prompt ) then
|
||||
set _OLD_VIRTUAL_PROMPT="$prompt"
|
||||
set prompt = "[$env_name] $prompt"
|
||||
endif
|
||||
|
||||
unset env_name
|
||||
|
||||
alias pydoc python -m pydoc
|
||||
|
||||
rehash
|
||||
|
@ -1,74 +0,0 @@
|
||||
# This file must be used with "source bin/activate.fish" *from fish* (http://fishshell.com)
|
||||
# you cannot run it directly
|
||||
|
||||
function deactivate -d "Exit virtualenv and return to normal shell environment"
|
||||
# reset old environment variables
|
||||
if test -n "$_OLD_VIRTUAL_PATH"
|
||||
set -gx PATH $_OLD_VIRTUAL_PATH
|
||||
set -e _OLD_VIRTUAL_PATH
|
||||
end
|
||||
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
|
||||
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
|
||||
set -e _OLD_VIRTUAL_PYTHONHOME
|
||||
end
|
||||
|
||||
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
|
||||
# set an empty local fish_function_path, so fish_prompt doesn't automatically reload
|
||||
set -l fish_function_path
|
||||
# erase the virtualenv's fish_prompt function, and restore the original
|
||||
functions -e fish_prompt
|
||||
functions -c _old_fish_prompt fish_prompt
|
||||
functions -e _old_fish_prompt
|
||||
set -e _OLD_FISH_PROMPT_OVERRIDE
|
||||
end
|
||||
|
||||
set -e VIRTUAL_ENV
|
||||
if test "$argv[1]" != "nondestructive"
|
||||
# Self destruct!
|
||||
functions -e deactivate
|
||||
end
|
||||
end
|
||||
|
||||
# unset irrelevant variables
|
||||
deactivate nondestructive
|
||||
|
||||
set -gx VIRTUAL_ENV "__VIRTUAL_ENV__"
|
||||
|
||||
set -gx _OLD_VIRTUAL_PATH $PATH
|
||||
set -gx PATH "$VIRTUAL_ENV/__BIN_NAME__" $PATH
|
||||
|
||||
# unset PYTHONHOME if set
|
||||
if set -q PYTHONHOME
|
||||
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
||||
set -e PYTHONHOME
|
||||
end
|
||||
|
||||
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
||||
# fish uses a function instead of an env var to generate the prompt.
|
||||
|
||||
# copy the current fish_prompt function as the function _old_fish_prompt
|
||||
functions -c fish_prompt _old_fish_prompt
|
||||
|
||||
# with the original prompt function copied, we can override with our own.
|
||||
function fish_prompt
|
||||
# Prompt override?
|
||||
if test -n "__VIRTUAL_PROMPT__"
|
||||
printf "%s%s" "__VIRTUAL_PROMPT__" (set_color normal)
|
||||
_old_fish_prompt
|
||||
return
|
||||
end
|
||||
# ...Otherwise, prepend env
|
||||
set -l _checkbase (basename "$VIRTUAL_ENV")
|
||||
if test $_checkbase = "__"
|
||||
# special case for Aspen magic directories
|
||||
# see http://www.zetadev.com/software/aspen/
|
||||
printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
|
||||
_old_fish_prompt
|
||||
else
|
||||
printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
|
||||
_old_fish_prompt
|
||||
end
|
||||
end
|
||||
|
||||
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
||||
end
|
@ -1,80 +0,0 @@
|
||||
# This file must be used with "source bin/activate" *from bash*
|
||||
# you cannot run it directly
|
||||
|
||||
deactivate () {
|
||||
unset pydoc
|
||||
|
||||
# reset old environment variables
|
||||
if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
|
||||
PATH="$_OLD_VIRTUAL_PATH"
|
||||
export PATH
|
||||
unset _OLD_VIRTUAL_PATH
|
||||
fi
|
||||
if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
|
||||
PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
|
||||
export PYTHONHOME
|
||||
unset _OLD_VIRTUAL_PYTHONHOME
|
||||
fi
|
||||
|
||||
# This should detect bash and zsh, which have a hash command that must
|
||||
# be called to get it to forget past commands. Without forgetting
|
||||
# past commands the $PATH changes we made may not be respected
|
||||
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
|
||||
hash -r 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
|
||||
PS1="$_OLD_VIRTUAL_PS1"
|
||||
export PS1
|
||||
unset _OLD_VIRTUAL_PS1
|
||||
fi
|
||||
|
||||
unset VIRTUAL_ENV
|
||||
if [ ! "$1" = "nondestructive" ] ; then
|
||||
# Self destruct!
|
||||
unset -f deactivate
|
||||
fi
|
||||
}
|
||||
|
||||
# unset irrelevant variables
|
||||
deactivate nondestructive
|
||||
|
||||
VIRTUAL_ENV="__VIRTUAL_ENV__"
|
||||
export VIRTUAL_ENV
|
||||
|
||||
_OLD_VIRTUAL_PATH="$PATH"
|
||||
PATH="$VIRTUAL_ENV/__BIN_NAME__:$PATH"
|
||||
export PATH
|
||||
|
||||
# unset PYTHONHOME if set
|
||||
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
||||
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
||||
if [ -n "$PYTHONHOME" ] ; then
|
||||
_OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
|
||||
unset PYTHONHOME
|
||||
fi
|
||||
|
||||
if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
|
||||
_OLD_VIRTUAL_PS1="$PS1"
|
||||
if [ "x__VIRTUAL_PROMPT__" != x ] ; then
|
||||
PS1="__VIRTUAL_PROMPT__$PS1"
|
||||
else
|
||||
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
|
||||
# special case for Aspen magic directories
|
||||
# see http://www.zetadev.com/software/aspen/
|
||||
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
|
||||
else
|
||||
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
|
||||
fi
|
||||
fi
|
||||
export PS1
|
||||
fi
|
||||
|
||||
alias pydoc="python -m pydoc"
|
||||
|
||||
# This should detect bash and zsh, which have a hash command that must
|
||||
# be called to get it to forget past commands. Without forgetting
|
||||
# past commands the $PATH changes we made may not be respected
|
||||
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
|
||||
hash -r 2>/dev/null
|
||||
fi
|
@ -1,34 +0,0 @@
|
||||
"""By using execfile(this_file, dict(__file__=this_file)) you will
|
||||
activate this virtualenv environment.
|
||||
|
||||
This can be used when you must use an existing Python interpreter, not
|
||||
the virtualenv bin/python
|
||||
"""
|
||||
|
||||
try:
|
||||
__file__
|
||||
except NameError:
|
||||
raise AssertionError(
|
||||
"You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))")
|
||||
import sys
|
||||
import os
|
||||
|
||||
old_os_path = os.environ.get('PATH', '')
|
||||
os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
|
||||
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
if sys.platform == 'win32':
|
||||
site_packages = os.path.join(base, 'Lib', 'site-packages')
|
||||
else:
|
||||
site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
|
||||
prev_sys_path = list(sys.path)
|
||||
import site
|
||||
site.addsitedir(site_packages)
|
||||
sys.real_prefix = sys.prefix
|
||||
sys.prefix = base
|
||||
# Move the added items to the front of the path:
|
||||
new_sys_path = []
|
||||
for item in list(sys.path):
|
||||
if item not in prev_sys_path:
|
||||
new_sys_path.append(item)
|
||||
sys.path.remove(item)
|
||||
sys.path[:0] = new_sys_path
|
@ -1,20 +0,0 @@
|
||||
@echo off
|
||||
|
||||
set VIRTUAL_ENV=
|
||||
|
||||
if defined _OLD_VIRTUAL_PROMPT (
|
||||
set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
|
||||
set _OLD_VIRTUAL_PROMPT=
|
||||
)
|
||||
|
||||
if defined _OLD_VIRTUAL_PYTHONHOME (
|
||||
set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
|
||||
set _OLD_VIRTUAL_PYTHONHOME=
|
||||
)
|
||||
|
||||
if defined _OLD_VIRTUAL_PATH (
|
||||
set "PATH=%_OLD_VIRTUAL_PATH%"
|
||||
set _OLD_VIRTUAL_PATH=
|
||||
)
|
||||
|
||||
:END
|
@ -1,101 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
import warnings
|
||||
import imp
|
||||
import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib
|
||||
# Important! To work on pypy, this must be a module that resides in the
|
||||
# lib-python/modified-x.y.z directory
|
||||
|
||||
dirname = os.path.dirname
|
||||
|
||||
distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')
|
||||
if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)):
|
||||
warnings.warn(
|
||||
"The virtualenv distutils package at %s appears to be in the same location as the system distutils?")
|
||||
else:
|
||||
__path__.insert(0, distutils_path)
|
||||
real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY))
|
||||
# Copy the relevant attributes
|
||||
try:
|
||||
__revision__ = real_distutils.__revision__
|
||||
except AttributeError:
|
||||
pass
|
||||
__version__ = real_distutils.__version__
|
||||
|
||||
from distutils import dist, sysconfig
|
||||
|
||||
try:
|
||||
basestring
|
||||
except NameError:
|
||||
basestring = str
|
||||
|
||||
## patch build_ext (distutils doesn't know how to get the libs directory
|
||||
## path on windows - it hardcodes the paths around the patched sys.prefix)
|
||||
|
||||
if sys.platform == 'win32':
|
||||
from distutils.command.build_ext import build_ext as old_build_ext
|
||||
class build_ext(old_build_ext):
|
||||
def finalize_options (self):
|
||||
if self.library_dirs is None:
|
||||
self.library_dirs = []
|
||||
elif isinstance(self.library_dirs, basestring):
|
||||
self.library_dirs = self.library_dirs.split(os.pathsep)
|
||||
|
||||
self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs"))
|
||||
old_build_ext.finalize_options(self)
|
||||
|
||||
from distutils.command import build_ext as build_ext_module
|
||||
build_ext_module.build_ext = build_ext
|
||||
|
||||
## distutils.dist patches:
|
||||
|
||||
old_find_config_files = dist.Distribution.find_config_files
|
||||
def find_config_files(self):
|
||||
found = old_find_config_files(self)
|
||||
system_distutils = os.path.join(distutils_path, 'distutils.cfg')
|
||||
#if os.path.exists(system_distutils):
|
||||
# found.insert(0, system_distutils)
|
||||
# What to call the per-user config file
|
||||
if os.name == 'posix':
|
||||
user_filename = ".pydistutils.cfg"
|
||||
else:
|
||||
user_filename = "pydistutils.cfg"
|
||||
user_filename = os.path.join(sys.prefix, user_filename)
|
||||
if os.path.isfile(user_filename):
|
||||
for item in list(found):
|
||||
if item.endswith('pydistutils.cfg'):
|
||||
found.remove(item)
|
||||
found.append(user_filename)
|
||||
return found
|
||||
dist.Distribution.find_config_files = find_config_files
|
||||
|
||||
## distutils.sysconfig patches:
|
||||
|
||||
old_get_python_inc = sysconfig.get_python_inc
|
||||
def sysconfig_get_python_inc(plat_specific=0, prefix=None):
|
||||
if prefix is None:
|
||||
prefix = sys.real_prefix
|
||||
return old_get_python_inc(plat_specific, prefix)
|
||||
sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__
|
||||
sysconfig.get_python_inc = sysconfig_get_python_inc
|
||||
|
||||
old_get_python_lib = sysconfig.get_python_lib
|
||||
def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
||||
if standard_lib and prefix is None:
|
||||
prefix = sys.real_prefix
|
||||
return old_get_python_lib(plat_specific, standard_lib, prefix)
|
||||
sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__
|
||||
sysconfig.get_python_lib = sysconfig_get_python_lib
|
||||
|
||||
old_get_config_vars = sysconfig.get_config_vars
|
||||
def sysconfig_get_config_vars(*args):
|
||||
real_vars = old_get_config_vars(*args)
|
||||
if sys.platform == 'win32':
|
||||
lib_dir = os.path.join(sys.real_prefix, "libs")
|
||||
if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars:
|
||||
real_vars['LIBDIR'] = lib_dir # asked for all
|
||||
elif isinstance(real_vars, list) and 'LIBDIR' in args:
|
||||
real_vars = real_vars + [lib_dir] # asked for list
|
||||
return real_vars
|
||||
sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__
|
||||
sysconfig.get_config_vars = sysconfig_get_config_vars
|
@ -1,6 +0,0 @@
|
||||
# This is a config file local to this virtualenv installation
|
||||
# You may include options that will be used by all distutils commands,
|
||||
# and by easy_install. For instance:
|
||||
#
|
||||
# [easy_install]
|
||||
# find_links = http://mylocalsite
|
@ -1,758 +0,0 @@
|
||||
"""Append module search paths for third-party packages to sys.path.
|
||||
|
||||
****************************************************************
|
||||
* This module is automatically imported during initialization. *
|
||||
****************************************************************
|
||||
|
||||
In earlier versions of Python (up to 1.5a3), scripts or modules that
|
||||
needed to use site-specific modules would place ``import site''
|
||||
somewhere near the top of their code. Because of the automatic
|
||||
import, this is no longer necessary (but code that does it still
|
||||
works).
|
||||
|
||||
This will append site-specific paths to the module search path. On
|
||||
Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
|
||||
appends lib/python<version>/site-packages as well as lib/site-python.
|
||||
It also supports the Debian convention of
|
||||
lib/python<version>/dist-packages. On other platforms (mainly Mac and
|
||||
Windows), it uses just sys.prefix (and sys.exec_prefix, if different,
|
||||
but this is unlikely). The resulting directories, if they exist, are
|
||||
appended to sys.path, and also inspected for path configuration files.
|
||||
|
||||
FOR DEBIAN, this sys.path is augmented with directories in /usr/local.
|
||||
Local addons go into /usr/local/lib/python<version>/site-packages
|
||||
(resp. /usr/local/lib/site-python), Debian addons install into
|
||||
/usr/{lib,share}/python<version>/dist-packages.
|
||||
|
||||
A path configuration file is a file whose name has the form
|
||||
<package>.pth; its contents are additional directories (one per line)
|
||||
to be added to sys.path. Non-existing directories (or
|
||||
non-directories) are never added to sys.path; no directory is added to
|
||||
sys.path more than once. Blank lines and lines beginning with
|
||||
'#' are skipped. Lines starting with 'import' are executed.
|
||||
|
||||
For example, suppose sys.prefix and sys.exec_prefix are set to
|
||||
/usr/local and there is a directory /usr/local/lib/python2.X/site-packages
|
||||
with three subdirectories, foo, bar and spam, and two path
|
||||
configuration files, foo.pth and bar.pth. Assume foo.pth contains the
|
||||
following:
|
||||
|
||||
# foo package configuration
|
||||
foo
|
||||
bar
|
||||
bletch
|
||||
|
||||
and bar.pth contains:
|
||||
|
||||
# bar package configuration
|
||||
bar
|
||||
|
||||
Then the following directories are added to sys.path, in this order:
|
||||
|
||||
/usr/local/lib/python2.X/site-packages/bar
|
||||
/usr/local/lib/python2.X/site-packages/foo
|
||||
|
||||
Note that bletch is omitted because it doesn't exist; bar precedes foo
|
||||
because bar.pth comes alphabetically before foo.pth; and spam is
|
||||
omitted because it is not mentioned in either path configuration file.
|
||||
|
||||
After these path manipulations, an attempt is made to import a module
|
||||
named sitecustomize, which can perform arbitrary additional
|
||||
site-specific customizations. If this import fails with an
|
||||
ImportError exception, it is silently ignored.
|
||||
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
try:
|
||||
import __builtin__ as builtins
|
||||
except ImportError:
|
||||
import builtins
|
||||
try:
|
||||
set
|
||||
except NameError:
|
||||
from sets import Set as set
|
||||
|
||||
# Prefixes for site-packages; add additional prefixes like /usr/local here
|
||||
PREFIXES = [sys.prefix, sys.exec_prefix]
|
||||
# Enable per user site-packages directory
|
||||
# set it to False to disable the feature or True to force the feature
|
||||
ENABLE_USER_SITE = None
|
||||
# for distutils.commands.install
|
||||
USER_SITE = None
|
||||
USER_BASE = None
|
||||
|
||||
_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32
|
||||
_is_pypy = hasattr(sys, 'pypy_version_info')
|
||||
_is_jython = sys.platform[:4] == 'java'
|
||||
if _is_jython:
|
||||
ModuleType = type(os)
|
||||
|
||||
def makepath(*paths):
|
||||
dir = os.path.join(*paths)
|
||||
if _is_jython and (dir == '__classpath__' or
|
||||
dir.startswith('__pyclasspath__')):
|
||||
return dir, dir
|
||||
dir = os.path.abspath(dir)
|
||||
return dir, os.path.normcase(dir)
|
||||
|
||||
def abs__file__():
|
||||
"""Set all module' __file__ attribute to an absolute path"""
|
||||
for m in sys.modules.values():
|
||||
if ((_is_jython and not isinstance(m, ModuleType)) or
|
||||
hasattr(m, '__loader__')):
|
||||
# only modules need the abspath in Jython. and don't mess
|
||||
# with a PEP 302-supplied __file__
|
||||
continue
|
||||
f = getattr(m, '__file__', None)
|
||||
if f is None:
|
||||
continue
|
||||
m.__file__ = os.path.abspath(f)
|
||||
|
||||
def removeduppaths():
|
||||
""" Remove duplicate entries from sys.path along with making them
|
||||
absolute"""
|
||||
# This ensures that the initial path provided by the interpreter contains
|
||||
# only absolute pathnames, even if we're running from the build directory.
|
||||
L = []
|
||||
known_paths = set()
|
||||
for dir in sys.path:
|
||||
# Filter out duplicate paths (on case-insensitive file systems also
|
||||
# if they only differ in case); turn relative paths into absolute
|
||||
# paths.
|
||||
dir, dircase = makepath(dir)
|
||||
if not dircase in known_paths:
|
||||
L.append(dir)
|
||||
known_paths.add(dircase)
|
||||
sys.path[:] = L
|
||||
return known_paths
|
||||
|
||||
# XXX This should not be part of site.py, since it is needed even when
|
||||
# using the -S option for Python. See http://www.python.org/sf/586680
|
||||
def addbuilddir():
|
||||
"""Append ./build/lib.<platform> in case we're running in the build dir
|
||||
(especially for Guido :-)"""
|
||||
from distutils.util import get_platform
|
||||
s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
|
||||
if hasattr(sys, 'gettotalrefcount'):
|
||||
s += '-pydebug'
|
||||
s = os.path.join(os.path.dirname(sys.path[-1]), s)
|
||||
sys.path.append(s)
|
||||
|
||||
def _init_pathinfo():
|
||||
"""Return a set containing all existing directory entries from sys.path"""
|
||||
d = set()
|
||||
for dir in sys.path:
|
||||
try:
|
||||
if os.path.isdir(dir):
|
||||
dir, dircase = makepath(dir)
|
||||
d.add(dircase)
|
||||
except TypeError:
|
||||
continue
|
||||
return d
|
||||
|
||||
def addpackage(sitedir, name, known_paths):
|
||||
"""Add a new path to known_paths by combining sitedir and 'name' or execute
|
||||
sitedir if it starts with 'import'"""
|
||||
if known_paths is None:
|
||||
_init_pathinfo()
|
||||
reset = 1
|
||||
else:
|
||||
reset = 0
|
||||
fullname = os.path.join(sitedir, name)
|
||||
try:
|
||||
f = open(fullname, "rU")
|
||||
except IOError:
|
||||
return
|
||||
try:
|
||||
for line in f:
|
||||
if line.startswith("#"):
|
||||
continue
|
||||
if line.startswith("import"):
|
||||
exec(line)
|
||||
continue
|
||||
line = line.rstrip()
|
||||
dir, dircase = makepath(sitedir, line)
|
||||
if not dircase in known_paths and os.path.exists(dir):
|
||||
sys.path.append(dir)
|
||||
known_paths.add(dircase)
|
||||
finally:
|
||||
f.close()
|
||||
if reset:
|
||||
known_paths = None
|
||||
return known_paths
|
||||
|
||||
def addsitedir(sitedir, known_paths=None):
|
||||
"""Add 'sitedir' argument to sys.path if missing and handle .pth files in
|
||||
'sitedir'"""
|
||||
if known_paths is None:
|
||||
known_paths = _init_pathinfo()
|
||||
reset = 1
|
||||
else:
|
||||
reset = 0
|
||||
sitedir, sitedircase = makepath(sitedir)
|
||||
if not sitedircase in known_paths:
|
||||
sys.path.append(sitedir) # Add path component
|
||||
try:
|
||||
names = os.listdir(sitedir)
|
||||
except os.error:
|
||||
return
|
||||
names.sort()
|
||||
for name in names:
|
||||
if name.endswith(os.extsep + "pth"):
|
||||
addpackage(sitedir, name, known_paths)
|
||||
if reset:
|
||||
known_paths = None
|
||||
return known_paths
|
||||
|
||||
def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix):
|
||||
"""Add site-packages (and possibly site-python) to sys.path"""
|
||||
prefixes = [os.path.join(sys_prefix, "local"), sys_prefix]
|
||||
if exec_prefix != sys_prefix:
|
||||
prefixes.append(os.path.join(exec_prefix, "local"))
|
||||
|
||||
for prefix in prefixes:
|
||||
if prefix:
|
||||
if sys.platform in ('os2emx', 'riscos') or _is_jython:
|
||||
sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
|
||||
elif _is_pypy:
|
||||
sitedirs = [os.path.join(prefix, 'site-packages')]
|
||||
elif sys.platform == 'darwin' and prefix == sys_prefix:
|
||||
|
||||
if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python
|
||||
|
||||
sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"),
|
||||
os.path.join(prefix, "Extras", "lib", "python")]
|
||||
|
||||
else: # any other Python distros on OSX work this way
|
||||
sitedirs = [os.path.join(prefix, "lib",
|
||||
"python" + sys.version[:3], "site-packages")]
|
||||
|
||||
elif os.sep == '/':
|
||||
sitedirs = [os.path.join(prefix,
|
||||
"lib",
|
||||
"python" + sys.version[:3],
|
||||
"site-packages"),
|
||||
os.path.join(prefix, "lib", "site-python"),
|
||||
os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
|
||||
lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
|
||||
if (os.path.exists(lib64_dir) and
|
||||
os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]):
|
||||
if _is_64bit:
|
||||
sitedirs.insert(0, lib64_dir)
|
||||
else:
|
||||
sitedirs.append(lib64_dir)
|
||||
try:
|
||||
# sys.getobjects only available in --with-pydebug build
|
||||
sys.getobjects
|
||||
sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
|
||||
except AttributeError:
|
||||
pass
|
||||
# Debian-specific dist-packages directories:
|
||||
sitedirs.append(os.path.join(prefix, "local/lib",
|
||||
"python" + sys.version[:3],
|
||||
"dist-packages"))
|
||||
if sys.version[0] == '2':
|
||||
sitedirs.append(os.path.join(prefix, "lib",
|
||||
"python" + sys.version[:3],
|
||||
"dist-packages"))
|
||||
else:
|
||||
sitedirs.append(os.path.join(prefix, "lib",
|
||||
"python" + sys.version[0],
|
||||
"dist-packages"))
|
||||
sitedirs.append(os.path.join(prefix, "lib", "dist-python"))
|
||||
else:
|
||||
sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
|
||||
if sys.platform == 'darwin':
|
||||
# for framework builds *only* we add the standard Apple
|
||||
# locations. Currently only per-user, but /Library and
|
||||
# /Network/Library could be added too
|
||||
if 'Python.framework' in prefix:
|
||||
home = os.environ.get('HOME')
|
||||
if home:
|
||||
sitedirs.append(
|
||||
os.path.join(home,
|
||||
'Library',
|
||||
'Python',
|
||||
sys.version[:3],
|
||||
'site-packages'))
|
||||
for sitedir in sitedirs:
|
||||
if os.path.isdir(sitedir):
|
||||
addsitedir(sitedir, known_paths)
|
||||
return None
|
||||
|
||||
def check_enableusersite():
|
||||
"""Check if user site directory is safe for inclusion
|
||||
|
||||
The function tests for the command line flag (including environment var),
|
||||
process uid/gid equal to effective uid/gid.
|
||||
|
||||
None: Disabled for security reasons
|
||||
False: Disabled by user (command line option)
|
||||
True: Safe and enabled
|
||||
"""
|
||||
if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False):
|
||||
return False
|
||||
|
||||
if hasattr(os, "getuid") and hasattr(os, "geteuid"):
|
||||
# check process uid == effective uid
|
||||
if os.geteuid() != os.getuid():
|
||||
return None
|
||||
if hasattr(os, "getgid") and hasattr(os, "getegid"):
|
||||
# check process gid == effective gid
|
||||
if os.getegid() != os.getgid():
|
||||
return None
|
||||
|
||||
return True
|
||||
|
||||
def addusersitepackages(known_paths):
|
||||
"""Add a per user site-package to sys.path
|
||||
|
||||
Each user has its own python directory with site-packages in the
|
||||
home directory.
|
||||
|
||||
USER_BASE is the root directory for all Python versions
|
||||
|
||||
USER_SITE is the user specific site-packages directory
|
||||
|
||||
USER_SITE/.. can be used for data.
|
||||
"""
|
||||
global USER_BASE, USER_SITE, ENABLE_USER_SITE
|
||||
env_base = os.environ.get("PYTHONUSERBASE", None)
|
||||
|
||||
def joinuser(*args):
|
||||
return os.path.expanduser(os.path.join(*args))
|
||||
|
||||
#if sys.platform in ('os2emx', 'riscos'):
|
||||
# # Don't know what to put here
|
||||
# USER_BASE = ''
|
||||
# USER_SITE = ''
|
||||
if os.name == "nt":
|
||||
base = os.environ.get("APPDATA") or "~"
|
||||
if env_base:
|
||||
USER_BASE = env_base
|
||||
else:
|
||||
USER_BASE = joinuser(base, "Python")
|
||||
USER_SITE = os.path.join(USER_BASE,
|
||||
"Python" + sys.version[0] + sys.version[2],
|
||||
"site-packages")
|
||||
else:
|
||||
if env_base:
|
||||
USER_BASE = env_base
|
||||
else:
|
||||
USER_BASE = joinuser("~", ".local")
|
||||
USER_SITE = os.path.join(USER_BASE, "lib",
|
||||
"python" + sys.version[:3],
|
||||
"site-packages")
|
||||
|
||||
if ENABLE_USER_SITE and os.path.isdir(USER_SITE):
|
||||
addsitedir(USER_SITE, known_paths)
|
||||
if ENABLE_USER_SITE:
|
||||
for dist_libdir in ("lib", "local/lib"):
|
||||
user_site = os.path.join(USER_BASE, dist_libdir,
|
||||
"python" + sys.version[:3],
|
||||
"dist-packages")
|
||||
if os.path.isdir(user_site):
|
||||
addsitedir(user_site, known_paths)
|
||||
return known_paths
|
||||
|
||||
|
||||
|
||||
def setBEGINLIBPATH():
|
||||
"""The OS/2 EMX port has optional extension modules that do double duty
|
||||
as DLLs (and must use the .DLL file extension) for other extensions.
|
||||
The library search path needs to be amended so these will be found
|
||||
during module import. Use BEGINLIBPATH so that these are at the start
|
||||
of the library search path.
|
||||
|
||||
"""
|
||||
dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
|
||||
libpath = os.environ['BEGINLIBPATH'].split(';')
|
||||
if libpath[-1]:
|
||||
libpath.append(dllpath)
|
||||
else:
|
||||
libpath[-1] = dllpath
|
||||
os.environ['BEGINLIBPATH'] = ';'.join(libpath)
|
||||
|
||||
|
||||
def setquit():
|
||||
"""Define new built-ins 'quit' and 'exit'.
|
||||
These are simply strings that display a hint on how to exit.
|
||||
|
||||
"""
|
||||
if os.sep == ':':
|
||||
eof = 'Cmd-Q'
|
||||
elif os.sep == '\\':
|
||||
eof = 'Ctrl-Z plus Return'
|
||||
else:
|
||||
eof = 'Ctrl-D (i.e. EOF)'
|
||||
|
||||
class Quitter(object):
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
def __repr__(self):
|
||||
return 'Use %s() or %s to exit' % (self.name, eof)
|
||||
def __call__(self, code=None):
|
||||
# Shells like IDLE catch the SystemExit, but listen when their
|
||||
# stdin wrapper is closed.
|
||||
try:
|
||||
sys.stdin.close()
|
||||
except:
|
||||
pass
|
||||
raise SystemExit(code)
|
||||
builtins.quit = Quitter('quit')
|
||||
builtins.exit = Quitter('exit')
|
||||
|
||||
|
||||
class _Printer(object):
|
||||
"""interactive prompt objects for printing the license text, a list of
|
||||
contributors and the copyright notice."""
|
||||
|
||||
MAXLINES = 23
|
||||
|
||||
def __init__(self, name, data, files=(), dirs=()):
|
||||
self.__name = name
|
||||
self.__data = data
|
||||
self.__files = files
|
||||
self.__dirs = dirs
|
||||
self.__lines = None
|
||||
|
||||
def __setup(self):
|
||||
if self.__lines:
|
||||
return
|
||||
data = None
|
||||
for dir in self.__dirs:
|
||||
for filename in self.__files:
|
||||
filename = os.path.join(dir, filename)
|
||||
try:
|
||||
fp = open(filename, "rU")
|
||||
data = fp.read()
|
||||
fp.close()
|
||||
break
|
||||
except IOError:
|
||||
pass
|
||||
if data:
|
||||
break
|
||||
if not data:
|
||||
data = self.__data
|
||||
self.__lines = data.split('\n')
|
||||
self.__linecnt = len(self.__lines)
|
||||
|
||||
def __repr__(self):
|
||||
self.__setup()
|
||||
if len(self.__lines) <= self.MAXLINES:
|
||||
return "\n".join(self.__lines)
|
||||
else:
|
||||
return "Type %s() to see the full %s text" % ((self.__name,)*2)
|
||||
|
||||
def __call__(self):
|
||||
self.__setup()
|
||||
prompt = 'Hit Return for more, or q (and Return) to quit: '
|
||||
lineno = 0
|
||||
while 1:
|
||||
try:
|
||||
for i in range(lineno, lineno + self.MAXLINES):
|
||||
print(self.__lines[i])
|
||||
except IndexError:
|
||||
break
|
||||
else:
|
||||
lineno += self.MAXLINES
|
||||
key = None
|
||||
while key is None:
|
||||
try:
|
||||
key = raw_input(prompt)
|
||||
except NameError:
|
||||
key = input(prompt)
|
||||
if key not in ('', 'q'):
|
||||
key = None
|
||||
if key == 'q':
|
||||
break
|
||||
|
||||
def setcopyright():
|
||||
"""Set 'copyright' and 'credits' in __builtin__"""
|
||||
builtins.copyright = _Printer("copyright", sys.copyright)
|
||||
if _is_jython:
|
||||
builtins.credits = _Printer(
|
||||
"credits",
|
||||
"Jython is maintained by the Jython developers (www.jython.org).")
|
||||
elif _is_pypy:
|
||||
builtins.credits = _Printer(
|
||||
"credits",
|
||||
"PyPy is maintained by the PyPy developers: http://pypy.org/")
|
||||
else:
|
||||
builtins.credits = _Printer("credits", """\
|
||||
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
|
||||
for supporting Python development. See www.python.org for more information.""")
|
||||
here = os.path.dirname(os.__file__)
|
||||
builtins.license = _Printer(
|
||||
"license", "See http://www.python.org/%.3s/license.html" % sys.version,
|
||||
["LICENSE.txt", "LICENSE"],
|
||||
[os.path.join(here, os.pardir), here, os.curdir])
|
||||
|
||||
|
||||
class _Helper(object):
|
||||
"""Define the built-in 'help'.
|
||||
This is a wrapper around pydoc.help (with a twist).
|
||||
|
||||
"""
|
||||
|
||||
def __repr__(self):
|
||||
return "Type help() for interactive help, " \
|
||||
"or help(object) for help about object."
|
||||
def __call__(self, *args, **kwds):
|
||||
import pydoc
|
||||
return pydoc.help(*args, **kwds)
|
||||
|
||||
def sethelper():
|
||||
builtins.help = _Helper()
|
||||
|
||||
def aliasmbcs():
|
||||
"""On Windows, some default encodings are not provided by Python,
|
||||
while they are always available as "mbcs" in each locale. Make
|
||||
them usable by aliasing to "mbcs" in such a case."""
|
||||
if sys.platform == 'win32':
|
||||
import locale, codecs
|
||||
enc = locale.getdefaultlocale()[1]
|
||||
if enc.startswith('cp'): # "cp***" ?
|
||||
try:
|
||||
codecs.lookup(enc)
|
||||
except LookupError:
|
||||
import encodings
|
||||
encodings._cache[enc] = encodings._unknown
|
||||
encodings.aliases.aliases[enc] = 'mbcs'
|
||||
|
||||
def setencoding():
|
||||
"""Set the string encoding used by the Unicode implementation. The
|
||||
default is 'ascii', but if you're willing to experiment, you can
|
||||
change this."""
|
||||
encoding = "ascii" # Default value set by _PyUnicode_Init()
|
||||
if 0:
|
||||
# Enable to support locale aware default string encodings.
|
||||
import locale
|
||||
loc = locale.getdefaultlocale()
|
||||
if loc[1]:
|
||||
encoding = loc[1]
|
||||
if 0:
|
||||
# Enable to switch off string to Unicode coercion and implicit
|
||||
# Unicode to string conversion.
|
||||
encoding = "undefined"
|
||||
if encoding != "ascii":
|
||||
# On Non-Unicode builds this will raise an AttributeError...
|
||||
sys.setdefaultencoding(encoding) # Needs Python Unicode build !
|
||||
|
||||
|
||||
def execsitecustomize():
|
||||
"""Run custom site specific code, if available."""
|
||||
try:
|
||||
import sitecustomize
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
def virtual_install_main_packages():
|
||||
f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt'))
|
||||
sys.real_prefix = f.read().strip()
|
||||
f.close()
|
||||
pos = 2
|
||||
hardcoded_relative_dirs = []
|
||||
if sys.path[0] == '':
|
||||
pos += 1
|
||||
if _is_jython:
|
||||
paths = [os.path.join(sys.real_prefix, 'Lib')]
|
||||
elif _is_pypy:
|
||||
if sys.version_info > (3, 2):
|
||||
cpyver = '%d' % sys.version_info[0]
|
||||
elif sys.pypy_version_info >= (1, 5):
|
||||
cpyver = '%d.%d' % sys.version_info[:2]
|
||||
else:
|
||||
cpyver = '%d.%d.%d' % sys.version_info[:3]
|
||||
paths = [os.path.join(sys.real_prefix, 'lib_pypy'),
|
||||
os.path.join(sys.real_prefix, 'lib-python', cpyver)]
|
||||
if sys.pypy_version_info < (1, 9):
|
||||
paths.insert(1, os.path.join(sys.real_prefix,
|
||||
'lib-python', 'modified-%s' % cpyver))
|
||||
hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
|
||||
#
|
||||
# This is hardcoded in the Python executable, but relative to sys.prefix:
|
||||
for path in paths[:]:
|
||||
plat_path = os.path.join(path, 'plat-%s' % sys.platform)
|
||||
if os.path.exists(plat_path):
|
||||
paths.append(plat_path)
|
||||
elif sys.platform == 'win32':
|
||||
paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')]
|
||||
else:
|
||||
paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])]
|
||||
hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
|
||||
lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3])
|
||||
if os.path.exists(lib64_path):
|
||||
if _is_64bit:
|
||||
paths.insert(0, lib64_path)
|
||||
else:
|
||||
paths.append(lib64_path)
|
||||
# This is hardcoded in the Python executable, but relative to
|
||||
# sys.prefix. Debian change: we need to add the multiarch triplet
|
||||
# here, which is where the real stuff lives. As per PEP 421, in
|
||||
# Python 3.3+, this lives in sys.implementation, while in Python 2.7
|
||||
# it lives in sys.
|
||||
try:
|
||||
arch = getattr(sys, 'implementation', sys)._multiarch
|
||||
except AttributeError:
|
||||
# This is a non-multiarch aware Python. Fallback to the old way.
|
||||
arch = sys.platform
|
||||
plat_path = os.path.join(sys.real_prefix, 'lib',
|
||||
'python'+sys.version[:3],
|
||||
'plat-%s' % arch)
|
||||
if os.path.exists(plat_path):
|
||||
paths.append(plat_path)
|
||||
# This is hardcoded in the Python executable, but
|
||||
# relative to sys.prefix, so we have to fix up:
|
||||
for path in list(paths):
|
||||
tk_dir = os.path.join(path, 'lib-tk')
|
||||
if os.path.exists(tk_dir):
|
||||
paths.append(tk_dir)
|
||||
|
||||
# These are hardcoded in the Apple's Python executable,
|
||||
# but relative to sys.prefix, so we have to fix them up:
|
||||
if sys.platform == 'darwin':
|
||||
hardcoded_paths = [os.path.join(relative_dir, module)
|
||||
for relative_dir in hardcoded_relative_dirs
|
||||
for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')]
|
||||
|
||||
for path in hardcoded_paths:
|
||||
if os.path.exists(path):
|
||||
paths.append(path)
|
||||
|
||||
sys.path.extend(paths)
|
||||
|
||||
def force_global_eggs_after_local_site_packages():
|
||||
"""
|
||||
Force easy_installed eggs in the global environment to get placed
|
||||
in sys.path after all packages inside the virtualenv. This
|
||||
maintains the "least surprise" result that packages in the
|
||||
virtualenv always mask global packages, never the other way
|
||||
around.
|
||||
|
||||
"""
|
||||
egginsert = getattr(sys, '__egginsert', 0)
|
||||
for i, path in enumerate(sys.path):
|
||||
if i > egginsert and path.startswith(sys.prefix):
|
||||
egginsert = i
|
||||
sys.__egginsert = egginsert + 1
|
||||
|
||||
def virtual_addsitepackages(known_paths):
|
||||
force_global_eggs_after_local_site_packages()
|
||||
return addsitepackages(known_paths, sys_prefix=sys.real_prefix)
|
||||
|
||||
def fixclasspath():
|
||||
"""Adjust the special classpath sys.path entries for Jython. These
|
||||
entries should follow the base virtualenv lib directories.
|
||||
"""
|
||||
paths = []
|
||||
classpaths = []
|
||||
for path in sys.path:
|
||||
if path == '__classpath__' or path.startswith('__pyclasspath__'):
|
||||
classpaths.append(path)
|
||||
else:
|
||||
paths.append(path)
|
||||
sys.path = paths
|
||||
sys.path.extend(classpaths)
|
||||
|
||||
def execusercustomize():
|
||||
"""Run custom user specific code, if available."""
|
||||
try:
|
||||
import usercustomize
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
def main():
|
||||
global ENABLE_USER_SITE
|
||||
virtual_install_main_packages()
|
||||
abs__file__()
|
||||
paths_in_sys = removeduppaths()
|
||||
if (os.name == "posix" and sys.path and
|
||||
os.path.basename(sys.path[-1]) == "Modules"):
|
||||
addbuilddir()
|
||||
if _is_jython:
|
||||
fixclasspath()
|
||||
GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt'))
|
||||
if not GLOBAL_SITE_PACKAGES:
|
||||
ENABLE_USER_SITE = False
|
||||
if ENABLE_USER_SITE is None:
|
||||
ENABLE_USER_SITE = check_enableusersite()
|
||||
paths_in_sys = addsitepackages(paths_in_sys)
|
||||
paths_in_sys = addusersitepackages(paths_in_sys)
|
||||
if GLOBAL_SITE_PACKAGES:
|
||||
paths_in_sys = virtual_addsitepackages(paths_in_sys)
|
||||
if sys.platform == 'os2emx':
|
||||
setBEGINLIBPATH()
|
||||
setquit()
|
||||
setcopyright()
|
||||
sethelper()
|
||||
aliasmbcs()
|
||||
setencoding()
|
||||
execsitecustomize()
|
||||
if ENABLE_USER_SITE:
|
||||
execusercustomize()
|
||||
# Remove sys.setdefaultencoding() so that users cannot change the
|
||||
# encoding after initialization. The test for presence is needed when
|
||||
# this module is run as a script, because this code is executed twice.
|
||||
if hasattr(sys, "setdefaultencoding"):
|
||||
del sys.setdefaultencoding
|
||||
|
||||
main()
|
||||
|
||||
def _script():
|
||||
help = """\
|
||||
%s [--user-base] [--user-site]
|
||||
|
||||
Without arguments print some useful information
|
||||
With arguments print the value of USER_BASE and/or USER_SITE separated
|
||||
by '%s'.
|
||||
|
||||
Exit codes with --user-base or --user-site:
|
||||
0 - user site directory is enabled
|
||||
1 - user site directory is disabled by user
|
||||
2 - uses site directory is disabled by super user
|
||||
or for security reasons
|
||||
>2 - unknown error
|
||||
"""
|
||||
args = sys.argv[1:]
|
||||
if not args:
|
||||
print("sys.path = [")
|
||||
for dir in sys.path:
|
||||
print(" %r," % (dir,))
|
||||
print("]")
|
||||
def exists(path):
|
||||
if os.path.isdir(path):
|
||||
return "exists"
|
||||
else:
|
||||
return "doesn't exist"
|
||||
print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE)))
|
||||
print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE)))
|
||||
print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
|
||||
sys.exit(0)
|
||||
|
||||
buffer = []
|
||||
if '--user-base' in args:
|
||||
buffer.append(USER_BASE)
|
||||
if '--user-site' in args:
|
||||
buffer.append(USER_SITE)
|
||||
|
||||
if buffer:
|
||||
print(os.pathsep.join(buffer))
|
||||
if ENABLE_USER_SITE:
|
||||
sys.exit(0)
|
||||
elif ENABLE_USER_SITE is False:
|
||||
sys.exit(1)
|
||||
elif ENABLE_USER_SITE is None:
|
||||
sys.exit(2)
|
||||
else:
|
||||
sys.exit(3)
|
||||
else:
|
||||
import textwrap
|
||||
print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
|
||||
sys.exit(10)
|
||||
|
||||
if __name__ == '__main__':
|
||||
_script()
|
Binary file not shown.
Binary file not shown.
@ -1,16 +0,0 @@
|
||||
Including the following third parties:
|
||||
|
||||
7zip version 4.65
|
||||
7za.exe is a free software distributed under the GNU LGPL.
|
||||
Read license.txt for more information.
|
||||
|
||||
Source code of 7za.exe and 7-Zip can be found at
|
||||
http://www.7-zip.org/
|
||||
|
||||
Note: packed with UPX to reduce code size.
|
||||
|
||||
|
||||
wget 1.11.4 from http://www.gnu.org/software/wget/
|
||||
|
||||
Note: local compile without openssl support to reduce code size.
|
||||
Note: packed with UPX to reduce code size.
|
@ -1,119 +0,0 @@
|
||||
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
function Download(url, path, verbose) {
|
||||
if (verbose) {
|
||||
WScript.StdOut.Write(" * GET " + url + "...");
|
||||
}
|
||||
try {
|
||||
xml_http = new ActiveXObject("MSXML2.ServerXMLHTTP");
|
||||
} catch (e) {
|
||||
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
|
||||
": Cannot create Active-X object (" + e.description) + ").";
|
||||
WScript.Quit(1);
|
||||
}
|
||||
try {
|
||||
xml_http.open("GET", url, false);
|
||||
} catch (e) {
|
||||
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
|
||||
": invalid URL.");
|
||||
WScript.Quit(1);
|
||||
}
|
||||
|
||||
var response_body = null;
|
||||
var size_description = "?";
|
||||
var file_size;
|
||||
try {
|
||||
xml_http.send(null);
|
||||
if (xml_http.status != 200) {
|
||||
WScript.StdOut.WriteLine("[-] HTTP " + xml_http.status + " " +
|
||||
xml_http.statusText);
|
||||
WScript.Quit(1);
|
||||
}
|
||||
response_body = xml_http.responseBody;
|
||||
size_description = xml_http.getResponseHeader("Content-Length");
|
||||
if (size_description != "") {
|
||||
file_size = parseInt(size_description)
|
||||
size_description = file_size.toBytes();
|
||||
} else {
|
||||
try {
|
||||
file_size = new Number(xml_http.responseText.length)
|
||||
size_description = file_size.toBytes();
|
||||
} catch(e) {
|
||||
size_description = "unknown size";
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
WScript.StdOut.WriteLine("[-] XMLHTTP " + new Number(e.number).toHex() +
|
||||
": Cannot make HTTP request (" + e.description) + ")";
|
||||
WScript.Quit(1);
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
WScript.StdOut.WriteLine("ok (" + size_description + ").");
|
||||
WScript.StdOut.Write(" * Save " + path + "...");
|
||||
}
|
||||
|
||||
try {
|
||||
var adodb_stream = new ActiveXObject("ADODB.Stream");
|
||||
adodb_stream.Mode = 3; // ReadWrite
|
||||
adodb_stream.Type = 1; // 1= Binary
|
||||
adodb_stream.Open(); // Open the stream
|
||||
adodb_stream.Write(response_body); // Write the data
|
||||
adodb_stream.SaveToFile(path, 2); // Save to our destination
|
||||
adodb_stream.Close();
|
||||
} catch(e) {
|
||||
WScript.StdOut.WriteLine(
|
||||
"[-] ADODB.Stream " + new Number(e.number).toHex() +
|
||||
": Cannot save file to " + path + ": " + e.description);
|
||||
WScript.Quit(1);
|
||||
}
|
||||
if (typeof(file_size) != undefined) {
|
||||
var file_system_object = WScript.CreateObject("Scripting.FileSystemObject")
|
||||
var file = file_system_object.GetFile(path)
|
||||
if (file.Size < file_size) {
|
||||
WScript.StdOut.WriteLine("[-] File only partially downloaded.");
|
||||
WScript.Quit(1);
|
||||
}
|
||||
}
|
||||
if (verbose) {
|
||||
WScript.StdOut.WriteLine("ok.");
|
||||
}
|
||||
}
|
||||
|
||||
// Utilities
|
||||
Number.prototype.isInt = function NumberIsInt() {
|
||||
return this % 1 == 0;
|
||||
};
|
||||
Number.prototype.toBytes = function NumberToBytes() {
|
||||
// Returns a "pretty" string representation of a number of bytes:
|
||||
var units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||
var unit = "bytes";
|
||||
var limit = 1;
|
||||
while(this > limit * 1100 && units.length > 0) {
|
||||
limit *= 1024;
|
||||
unit = units.shift();
|
||||
}
|
||||
return (Math.round(this * 100 / limit) / 100).toString() + " " + unit;
|
||||
};
|
||||
Number.prototype.toHex = function NumberToHex(length) {
|
||||
if (arguments.length == 0) length = 1;
|
||||
if (typeof(length) != "number" && !(length instanceof Number)) {
|
||||
throw Exception("Length must be a positive integer larger than 0.",
|
||||
TypeError, 0);
|
||||
}
|
||||
if (length < 1 || !length.isInt()) {
|
||||
throw Exception("Length must be a positive integer larger than 0.",
|
||||
"RangeError", 0);
|
||||
}
|
||||
var result = (this + (this < 0 ? 0x100000000 : 0)).toString(16);
|
||||
while (result.length < length) result = "0" + result;
|
||||
return result;
|
||||
};
|
||||
|
||||
if (WScript.Arguments.length != 2) {
|
||||
WScript.StdOut.Write("Incorrect arguments to get_file.js")
|
||||
} else {
|
||||
Download(WScript.Arguments(0), WScript.Arguments(1), false);
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
@echo off
|
||||
:: Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
:: Use of this source code is governed by a BSD-style license that can be
|
||||
:: found in the LICENSE file.
|
||||
|
||||
setlocal
|
||||
call python "%~dp0pylint.py" %*
|
@ -1,8 +0,0 @@
|
||||
@echo off
|
||||
:: Copyright 2013 The Chromium Authors. All rights reserved.
|
||||
:: Use of this source code is governed by a BSD-style license that can be
|
||||
:: found in the LICENSE file.
|
||||
|
||||
setlocal
|
||||
set PATH=%~dp0python276_bin;%~dp0python276_bin\Scripts;%PATH%
|
||||
"%~dp0python276_bin\python.exe" %*
|
@ -1,4 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
set PATH=%~dp0svn_bin;%PATH%
|
||||
"%~dp0svn_bin\svn.exe" %*
|
@ -1,4 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
set PATH=%~dp0svn_bin;%PATH%
|
||||
"%~dp0svn_bin\svnversion.exe" %*
|
@ -1,91 +0,0 @@
|
||||
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
function Unzip(file, path, verbose) {
|
||||
if (verbose) {
|
||||
WScript.StdOut.Write(" * UNZIP " + file);
|
||||
}
|
||||
var shell_app;
|
||||
var fso;
|
||||
try {
|
||||
shell_app = new ActiveXObject("Shell.Application");
|
||||
fso = new ActiveXObject("Scripting.FileSystemObject");
|
||||
} catch (e) {
|
||||
WScript.StdOut.WriteLine("[-] OBJECTS " + new Number(e.number).toHex() +
|
||||
": Cannot create Active-X object (" + e.description) + ").";
|
||||
WScript.Quit(1);
|
||||
}
|
||||
// shell_app.Namespace() doesn't work with relative paths.
|
||||
//current_dir = fso.GetFolder('.').Path + '\\'
|
||||
//path = current_dir + path
|
||||
//file = current_dir + file
|
||||
var out;
|
||||
var zip;
|
||||
try {
|
||||
if (!fso.FolderExists(path)) {
|
||||
fso.CreateFolder(path);
|
||||
}
|
||||
out = shell_app.Namespace(path);
|
||||
} catch (e) {
|
||||
WScript.StdOut.WriteLine("[-] SHELL.APPLICATION " +
|
||||
new Number(e.number).toHex() +
|
||||
": Failed to open output directory.");
|
||||
WScript.Quit(1);
|
||||
}
|
||||
if (!out) {
|
||||
WScript.StdOut.WriteLine("[-] SHELL.APPLICATION : Failed to open output directory.");
|
||||
WScript.Quit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
zip = shell_app.Namespace(file);
|
||||
} catch (e) {
|
||||
WScript.StdOut.WriteLine("[-] SHELL.APPLICATION " +
|
||||
new Number(e.number).toHex() +
|
||||
": Failed to open zip file.");
|
||||
WScript.Quit(1);
|
||||
}
|
||||
if (!zip) {
|
||||
WScript.StdOut.WriteLine("[-] SHELL.APPLICATION " +
|
||||
": Failed to open zip file.");
|
||||
WScript.Quit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
out.CopyHere(zip.Items());
|
||||
} catch (e) {
|
||||
WScript.StdOut.WriteLine("[-] SHELL.APPLICATION " +
|
||||
new Number(e.number).toHex() +
|
||||
": Failed to extract.");
|
||||
WScript.Quit(1);
|
||||
}
|
||||
if (verbose) {
|
||||
WScript.StdOut.WriteLine("ok.");
|
||||
}
|
||||
}
|
||||
|
||||
// Utilities
|
||||
Number.prototype.isInt = function NumberIsInt() {
|
||||
return this % 1 == 0;
|
||||
};
|
||||
Number.prototype.toHex = function NumberToHex(length) {
|
||||
if (arguments.length == 0) length = 1;
|
||||
if (typeof(length) != "number" && !(length instanceof Number)) {
|
||||
throw Exception("Length must be a positive integer larger than 0.",
|
||||
TypeError, 0);
|
||||
}
|
||||
if (length < 1 || !length.isInt()) {
|
||||
throw Exception("Length must be a positive integer larger than 0.",
|
||||
"RangeError", 0);
|
||||
}
|
||||
var result = (this + (this < 0 ? 0x100000000 : 0)).toString(16);
|
||||
while (result.length < length) result = "0" + result;
|
||||
return result;
|
||||
};
|
||||
|
||||
if (WScript.Arguments.length != 2) {
|
||||
WScript.StdOut.Write("Incorrect arguments to unzip.js")
|
||||
} else {
|
||||
Unzip(WScript.Arguments(0), WScript.Arguments(1), false);
|
||||
}
|
@ -1,173 +0,0 @@
|
||||
@echo off
|
||||
:: Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
||||
:: Use of this source code is governed by a BSD-style license that can be
|
||||
:: found in the LICENSE file.
|
||||
|
||||
:: This script will try to find if svn and python are accessible and it not,
|
||||
:: it will try to download it and 'install' it in depot_tools.
|
||||
|
||||
:: Sadly, we can't use SETLOCAL here otherwise it ERRORLEVEL is not correctly
|
||||
:: returned.
|
||||
|
||||
set WIN_TOOLS_ROOT_URL=https://src.chromium.org/svn/trunk/tools
|
||||
:: It used to be %~dp0 but ADODB.Stream may fail to write to this directory if
|
||||
:: the directory DACL is set to elevated integrity level.
|
||||
set ZIP_DIR=%TEMP%
|
||||
|
||||
:: Get absolute root directory (.js scripts don't handle relative paths well).
|
||||
pushd %~dp0..\..
|
||||
set WIN_TOOLS_ROOT_DIR=%CD%
|
||||
popd
|
||||
|
||||
if "%1" == "force" (
|
||||
set WIN_TOOLS_FORCE=1
|
||||
shift /1
|
||||
)
|
||||
|
||||
|
||||
:PYTHON_CHECK
|
||||
if not exist "%WIN_TOOLS_ROOT_DIR%\python276_bin" goto :PY27_INSTALL
|
||||
if not exist "%WIN_TOOLS_ROOT_DIR%\python.bat" goto :PY27_INSTALL
|
||||
set ERRORLEVEL=0
|
||||
goto :GIT_CHECK
|
||||
|
||||
|
||||
:PY27_INSTALL
|
||||
echo Installing python 2.7.6...
|
||||
:: Cleanup python directory if it was existing.
|
||||
if exist "%WIN_TOOLS_ROOT_DIR%\python276_bin\." rd /q /s "%WIN_TOOLS_ROOT_DIR%\python276_bin"
|
||||
if exist "%ZIP_DIR%\python276.zip" del "%ZIP_DIR%\python276.zip"
|
||||
echo Fetching from %WIN_TOOLS_ROOT_URL%/third_party/python276_bin.zip
|
||||
cscript //nologo //e:jscript "%~dp0get_file.js" %WIN_TOOLS_ROOT_URL%/third_party/python276_bin.zip "%ZIP_DIR%\python276_bin.zip"
|
||||
if errorlevel 1 goto :PYTHON_FAIL
|
||||
:: Will create python276_bin\...
|
||||
cscript //nologo //e:jscript "%~dp0unzip.js" "%ZIP_DIR%\python276_bin.zip" "%WIN_TOOLS_ROOT_DIR%"
|
||||
:: Create the batch files.
|
||||
call copy /y "%~dp0python276.new.bat" "%WIN_TOOLS_ROOT_DIR%\python.bat" 1>nul
|
||||
call copy /y "%~dp0pylint.new.bat" "%WIN_TOOLS_ROOT_DIR%\pylint.bat" 1>nul
|
||||
del "%ZIP_DIR%\python276_bin.zip"
|
||||
set ERRORLEVEL=0
|
||||
goto :GIT_CHECK
|
||||
|
||||
|
||||
:PYTHON_FAIL
|
||||
echo ... Failed to checkout python automatically.
|
||||
echo You should get the "prebaked" version at %WIN_TOOLS_ROOT_URL%/third_party/
|
||||
set ERRORLEVEL=1
|
||||
goto :END
|
||||
|
||||
:GIT_CHECK
|
||||
if "%DEPOT_TOOLS_GIT_BLEEDING%" == "1" (
|
||||
set GIT_VERSION=1.9.5.chromium.6
|
||||
) else (
|
||||
set GIT_VERSION=1.9.5.chromium.6
|
||||
)
|
||||
for /f "tokens=2 delims=[]" %%i in ('ver') do set VERSTR=%%i
|
||||
for /f "tokens=2,3 delims=. " %%i in ("%VERSTR%") do (set VERMAJOR=%%i & set VERMINOR=%%j)
|
||||
if %VERMAJOR% lss 5 set GIT_VERSION=%GIT_VERSION%-xp
|
||||
if %VERMAJOR% equ 5 if %VERMINOR% lss 2 set GIT_VERSION=%GIT_VERSION%-xp
|
||||
|
||||
:: Clean up any release which doesn't match the one we want.
|
||||
for /d %%i in ("%WIN_TOOLS_ROOT_DIR%\git-*_bin") do (
|
||||
if not "%%i" == "%WIN_TOOLS_ROOT_DIR%\git-%GIT_VERSION%_bin" (
|
||||
rmdir /s /q "%%i"
|
||||
)
|
||||
)
|
||||
set GIT_BIN_DIR=git-%GIT_VERSION%_bin
|
||||
set GIT_ZIP_FILE=%GIT_BIN_DIR%.zip
|
||||
set GIT_ZIP_URL=https://commondatastorage.googleapis.com/chrome-infra/%GIT_ZIP_FILE%
|
||||
|
||||
if "%WIN_TOOLS_FORCE%" == "1" goto :GIT_INSTALL
|
||||
if exist "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\cmd\git.cmd" (
|
||||
call "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\cmd\git.cmd" --version 2>nul 1>nul
|
||||
if errorlevel 1 goto :GIT_INSTALL
|
||||
rem Several git versions can live side-by-side; check the top-level
|
||||
rem batch script to make sure it points to the desired version.
|
||||
find "%GIT_BIN_DIR%" "%WIN_TOOLS_ROOT_DIR%\git.bat" 2>nul 1>nul
|
||||
if errorlevel 1 goto :GIT_COPY_BATCH_FILES
|
||||
goto :SVN_CHECK
|
||||
)
|
||||
goto :GIT_INSTALL
|
||||
|
||||
|
||||
:GIT_INSTALL
|
||||
echo Installing git %GIT_VERSION% (avg 1-2 min download) ...
|
||||
:: git is not accessible; check it out and create 'proxy' files.
|
||||
if exist "%ZIP_DIR%\git.zip" del "%ZIP_DIR%\git.zip"
|
||||
echo Fetching from %GIT_ZIP_URL%
|
||||
cscript //nologo //e:jscript "%~dp0get_file.js" %GIT_ZIP_URL% "%ZIP_DIR%\git.zip"
|
||||
if errorlevel 1 goto :GIT_FAIL
|
||||
:: Cleanup svn directory if it was existing.
|
||||
if exist "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\." rd /q /s "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%"
|
||||
:: Will create %GIT_BIN_DIR%\...
|
||||
cscript //nologo //e:jscript "%~dp0unzip.js" "%ZIP_DIR%\git.zip" "%WIN_TOOLS_ROOT_DIR%"
|
||||
if errorlevel 1 goto :GIT_FAIL
|
||||
if not exist "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\." goto :GIT_FAIL
|
||||
del "%ZIP_DIR%\git.zip"
|
||||
goto :GIT_COPY_BATCH_FILES
|
||||
|
||||
|
||||
:GIT_COPY_BATCH_FILES
|
||||
:: Create the batch files.
|
||||
call copy /y "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\git.bat" "%WIN_TOOLS_ROOT_DIR%\git.bat" 1>nul
|
||||
call copy /y "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\gitk.bat" "%WIN_TOOLS_ROOT_DIR%\gitk.bat" 1>nul
|
||||
call copy /y "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\ssh.bat" "%WIN_TOOLS_ROOT_DIR%\ssh.bat" 1>nul
|
||||
call copy /y "%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR%\ssh-keygen.bat" "%WIN_TOOLS_ROOT_DIR%\ssh-keygen.bat" 1>nul
|
||||
|
||||
:: Ensure autocrlf and filemode are set correctly.
|
||||
call "%WIN_TOOLS_ROOT_DIR%\git.bat" config --system core.autocrlf false
|
||||
call "%WIN_TOOLS_ROOT_DIR%\git.bat" config --system core.filemode false
|
||||
goto :SVN_CHECK
|
||||
|
||||
|
||||
:GIT_FAIL
|
||||
echo ... Failed to checkout git automatically.
|
||||
echo You should get the "prebaked" version used at %GIT_ZIP_URL%
|
||||
set ERRORLEVEL=1
|
||||
goto :END
|
||||
|
||||
|
||||
:SVN_CHECK
|
||||
:: If the batch file exists, skip the svn check.
|
||||
if exist "%WIN_TOOLS_ROOT_DIR%\svn.bat" goto :END
|
||||
if "%WIN_TOOLS_FORCE%" == "1" goto :SVN_INSTALL
|
||||
call svn --version 2>nul 1>nul
|
||||
if errorlevel 1 goto :SVN_INSTALL
|
||||
goto :END
|
||||
|
||||
|
||||
:SVN_INSTALL
|
||||
echo Installing subversion ...
|
||||
:: svn is not accessible; check it out and create 'proxy' files.
|
||||
if exist "%ZIP_DIR%\svn.zip" del "%ZIP_DIR%\svn.zip"
|
||||
echo Fetching from %WIN_TOOLS_ROOT_URL%/third_party/svn_bin.zip
|
||||
cscript //nologo //e:jscript "%~dp0get_file.js" %WIN_TOOLS_ROOT_URL%/third_party/svn_bin.zip "%ZIP_DIR%\svn.zip"
|
||||
if errorlevel 1 goto :SVN_FAIL
|
||||
:: Cleanup svn directory if it was existing.
|
||||
if exist "%WIN_TOOLS_ROOT_DIR%\svn\." rd /q /s "%WIN_TOOLS_ROOT_DIR%\svn"
|
||||
if exist "%WIN_TOOLS_ROOT_DIR%\svn_bin\." rd /q /s "%WIN_TOOLS_ROOT_DIR%\svn_bin"
|
||||
:: Will create svn_bin\...
|
||||
cscript //nologo //e:jscript "%~dp0unzip.js" "%ZIP_DIR%\svn.zip" "%WIN_TOOLS_ROOT_DIR%"
|
||||
if errorlevel 1 goto :SVN_FAIL
|
||||
if not exist "%WIN_TOOLS_ROOT_DIR%\svn_bin\." goto :SVN_FAIL
|
||||
del "%ZIP_DIR%\svn.zip"
|
||||
:: Create the batch file.
|
||||
call copy /y "%~dp0svn.new.bat" "%WIN_TOOLS_ROOT_DIR%\svn.bat" 1>nul
|
||||
call copy /y "%~dp0svnversion.new.bat" "%WIN_TOOLS_ROOT_DIR%\svnversion.bat" 1>nul
|
||||
goto :END
|
||||
|
||||
|
||||
:SVN_FAIL
|
||||
echo ... Failed to checkout svn automatically.
|
||||
echo You should get the "prebaked" version at %WIN_TOOLS_ROOT_URL%/third_party/
|
||||
set ERRORLEVEL=1
|
||||
goto :END
|
||||
|
||||
|
||||
:returncode
|
||||
set WIN_TOOLS_ROOT_URL=
|
||||
set WIN_TOOLS_ROOT_DIR=
|
||||
exit /b %ERRORLEVEL%
|
||||
|
||||
:END
|
||||
call :returncode %ERRORLEVEL%
|
Loading…
Reference in New Issue