diff -Nru python-virtualenv-1.4.9/AUTHORS.txt python-virtualenv-1.6.4/AUTHORS.txt --- python-virtualenv-1.4.9/AUTHORS.txt 1970-01-01 00:00:00.000000000 +0000 +++ python-virtualenv-1.6.4/AUTHORS.txt 2011-03-20 19:46:55.000000000 +0000 @@ -0,0 +1,29 @@ +Author +------ + +Ian Bicking + +Maintainers +----------- + +Brian Rosner +Carl Meyer +Jannis Leidel + +Contributors +------------ + +Antonio Cuni +Armin Ronacher +Christopher Nilsson +Curt Micol +Douglas Creager +Jeff Hammel +Jorge Vargas +Josh Bronson +Kumar McMillan +Lars Francke +Philip Jenvey +Ronny Pfannschmidt +Tarek Ziadé +Vinay Sajip diff -Nru python-virtualenv-1.4.9/debian/changelog python-virtualenv-1.6.4/debian/changelog --- python-virtualenv-1.4.9/debian/changelog 2010-11-25 02:03:11.000000000 +0000 +++ python-virtualenv-1.6.4/debian/changelog 2011-08-01 10:57:18.000000000 +0000 @@ -1,3 +1,11 @@ +python-virtualenv (1.6.4-0~ppa1) natty; urgency=low + + * Upgrade to latest release + * Synced patches to latest code + * Removed weakrefset patch as in latest code + + -- David Fraser Mon, 01 Aug 2010 12:48:50 +0200 + python-virtualenv (1.4.9-3ubuntu1) natty; urgency=low * Add weakrefset to REQUIRED_MODULES. Backports unreleased upstream fix diff -Nru python-virtualenv-1.4.9/debian/patches/add_distribute.patch python-virtualenv-1.6.4/debian/patches/add_distribute.patch --- python-virtualenv-1.4.9/debian/patches/add_distribute.patch 2010-08-22 13:50:20.000000000 +0000 +++ python-virtualenv-1.6.4/debian/patches/add_distribute.patch 2011-08-01 10:53:58.000000000 +0000 @@ -9,12 +9,12 @@ =================================================================== --- python-virtualenv-1.4.9.orig/virtualenv.py +++ python-virtualenv-1.4.9/virtualenv.py -@@ -467,9 +467,16 @@ def main(): +@@ -725,9 +725,16 @@ def main(): parser.add_option( '--distribute', dest='use_distribute', - action='store_true', -- help='Use Distribute instead of Setuptools. Set environ variable' +- help='Use Distribute instead of Setuptools. Set environ variable ' - 'VIRTUALENV_USE_DISTRIBUTE to make it the default ') + action='store_true', default=True, + help='Ignored. Distribute is used by default. See --setuptools ' @@ -27,28 +27,32 @@ + help='Use Setuptools instead of Distribute. Set environ variable ' + 'VIRTUALENV_USE_SETUPTOOLS to make it the default.') - if 'extend_parser' in globals(): - extend_parser(parser) -@@ -593,7 +600,7 @@ def call_subprocess(cmd, show_stdout=Tru + default_search_dirs = file_search_dirs() + parser.add_option( +@@ -883,7 +890,7 @@ def call_subprocess(cmd, show_stdout=Tru def create_environment(home_dir, site_packages=True, clear=False, -- unzip_setuptools=False, use_distribute=False): -+ unzip_setuptools=False, use_distribute=True): +- unzip_setuptools=False, use_distribute=False, ++ unzip_setuptools=False, use_distribute=True, + prompt=None, search_dirs=None, never_download=False): """ Creates a new environment in ``home_dir``. -@@ -611,10 +618,10 @@ def create_environment(home_dir, site_pa +@@ -911,12 +918,12 @@ def create_environment(home_dir, site_pa install_distutils(lib_dir, home_dir) - if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'): -- install_distribute(py_executable, unzip=unzip_setuptools) +- install_distribute(py_executable, unzip=unzip_setuptools, +- search_dirs=search_dirs, never_download=never_download) - else: + if not use_distribute or os.environ.get('VIRTUALENV_USE_SETUPTOOLS'): - install_setuptools(py_executable, unzip=unzip_setuptools) + install_setuptools(py_executable, unzip=unzip_setuptools, + search_dirs=search_dirs, never_download=never_download) + else: -+ install_distribute(py_executable, unzip=unzip_setuptools) ++ install_distribute(py_executable, unzip=unzip_setuptools, ++ search_dirs=search_dirs, never_download=never_download) - install_pip(py_executable) + install_pip(py_executable, search_dirs=search_dirs, never_download=never_download) diff -Nru python-virtualenv-1.4.9/debian/patches/look_for_external_files.patch python-virtualenv-1.6.4/debian/patches/look_for_external_files.patch --- python-virtualenv-1.4.9/debian/patches/look_for_external_files.patch 2010-08-22 13:50:49.000000000 +0000 +++ python-virtualenv-1.6.4/debian/patches/look_for_external_files.patch 2011-08-01 10:56:02.000000000 +0000 @@ -5,19 +5,21 @@ =================================================================== --- python-virtualenv-1.4.9.orig/setup.py +++ python-virtualenv-1.4.9/setup.py -@@ -63,6 +63,6 @@ setup(name='virtualenv', +@@ -51,8 +51,8 @@ setup(name='virtualenv', license='MIT', py_modules=['virtualenv'], packages=['virtualenv_support'], - package_data={'virtualenv_support': ['*-py%s.egg' % sys.version[:3], '*.tar.gz']}, + #package_data={'virtualenv_support': ['*-py%s.egg' % sys.version[:3], '*.tar.gz']}, + test_suite='nose.collector', + tests_require=['nose', 'Mock'], **kw ) Index: virtualenv-1.4.9/virtualenv.py =================================================================== --- virtualenv-1.4.9.orig/virtualenv.py 2010-07-06 01:09:36.000000000 +0200 +++ virtualenv-1.4.9/virtualenv.py 2010-07-06 02:20:52.000000000 +0200 -@@ -346,7 +346,8 @@ +@@ -586,7 +586,8 @@ def file_search_dirs(): here = os.path.dirname(os.path.abspath(__file__)) dirs = ['.', here, diff -Nru python-virtualenv-1.4.9/debian/patches/series python-virtualenv-1.6.4/debian/patches/series --- python-virtualenv-1.4.9/debian/patches/series 2010-11-25 02:03:11.000000000 +0000 +++ python-virtualenv-1.6.4/debian/patches/series 2011-08-01 10:57:20.000000000 +0000 @@ -1,3 +1,2 @@ look_for_external_files.patch add_distribute.patch -weakrefset-required.patch diff -Nru python-virtualenv-1.4.9/debian/patches/weakrefset-required.patch python-virtualenv-1.6.4/debian/patches/weakrefset-required.patch --- python-virtualenv-1.4.9/debian/patches/weakrefset-required.patch 2010-11-25 02:08:05.000000000 +0000 +++ python-virtualenv-1.6.4/debian/patches/weakrefset-required.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -Description: Add weakrefset as a REQUIRED_MODULE -Subject: upstream, http://bitbucket.org/ianb/virtualenv/changeset/557e655dd38b/raw/virtualenv-557e655dd38b.diff -Bug: http://bitbucket.org/ianb/virtualenv/issue/63/now-python27-requires-_weakrefset -Bug-Ubuntu: https://bugs.launchpad.net/bugs/662611 - ---- a/virtualenv.py -+++ b/virtualenv.py -@@ -37,6 +37,8 @@ - 're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile', - 'lib-dynload', 'config', 'zlib'] - -+if sys.version_info[:2] >= (2, 7): -+ REQUIRED_MODULES.extend(['_weakrefset']) - if sys.version_info[:2] >= (2, 6): - REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc']) - if sys.version_info[:2] <= (2, 3): diff -Nru python-virtualenv-1.4.9/docs/_build/_sources/index.txt python-virtualenv-1.6.4/docs/_build/_sources/index.txt --- python-virtualenv-1.4.9/docs/_build/_sources/index.txt 2010-03-10 18:35:49.000000000 +0000 +++ python-virtualenv-1.6.4/docs/_build/_sources/index.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,335 +0,0 @@ -virtualenv -========== - -* `Discussion list `_ -* `Bugs `_ - -.. contents:: - -.. toctree:: - :maxdepth: 1 - - news - license - -.. comment: split here - -Status and License ------------------- - -``virtualenv`` is a successor to `workingenv -`_, and an extension -of `virtual-python -`_. - -It is written by Ian Bicking, and sponsored by the `Open Planning -Project `_. It is licensed under an -`MIT-style permissive license `_. - -You can install it with ``easy_install virtualenv``, or from the `hg -repository `_ or from a `tarball -`_ -``easy_install virtualenv==tip``. - -What It Does ------------- - -``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.4/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 use the globally installed libraries either). - -The basic usage is:: - - $ python virtualenv.py ENV - -If you install it you can also just do ``virtualenv ENV``. - -This creates ``ENV/lib/python2.4/site-packages`` (or -``ENV/lib/python2.5/site-packages`` on Python 2.5, etc), where any -libraries you install will go. It also creates ``ENV/bin/python``, -which is a Python interpreter that uses this environment. Anytime you -use that interpreter (including when a script has -``#!/path/to/ENV/bin/python`` in it) the libraries in that environment -will be used. (**Note for Windows:** scripts and executables on -Windows go in ``ENV\Scripts\``; everywhere you see ``bin/`` replace it -with ``Scripts\``) - -It also installs `Setuptools -`_ for you, and if -you use ``ENV/bin/easy_install`` the packages will be installed into -the environment. - -If you use the ``--distribute`` option, it will install `distribute -`_ for you, instead of setuptools, -and if you use `ENV/bin/easy_install`` the packages will be installed into the -environment. - -To use Distribute just call virtualenv like this:: - - $ python virtualenv.py --distribute ENV - -You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE (since 1.4.4) -and be a good Comrade - -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 -``virtualenv.create_bootstrap_script(extra_text)``, and write the -result to your new bootstrapping script. Here's the documentation -from the docstring: - -Creates a bootstrap script, 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: - -``extend_parser(optparse_parser)``: - You can add or remove options from the parser here. - -``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]``). - -``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 -`_. - -activate script -~~~~~~~~~~~~~~~ - -In a newly created virtualenv there will be a ``bin/activate`` shell -script, or a ``Scripts/activate.bat`` batch file on Windows. - -On Posix systems you can do:: - - $ source bin/activate - -This will change your ``$PATH`` to point to the virtualenv ``bin/`` -directory. Unlike workingenv, this is all it -does; it's a convenience. But if you use the complete path like -``/path/to/env/bin/python script.py`` you do not need to activate the -environment first. You have to use ``source`` because it changes the -environment in-place. After activating an environment you can use the -function ``deactivate`` to undo the changes. - -The ``activate`` script will also modify your shell prompt to indicate -which environment is currently active. You can disable this behavior, -which can be useful if you have your own custom prompt that already -displays the active environment name. To do so, set the -``VIRTUAL_ENV_DISABLE_PROMPT`` environment variable to any non-empty -value before running the ``activate`` script. - -On Windows you just do:: - - > \path\to\env\bin\activate.bat - -And use ``deactivate.bat`` to undo the changes. - -The ``--no-site-packages`` Option -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you build with ``virtualenv --no-site-packages ENV`` it will *not* -inherit any packages from ``/usr/lib/python2.5/site-packages`` (or -wherever your global site-packages directory is). This can be used if -you don't have control over site-packages and don't want to depend on -the packages there, or you just want more isolation from the global -system. - -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 -`_ or `mod_wsgi `_ -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, -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. Also this does not -currently work on Windows. - -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 or distribute -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:** 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). - -Currently the ``--no-site-packages`` option will not be honored if you -use this on an environment. - -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 - `_ - 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 `_ 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. - -Other Documentation and Links ------------------------------ - -* James Gardner has written a tutorial on using `virtualenv with - Pylons - `_. - -* `Blog announcement - `_. - -* Doug Hellmann wrote a description of his `command-line work flow - using virtualenv (virtualenvwrapper) - `_ - including some handy scripts to make working with multiple - environments easier. He also wrote `an example of using virtualenv - to try IPython - `_. - -* Chris Perkins created a `showmedo video including virtualenv - `_. - -* `Using virtualenv with mod_wsgi - `_. - -* `virtualenv commands - `_ for some more - workflow-related tools around virtualenv. diff -Nru python-virtualenv-1.4.9/docs/_build/_sources/license.txt python-virtualenv-1.6.4/docs/_build/_sources/license.txt --- python-virtualenv-1.4.9/docs/_build/_sources/license.txt 2009-11-10 18:06:49.000000000 +0000 +++ python-virtualenv-1.6.4/docs/_build/_sources/license.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -License -======= - -Copyright (c) 2007 Ian Bicking and Contributors - -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. diff -Nru python-virtualenv-1.4.9/docs/_build/_sources/news.txt python-virtualenv-1.6.4/docs/_build/_sources/news.txt --- python-virtualenv-1.4.9/docs/_build/_sources/news.txt 2010-04-22 07:59:38.000000000 +0000 +++ python-virtualenv-1.6.4/docs/_build/_sources/news.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,292 +0,0 @@ -Changes & News --------------- - -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_USE_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 `_ - 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 - `_ 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 <./index.html#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 - `_ - (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 `_. -* 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! diff -Nru python-virtualenv-1.4.9/docs/index.txt python-virtualenv-1.6.4/docs/index.txt --- python-virtualenv-1.4.9/docs/index.txt 2010-03-10 18:35:49.000000000 +0000 +++ python-virtualenv-1.6.4/docs/index.txt 2011-07-21 16:52:04.000000000 +0000 @@ -2,7 +2,7 @@ ========== * `Discussion list `_ -* `Bugs `_ +* `Bugs `_ .. contents:: @@ -10,7 +10,6 @@ :maxdepth: 1 news - license .. comment: split here @@ -22,14 +21,15 @@ of `virtual-python `_. -It is written by Ian Bicking, and sponsored by the `Open Planning -Project `_. It is licensed under an -`MIT-style permissive license `_. - -You can install it with ``easy_install virtualenv``, or from the `hg -repository `_ or from a `tarball -`_ -``easy_install virtualenv==tip``. +It was written by Ian Bicking, sponsored by the `Open Planning +Project `_ and is now maintained by a +`group of developers `_. +It is licensed under an +`MIT-style permissive license `_. + +You can install it with ``easy_install virtualenv``, or the `latest +development version `_ +with ``easy_install virtualenv==dev``. What It Does ------------ @@ -40,7 +40,7 @@ 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.4/site-packages`` (or whatever your +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. @@ -55,7 +55,7 @@ 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 use the globally installed libraries either). +doesn't access the globally installed libraries either). The basic usage is:: @@ -63,32 +63,41 @@ If you install it you can also just do ``virtualenv ENV``. -This creates ``ENV/lib/python2.4/site-packages`` (or -``ENV/lib/python2.5/site-packages`` on Python 2.5, etc), where any -libraries you install will go. It also creates ``ENV/bin/python``, -which is a Python interpreter that uses this environment. Anytime you -use that interpreter (including when a script has -``#!/path/to/ENV/bin/python`` in it) the libraries in that environment -will be used. (**Note for Windows:** scripts and executables on -Windows go in ``ENV\Scripts\``; everywhere you see ``bin/`` replace it -with ``Scripts\``) - -It also installs `Setuptools -`_ for you, and if -you use ``ENV/bin/easy_install`` the packages will be installed into -the environment. +This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you +install will go. It also creates ``ENV/bin/python``, which is a Python +interpreter that uses this environment. Anytime you use that interpreter +(including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries +in that environment will be used. + +It also installs either `Setuptools +`_ or `distribute +`_ into the environment. To use +Distribute instead of setuptools, just call virtualenv like this:: -If you use the ``--distribute`` option, it will install `distribute -`_ for you, instead of setuptools, -and if you use `ENV/bin/easy_install`` the packages will be installed into the -environment. + $ python virtualenv.py --distribute ENV -To use Distribute just call virtualenv like this:: +You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE. - $ python virtualenv.py --distribute ENV +A new virtualenv also includes the `pip `_ +installer, so you can use `ENV/bin/pip`` to install additional packages into +the environment. + +Windows Notes +~~~~~~~~~~~~~ -You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE (since 1.4.4) -and be a good Comrade +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 `_ library installed. + +PyPy Support +~~~~~~~~~~~~ + +Beginning with virtualenv version 1.5 `PyPy `_ is +supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5. +To use PyPy 1.5, you need a version of virtualenv >= 1.6.1. Creating Your Own Bootstrap Scripts ----------------------------------- @@ -175,13 +184,15 @@ $ source bin/activate -This will change your ``$PATH`` to point to the virtualenv ``bin/`` -directory. Unlike workingenv, this is all it -does; it's a convenience. But if you use the complete path like -``/path/to/env/bin/python script.py`` you do not need to activate the -environment first. You have to use ``source`` because it changes the -environment in-place. After activating an environment you can use the -function ``deactivate`` to undo the changes. +This will change your ``$PATH`` to point to 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. + +After activating an environment you can use the function ``deactivate`` to +undo the changes to your ``$PATH``. The ``activate`` script will also modify your shell prompt to indicate which environment is currently active. You can disable this behavior, @@ -192,7 +203,7 @@ On Windows you just do:: - > \path\to\env\bin\activate.bat + > \path\to\env\Scripts\activate.bat And use ``deactivate.bat`` to undo the changes. @@ -222,13 +233,14 @@ 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, -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. +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 -- this technique does not support the +``--no-site-packages`` flag. 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -268,6 +280,44 @@ Currently the ``--no-site-packages`` option will not be honored if you use this on an environment. +The ``--extra-search-dir`` Option +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When it creates a new environment, virtualenv installs either +setuptools or distribute, and pip. In normal operation, the latest +releases of these packages are fetched from the `Python Package Index +`_ (PyPI). In some circumstances, this +behavior may not be wanted, for example if you are using virtualenv +during a deployment and do not want to depend on Internet access and +PyPI availability. + +As an alternative, you can provide your own versions of setuptools, +distribute and/or pip on the filesystem, and tell virtualenv to use +those distributions instead of downloading them from the Internet. 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, distribute and/or pip distributions. Setuptools +distributions must be ``.egg`` files; distribute and pip distributions +should be `.tar.gz` source distributions. + +Virtualenv will still download these packages if no satisfactory local +distributions are found. + +If you are really concerned about virtualenv fetching these packages +from the Internet and want to ensure that it never will, you can also +provide an option ``--never-download`` like so:: + + $ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV + +If this option is provided, virtualenv will never try to download +setuptools/distribute or pip. Instead, it will exit with status code 1 +if it fails to find local distributions for any of these required +packages. + Compare & Contrast with Alternatives ------------------------------------ @@ -306,6 +356,43 @@ I *strongly* recommend anyone doing application development or deployment use one of these tools. +Contributing +------------ + +Refer to the `contributing to pip`_ documentation - it applies equally to +virtualenv. + +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. + +.. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html + +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 nose instead. Create a virtualenv, and install required +packages:: + + $ pip install nose mock + +Run nosetests:: + + $ nosetests + +Or select just a single test file to run:: + + $ nosetests tests.test_virtualenv + + Other Documentation and Links ----------------------------- diff -Nru python-virtualenv-1.4.9/docs/license.txt python-virtualenv-1.6.4/docs/license.txt --- python-virtualenv-1.4.9/docs/license.txt 2009-11-10 18:06:49.000000000 +0000 +++ python-virtualenv-1.6.4/docs/license.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -License -======= - -Copyright (c) 2007 Ian Bicking and Contributors - -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. diff -Nru python-virtualenv-1.4.9/docs/news.txt python-virtualenv-1.6.4/docs/news.txt --- python-virtualenv-1.4.9/docs/news.txt 2010-05-27 21:58:50.000000000 +0000 +++ python-virtualenv-1.6.4/docs/news.txt 2011-07-21 16:52:01.000000000 +0000 @@ -1,13 +1,111 @@ Changes & News -------------- +Next release (1.7) schedule +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Beta release mid-July 2011, final release early August. + +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 intepreter (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`` @@ -21,7 +119,7 @@ * Include pip 0.7.1 1.4.7 ------ +~~~~~ * Include pip 0.7 diff -Nru python-virtualenv-1.4.9/LICENSE.txt python-virtualenv-1.6.4/LICENSE.txt --- python-virtualenv-1.4.9/LICENSE.txt 1970-01-01 00:00:00.000000000 +0000 +++ python-virtualenv-1.6.4/LICENSE.txt 2011-03-16 16:55:59.000000000 +0000 @@ -0,0 +1,22 @@ +Copyright (c) 2007 Ian Bicking and Contributors +Copyright (c) 2009 Ian Bicking, The Open Planning Project +Copyright (c) 2011 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. diff -Nru python-virtualenv-1.4.9/MANIFEST.in python-virtualenv-1.6.4/MANIFEST.in --- python-virtualenv-1.4.9/MANIFEST.in 2010-03-10 18:35:33.000000000 +0000 +++ python-virtualenv-1.6.4/MANIFEST.in 2011-03-16 16:56:29.000000000 +0000 @@ -5,3 +5,5 @@ recursive-exclude docs/_templates *.* include virtualenv_support/__init__.py include *.py +include AUTHORS.txt +include LICENSE.txt \ No newline at end of file diff -Nru python-virtualenv-1.4.9/PKG-INFO python-virtualenv-1.6.4/PKG-INFO --- python-virtualenv-1.4.9/PKG-INFO 2010-05-27 22:00:18.000000000 +0000 +++ python-virtualenv-1.6.4/PKG-INFO 2011-07-21 16:52:15.000000000 +0000 @@ -1,10 +1,10 @@ Metadata-Version: 1.0 Name: virtualenv -Version: 1.4.9 +Version: 1.6.4 Summary: Virtual Python Environment builder -Home-page: http://virtualenv.openplans.org -Author: Ian Bicking -Author-email: ianb@colorstudy.com +Home-page: http://www.virtualenv.org +Author: Jannis Leidel, Carl Meyer and Brian Rosner +Author-email: python-virtualenv@groups.google.com License: MIT Description: @@ -16,14 +16,15 @@ of `virtual-python `_. - It is written by Ian Bicking, and sponsored by the `Open Planning - Project `_. It is licensed under an - `MIT-style permissive license `_. - - You can install it with ``easy_install virtualenv``, or from the `hg - repository `_ or from a `tarball - `_ - ``easy_install virtualenv==tip``. + It was written by Ian Bicking, sponsored by the `Open Planning + Project `_ and is now maintained by a + `group of developers `_. + It is licensed under an + `MIT-style permissive license `_. + + You can install it with ``easy_install virtualenv``, or the `latest + development version `_ + with ``easy_install virtualenv==dev``. What It Does ------------ @@ -34,7 +35,7 @@ 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.4/site-packages`` (or whatever your + 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. @@ -49,40 +50,49 @@ 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 use the globally installed libraries either). + doesn't access the globally installed libraries either). The basic usage is:: - $ python virtualenv.py ENV + $ python virtualenv.py ENV If you install it you can also just do ``virtualenv ENV``. - This creates ``ENV/lib/python2.4/site-packages`` (or - ``ENV/lib/python2.5/site-packages`` on Python 2.5, etc), where any - libraries you install will go. It also creates ``ENV/bin/python``, - which is a Python interpreter that uses this environment. Anytime you - use that interpreter (including when a script has - ``#!/path/to/ENV/bin/python`` in it) the libraries in that environment - will be used. (**Note for Windows:** scripts and executables on - Windows go in ``ENV\Scripts\``; everywhere you see ``bin/`` replace it - with ``Scripts\``) - - It also installs `Setuptools - `_ for you, and if - you use ``ENV/bin/easy_install`` the packages will be installed into - the environment. + This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you + install will go. It also creates ``ENV/bin/python``, which is a Python + interpreter that uses this environment. Anytime you use that interpreter + (including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries + in that environment will be used. + + It also installs either `Setuptools + `_ or `distribute + `_ into the environment. To use + Distribute instead of setuptools, just call virtualenv like this:: - If you use the ``--distribute`` option, it will install `distribute - `_ for you, instead of setuptools, - and if you use `ENV/bin/easy_install`` the packages will be installed into the - environment. + $ python virtualenv.py --distribute ENV - To use Distribute just call virtualenv like this:: + You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE. - $ python virtualenv.py --distribute ENV + A new virtualenv also includes the `pip `_ + installer, so you can use `ENV/bin/pip`` to install additional packages into + the environment. - You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE (since 1.4.4) - and be a good Comrade + 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 `_ library installed. + + PyPy Support + ~~~~~~~~~~~~ + + Beginning with virtualenv version 1.5 `PyPy `_ is + supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5. + To use PyPy 1.5, you need a version of virtualenv >= 1.6.1. Creating Your Own Bootstrap Scripts ----------------------------------- @@ -108,53 +118,53 @@ If you include these functions, they will be called: ``extend_parser(optparse_parser)``: - You can add or remove options from the parser here. + You can add or remove options from the parser here. ``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]``). + 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]``). ``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]) + 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. + 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) + 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 `_. @@ -167,15 +177,17 @@ On Posix systems you can do:: - $ source bin/activate + $ source bin/activate + + This will change your ``$PATH`` to point to 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. - This will change your ``$PATH`` to point to the virtualenv ``bin/`` - directory. Unlike workingenv, this is all it - does; it's a convenience. But if you use the complete path like - ``/path/to/env/bin/python script.py`` you do not need to activate the - environment first. You have to use ``source`` because it changes the - environment in-place. After activating an environment you can use the - function ``deactivate`` to undo the changes. + After activating an environment you can use the function ``deactivate`` to + undo the changes to your ``$PATH``. The ``activate`` script will also modify your shell prompt to indicate which environment is currently active. You can disable this behavior, @@ -186,7 +198,7 @@ On Windows you just do:: - > \path\to\env\bin\activate.bat + > \path\to\env\Scripts\activate.bat And use ``deactivate.bat`` to undo the changes. @@ -213,16 +225,17 @@ 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)) + 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, - 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. + 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 -- this technique does not support the + ``--no-site-packages`` flag. 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -236,7 +249,7 @@ You can fix up an environment to make it relocatable with the command:: - $ virtualenv --relocatable ENV + $ virtualenv --relocatable ENV This will make some of the files created by setuptools or distribute use relative paths, and will change all the scripts to use ``activate_this.py`` @@ -262,73 +275,553 @@ Currently the ``--no-site-packages`` option will not be honored if you use this on an environment. + The ``--extra-search-dir`` Option + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + When it creates a new environment, virtualenv installs either + setuptools or distribute, and pip. In normal operation, the latest + releases of these packages are fetched from the `Python Package Index + `_ (PyPI). In some circumstances, this + behavior may not be wanted, for example if you are using virtualenv + during a deployment and do not want to depend on Internet access and + PyPI availability. + + As an alternative, you can provide your own versions of setuptools, + distribute and/or pip on the filesystem, and tell virtualenv to use + those distributions instead of downloading them from the Internet. 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, distribute and/or pip distributions. Setuptools + distributions must be ``.egg`` files; distribute and pip distributions + should be `.tar.gz` source distributions. + + Virtualenv will still download these packages if no satisfactory local + distributions are found. + + If you are really concerned about virtualenv fetching these packages + from the Internet and want to ensure that it never will, you can also + provide an option ``--never-download`` like so:: + + $ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV + + If this option is provided, virtualenv will never try to download + setuptools/distribute or pip. Instead, it will exit with status code 1 + if it fails to find local distributions for any of these required + packages. + 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. + 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 - `_ - 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. + `_ + 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 `_ 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). + 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. + Contributing + ------------ + + Refer to the `contributing to pip`_ documentation - it applies equally to + virtualenv. + + 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. + + .. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html + + 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 nose instead. Create a virtualenv, and install required + packages:: + + $ pip install nose mock + + Run nosetests:: + + $ nosetests + + Or select just a single test file to run:: + + $ nosetests tests.test_virtualenv + + Other Documentation and Links ----------------------------- * James Gardner has written a tutorial on using `virtualenv with - Pylons - `_. + Pylons + `_. * `Blog announcement - `_. + `_. * Doug Hellmann wrote a description of his `command-line work flow - using virtualenv (virtualenvwrapper) - `_ - including some handy scripts to make working with multiple - environments easier. He also wrote `an example of using virtualenv - to try IPython - `_. + using virtualenv (virtualenvwrapper) + `_ + including some handy scripts to make working with multiple + environments easier. He also wrote `an example of using virtualenv + to try IPython + `_. * Chris Perkins created a `showmedo video including virtualenv - `_. + `_. * `Using virtualenv with mod_wsgi - `_. + `_. * `virtualenv commands - `_ for some more - workflow-related tools around virtualenv. + `_ for some more + workflow-related tools around virtualenv. + + Changes & News + -------------- + + Next release (1.7) schedule + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Beta release mid-July 2011, final release early August. + + 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 intepreter (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_USE_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 `_ + 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 + `_ 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 <./index.html#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 + `_ + (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 `_. + * 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! + Keywords: setuptools deployment installation distutils Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 diff -Nru python-virtualenv-1.4.9/setup.py python-virtualenv-1.6.4/setup.py --- python-virtualenv-1.4.9/setup.py 2009-12-01 05:43:59.000000000 +0000 +++ python-virtualenv-1.6.4/setup.py 2011-07-21 16:52:01.000000000 +0000 @@ -7,62 +7,52 @@ 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"' + print('Note: without Setuptools installed you will have to use "python -m virtualenv ENV"') + kw = {} else: kw = {'scripts': ['scripts/virtualenv']} -import re here = os.path.dirname(os.path.abspath(__file__)) -## Figure out the version from virtualenv.py: -version_re = re.compile( - r'virtualenv_version = "(.*?)"') -fp = open(os.path.join(here, 'virtualenv.py')) -version = None -for line in fp: - match = version_re.search(line) - if match: - version = match.group(1) - break -else: - raise Exception("Cannot find version in virtualenv.py") -fp.close() - ## Get long_description from index.txt: f = open(os.path.join(here, 'docs', 'index.txt')) long_description = f.read().strip() long_description = long_description.split('split here', 1)[1] f.close() - -## A warning just for Ian (related to distribution): -try: - import getpass -except ImportError: - is_ianb = False -else: - is_ianb = getpass.getuser() == 'ianb' - -if is_ianb and 'register' in sys.argv: - if 'hg tip\n~~~~~~' in long_description: - print >> sys.stderr, ( - "WARNING: hg tip is in index.txt") +f = open(os.path.join(here, 'docs', 'news.txt')) +long_description += "\n\n" + f.read() +f.close() setup(name='virtualenv', - version=version, + # If you change the version here, change it in virtualenv.py and + # docs/conf.py as well + version="1.6.4", description="Virtual Python Environment builder", long_description=long_description, classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', - ], + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.4', + 'Programming Language :: Python :: 2.5', + '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', - url='http://virtualenv.openplans.org', + maintainer='Jannis Leidel, Carl Meyer and Brian Rosner', + maintainer_email='python-virtualenv@groups.google.com', + url='http://www.virtualenv.org', license='MIT', py_modules=['virtualenv'], packages=['virtualenv_support'], package_data={'virtualenv_support': ['*-py%s.egg' % sys.version[:3], '*.tar.gz']}, + test_suite='nose.collector', + tests_require=['nose', 'Mock'], **kw ) diff -Nru python-virtualenv-1.4.9/virtualenv.egg-info/PKG-INFO python-virtualenv-1.6.4/virtualenv.egg-info/PKG-INFO --- python-virtualenv-1.4.9/virtualenv.egg-info/PKG-INFO 2010-05-27 22:00:18.000000000 +0000 +++ python-virtualenv-1.6.4/virtualenv.egg-info/PKG-INFO 2011-07-21 16:52:15.000000000 +0000 @@ -1,10 +1,10 @@ Metadata-Version: 1.0 Name: virtualenv -Version: 1.4.9 +Version: 1.6.4 Summary: Virtual Python Environment builder -Home-page: http://virtualenv.openplans.org -Author: Ian Bicking -Author-email: ianb@colorstudy.com +Home-page: http://www.virtualenv.org +Author: Jannis Leidel, Carl Meyer and Brian Rosner +Author-email: python-virtualenv@groups.google.com License: MIT Description: @@ -16,14 +16,15 @@ of `virtual-python `_. - It is written by Ian Bicking, and sponsored by the `Open Planning - Project `_. It is licensed under an - `MIT-style permissive license `_. - - You can install it with ``easy_install virtualenv``, or from the `hg - repository `_ or from a `tarball - `_ - ``easy_install virtualenv==tip``. + It was written by Ian Bicking, sponsored by the `Open Planning + Project `_ and is now maintained by a + `group of developers `_. + It is licensed under an + `MIT-style permissive license `_. + + You can install it with ``easy_install virtualenv``, or the `latest + development version `_ + with ``easy_install virtualenv==dev``. What It Does ------------ @@ -34,7 +35,7 @@ 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.4/site-packages`` (or whatever your + 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. @@ -49,40 +50,49 @@ 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 use the globally installed libraries either). + doesn't access the globally installed libraries either). The basic usage is:: - $ python virtualenv.py ENV + $ python virtualenv.py ENV If you install it you can also just do ``virtualenv ENV``. - This creates ``ENV/lib/python2.4/site-packages`` (or - ``ENV/lib/python2.5/site-packages`` on Python 2.5, etc), where any - libraries you install will go. It also creates ``ENV/bin/python``, - which is a Python interpreter that uses this environment. Anytime you - use that interpreter (including when a script has - ``#!/path/to/ENV/bin/python`` in it) the libraries in that environment - will be used. (**Note for Windows:** scripts and executables on - Windows go in ``ENV\Scripts\``; everywhere you see ``bin/`` replace it - with ``Scripts\``) - - It also installs `Setuptools - `_ for you, and if - you use ``ENV/bin/easy_install`` the packages will be installed into - the environment. + This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you + install will go. It also creates ``ENV/bin/python``, which is a Python + interpreter that uses this environment. Anytime you use that interpreter + (including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries + in that environment will be used. + + It also installs either `Setuptools + `_ or `distribute + `_ into the environment. To use + Distribute instead of setuptools, just call virtualenv like this:: - If you use the ``--distribute`` option, it will install `distribute - `_ for you, instead of setuptools, - and if you use `ENV/bin/easy_install`` the packages will be installed into the - environment. + $ python virtualenv.py --distribute ENV - To use Distribute just call virtualenv like this:: + You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE. - $ python virtualenv.py --distribute ENV + A new virtualenv also includes the `pip `_ + installer, so you can use `ENV/bin/pip`` to install additional packages into + the environment. - You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE (since 1.4.4) - and be a good Comrade + 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 `_ library installed. + + PyPy Support + ~~~~~~~~~~~~ + + Beginning with virtualenv version 1.5 `PyPy `_ is + supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5. + To use PyPy 1.5, you need a version of virtualenv >= 1.6.1. Creating Your Own Bootstrap Scripts ----------------------------------- @@ -108,53 +118,53 @@ If you include these functions, they will be called: ``extend_parser(optparse_parser)``: - You can add or remove options from the parser here. + You can add or remove options from the parser here. ``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]``). + 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]``). ``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]) + 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. + 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) + 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 `_. @@ -167,15 +177,17 @@ On Posix systems you can do:: - $ source bin/activate + $ source bin/activate + + This will change your ``$PATH`` to point to 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. - This will change your ``$PATH`` to point to the virtualenv ``bin/`` - directory. Unlike workingenv, this is all it - does; it's a convenience. But if you use the complete path like - ``/path/to/env/bin/python script.py`` you do not need to activate the - environment first. You have to use ``source`` because it changes the - environment in-place. After activating an environment you can use the - function ``deactivate`` to undo the changes. + After activating an environment you can use the function ``deactivate`` to + undo the changes to your ``$PATH``. The ``activate`` script will also modify your shell prompt to indicate which environment is currently active. You can disable this behavior, @@ -186,7 +198,7 @@ On Windows you just do:: - > \path\to\env\bin\activate.bat + > \path\to\env\Scripts\activate.bat And use ``deactivate.bat`` to undo the changes. @@ -213,16 +225,17 @@ 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)) + 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, - 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. + 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 -- this technique does not support the + ``--no-site-packages`` flag. 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -236,7 +249,7 @@ You can fix up an environment to make it relocatable with the command:: - $ virtualenv --relocatable ENV + $ virtualenv --relocatable ENV This will make some of the files created by setuptools or distribute use relative paths, and will change all the scripts to use ``activate_this.py`` @@ -262,73 +275,553 @@ Currently the ``--no-site-packages`` option will not be honored if you use this on an environment. + The ``--extra-search-dir`` Option + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + When it creates a new environment, virtualenv installs either + setuptools or distribute, and pip. In normal operation, the latest + releases of these packages are fetched from the `Python Package Index + `_ (PyPI). In some circumstances, this + behavior may not be wanted, for example if you are using virtualenv + during a deployment and do not want to depend on Internet access and + PyPI availability. + + As an alternative, you can provide your own versions of setuptools, + distribute and/or pip on the filesystem, and tell virtualenv to use + those distributions instead of downloading them from the Internet. 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, distribute and/or pip distributions. Setuptools + distributions must be ``.egg`` files; distribute and pip distributions + should be `.tar.gz` source distributions. + + Virtualenv will still download these packages if no satisfactory local + distributions are found. + + If you are really concerned about virtualenv fetching these packages + from the Internet and want to ensure that it never will, you can also + provide an option ``--never-download`` like so:: + + $ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV + + If this option is provided, virtualenv will never try to download + setuptools/distribute or pip. Instead, it will exit with status code 1 + if it fails to find local distributions for any of these required + packages. + 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. + 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 - `_ - 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. + `_ + 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 `_ 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). + 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. + Contributing + ------------ + + Refer to the `contributing to pip`_ documentation - it applies equally to + virtualenv. + + 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. + + .. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html + + 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 nose instead. Create a virtualenv, and install required + packages:: + + $ pip install nose mock + + Run nosetests:: + + $ nosetests + + Or select just a single test file to run:: + + $ nosetests tests.test_virtualenv + + Other Documentation and Links ----------------------------- * James Gardner has written a tutorial on using `virtualenv with - Pylons - `_. + Pylons + `_. * `Blog announcement - `_. + `_. * Doug Hellmann wrote a description of his `command-line work flow - using virtualenv (virtualenvwrapper) - `_ - including some handy scripts to make working with multiple - environments easier. He also wrote `an example of using virtualenv - to try IPython - `_. + using virtualenv (virtualenvwrapper) + `_ + including some handy scripts to make working with multiple + environments easier. He also wrote `an example of using virtualenv + to try IPython + `_. * Chris Perkins created a `showmedo video including virtualenv - `_. + `_. * `Using virtualenv with mod_wsgi - `_. + `_. * `virtualenv commands - `_ for some more - workflow-related tools around virtualenv. + `_ for some more + workflow-related tools around virtualenv. + + Changes & News + -------------- + + Next release (1.7) schedule + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Beta release mid-July 2011, final release early August. + + 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 intepreter (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_USE_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 `_ + 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 + `_ 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 <./index.html#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 + `_ + (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 `_. + * 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! + Keywords: setuptools deployment installation distutils Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 diff -Nru python-virtualenv-1.4.9/virtualenv.egg-info/SOURCES.txt python-virtualenv-1.6.4/virtualenv.egg-info/SOURCES.txt --- python-virtualenv-1.4.9/virtualenv.egg-info/SOURCES.txt 2010-05-27 22:00:18.000000000 +0000 +++ python-virtualenv-1.6.4/virtualenv.egg-info/SOURCES.txt 2011-07-21 16:52:15.000000000 +0000 @@ -1,13 +1,10 @@ +AUTHORS.txt +LICENSE.txt MANIFEST.in setup.py virtualenv.py -./virtualenv.py docs/index.txt -docs/license.txt docs/news.txt -docs/_build/_sources/index.txt -docs/_build/_sources/license.txt -docs/_build/_sources/news.txt scripts/virtualenv virtualenv.egg-info/PKG-INFO virtualenv.egg-info/SOURCES.txt @@ -16,8 +13,9 @@ virtualenv.egg-info/not-zip-safe virtualenv.egg-info/top_level.txt virtualenv_support/__init__.py -virtualenv_support/distribute-0.6.8.tar.gz -virtualenv_support/pip-0.7.2.tar.gz +virtualenv_support/distribute-0.6.19.tar.gz +virtualenv_support/pip-1.0.2.tar.gz virtualenv_support/setuptools-0.6c11-py2.4.egg virtualenv_support/setuptools-0.6c11-py2.5.egg -virtualenv_support/setuptools-0.6c11-py2.6.egg \ No newline at end of file +virtualenv_support/setuptools-0.6c11-py2.6.egg +virtualenv_support/setuptools-0.6c11-py2.7.egg \ No newline at end of file diff -Nru python-virtualenv-1.4.9/virtualenv.py python-virtualenv-1.6.4/virtualenv.py --- python-virtualenv-1.4.9/virtualenv.py 2010-05-27 21:59:15.000000000 +0000 +++ python-virtualenv-1.6.4/virtualenv.py 2011-07-21 16:52:01.000000000 +0000 @@ -2,22 +2,28 @@ """Create a "virtual" Python installation """ -virtualenv_version = "1.4.9" +# If you change the version here, change it in setup.py +# and docs/conf.py as well. +virtualenv_version = "1.6.4" +import base64 import sys import os import optparse import re import shutil import logging +import tempfile +import zlib +import errno import distutils.sysconfig try: import subprocess -except ImportError, e: +except ImportError: if sys.version_info <= (2, 3): - print 'ERROR: %s' % e - print 'ERROR: this script requires Python 2.4 or greater; or at least the subprocess module.' - print 'If you copy subprocess.py from a newer version of Python this script will probably work' + print('ERROR: %s' % sys.exc_info()[1]) + print('ERROR: this script requires Python 2.4 or greater; or at least the subprocess module.') + print('If you copy subprocess.py from a newer version of Python this script will probably work') sys.exit(101) else: raise @@ -25,22 +31,208 @@ set except NameError: from sets import Set as set +try: + basestring +except NameError: + basestring = str join = os.path.join py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1]) + is_jython = sys.platform.startswith('java') -expected_exe = is_jython and 'jython' or 'python' +is_pypy = hasattr(sys, 'pypy_version_info') +is_win = (sys.platform == 'win32') +abiflags = getattr(sys, 'abiflags', '') + +if is_pypy: + expected_exe = 'pypy' +elif is_jython: + expected_exe = 'jython' +else: + expected_exe = 'python' + REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath', 'fnmatch', 'locale', 'encodings', 'codecs', 'stat', 'UserDict', 'readline', 'copy_reg', 'types', 're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile', - 'lib-dynload', 'config', 'zlib'] + 'zlib'] + +REQUIRED_FILES = ['lib-dynload', 'config'] -if sys.version_info[:2] >= (2, 6): - REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc']) -if sys.version_info[:2] <= (2, 3): - REQUIRED_MODULES.extend(['sets', '__future__']) +majver, minver = sys.version_info[:2] +if majver == 2: + if minver >= 6: + REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc']) + if minver >= 7: + REQUIRED_MODULES.extend(['_weakrefset']) + if minver <= 3: + REQUIRED_MODULES.extend(['sets', '__future__']) +elif majver == 3: + # Some extra modules are needed for Python 3, but different ones + # for different versions. + REQUIRED_MODULES.extend(['_abcoll', 'warnings', 'linecache', 'abc', 'io', + '_weakrefset', 'copyreg', 'tempfile', 'random', + '__future__', 'collections', 'keyword', 'tarfile', + 'shutil', 'struct', 'copy']) + if minver >= 2: + REQUIRED_FILES[-1] = 'config-%s' % majver + if minver == 3: + # The whole list of 3.3 modules is reproduced below - the current + # uncommented ones are required for 3.3 as of now, but more may be + # added as 3.3 development continues. + REQUIRED_MODULES.extend([ + #"aifc", + #"antigravity", + #"argparse", + #"ast", + #"asynchat", + #"asyncore", + "base64", + #"bdb", + #"binhex", + "bisect", + #"calendar", + #"cgi", + #"cgitb", + #"chunk", + #"cmd", + #"codeop", + #"code", + #"colorsys", + #"_compat_pickle", + #"compileall", + #"concurrent", + #"configparser", + #"contextlib", + #"cProfile", + #"crypt", + #"csv", + #"ctypes", + #"curses", + #"datetime", + #"dbm", + #"decimal", + #"difflib", + #"dis", + #"doctest", + #"dummy_threading", + "_dummy_thread", + #"email", + #"filecmp", + #"fileinput", + #"formatter", + #"fractions", + #"ftplib", + #"functools", + #"getopt", + #"getpass", + #"gettext", + #"glob", + #"gzip", + "hashlib", + "heapq", + "hmac", + #"html", + #"http", + #"idlelib", + #"imaplib", + #"imghdr", + #"importlib", + #"inspect", + #"json", + #"lib2to3", + #"logging", + #"macpath", + #"macurl2path", + #"mailbox", + #"mailcap", + #"_markupbase", + #"mimetypes", + #"modulefinder", + #"multiprocessing", + #"netrc", + #"nntplib", + #"nturl2path", + #"numbers", + #"opcode", + #"optparse", + #"os2emxpath", + #"pdb", + #"pickle", + #"pickletools", + #"pipes", + #"pkgutil", + #"platform", + #"plat-linux2", + #"plistlib", + #"poplib", + #"pprint", + #"profile", + #"pstats", + #"pty", + #"pyclbr", + #"py_compile", + #"pydoc_data", + #"pydoc", + #"_pyio", + #"queue", + #"quopri", + "reprlib", + "rlcompleter", + #"runpy", + #"sched", + #"shelve", + #"shlex", + #"smtpd", + #"smtplib", + #"sndhdr", + #"socket", + #"socketserver", + #"sqlite3", + #"ssl", + #"stringprep", + #"string", + #"_strptime", + #"subprocess", + #"sunau", + #"symbol", + #"symtable", + #"sysconfig", + #"tabnanny", + #"telnetlib", + #"test", + #"textwrap", + #"this", + #"_threading_local", + #"threading", + #"timeit", + #"tkinter", + #"tokenize", + #"token", + #"traceback", + #"trace", + #"tty", + #"turtledemo", + #"turtle", + #"unittest", + #"urllib", + #"uuid", + #"uu", + #"wave", + "weakref", + #"webbrowser", + #"wsgiref", + #"xdrlib", + #"xml", + #"xmlrpc", + #"zipfile", + ]) + +if is_pypy: + # these are needed to correctly display the exceptions that may happen + # during the bootstrap + REQUIRED_MODULES.extend(['traceback', 'linecache']) class Logger(object): @@ -147,7 +339,7 @@ def level_matches(self, level, consumer_level): """ - >>> l = Logger() + >>> l = Logger([]) >>> l.level_matches(3, 4) False >>> l.level_matches(3, 2) @@ -165,7 +357,7 @@ start, stop = level.start, level.stop if start is not None and start > consumer_level: return False - if stop is not None or stop <= consumer_level: + if stop is not None and stop <= consumer_level: return False return True else: @@ -182,6 +374,10 @@ level_for_integer = classmethod(level_for_integer) +# create a silent logger just to prevent this from being undefined +# will be overridden with requested verbosity main() is called. +logger = Logger([(Logger.LEVELS[-1], sys.stdout)]) + def mkdir(path): if not os.path.exists(path): logger.info('Creating %s', path) @@ -189,6 +385,12 @@ else: logger.info('Directory %s already exists', path) +def copyfileordir(src, dest): + if os.path.isdir(src): + shutil.copytree(src, dest, True) + else: + shutil.copy2(src, dest) + def copyfile(src, dest, symlink=True): if not os.path.exists(src): # Some bad symlink in the src @@ -200,21 +402,26 @@ if not os.path.exists(os.path.dirname(dest)): logger.info('Creating parent directories for %s' % os.path.dirname(dest)) os.makedirs(os.path.dirname(dest)) + if not os.path.islink(src): + srcpath = os.path.abspath(src) + else: + srcpath = os.readlink(src) if symlink and hasattr(os, 'symlink'): logger.info('Symlinking %s', dest) - os.symlink(os.path.abspath(src), dest) + try: + os.symlink(srcpath, dest) + except (OSError, NotImplementedError): + logger.info('Symlinking failed, copying to %s', dest) + copyfileordir(src, dest) else: logger.info('Copying to %s', dest) - if os.path.isdir(src): - shutil.copytree(src, dest, True) - else: - shutil.copy2(src, dest) + copyfileordir(src, dest) def writefile(dest, content, overwrite=True): if not os.path.exists(dest): logger.info('Writing %s', dest) f = open(dest, 'wb') - f.write(content) + f.write(content.encode('utf-8')) f.close() return else: @@ -227,7 +434,7 @@ return logger.notify('Overwriting %s with new content', dest) f = open(dest, 'wb') - f.write(content) + f.write(content.encode('utf-8')) f.close() else: logger.info('Content %s already in place', dest) @@ -241,8 +448,8 @@ def make_exe(fn): if hasattr(os, 'chmod'): - oldmode = os.stat(fn).st_mode & 07777 - newmode = (oldmode | 0555) & 07777 + oldmode = os.stat(fn).st_mode & 0xFFF # 0o7777 + newmode = (oldmode | 0x16D) & 0xFFF # 0o555, 0o7777 os.chmod(fn, newmode) logger.info('Changed mode of %s to %s', fn, oct(newmode)) @@ -252,7 +459,12 @@ return join(dir, filename) return filename -def _install_req(py_executable, unzip=False, distribute=False): +def _install_req(py_executable, unzip=False, distribute=False, + search_dirs=None, never_download=False): + + if search_dirs is None: + search_dirs = file_search_dirs() + if not distribute: setup_fn = 'setuptools-0.6c11-py%s.egg' % sys.version[:3] project_name = 'setuptools' @@ -260,22 +472,34 @@ source = None else: setup_fn = None - source = 'distribute-0.6.8.tar.gz' + source = 'distribute-0.6.19.tar.gz' project_name = 'distribute' bootstrap_script = DISTRIBUTE_SETUP_PY - try: - # check if the global Python has distribute installed or plain - # setuptools - import pkg_resources - if not hasattr(pkg_resources, '_distribute'): - location = os.path.dirname(pkg_resources.__file__) - logger.notify("A globally installed setuptools was found (in %s)" % location) - logger.notify("Use the --no-site-packages option to use distribute in " - "the virtualenv.") - except ImportError: - pass - search_dirs = file_search_dirs() + # If we are running under -p, we need to remove the current + # directory from sys.path temporarily here, so that we + # definitely get the pkg_resources from the site directory of + # the interpreter we are running under, not the one + # virtualenv.py is installed under (which might lead to py2/py3 + # incompatibility issues) + _prev_sys_path = sys.path + if os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'): + sys.path = sys.path[1:] + + try: + try: + # check if the global Python has distribute installed or plain + # setuptools + import pkg_resources + if not hasattr(pkg_resources, '_distribute'): + location = os.path.dirname(pkg_resources.__file__) + logger.notify("A globally installed setuptools was found (in %s)" % location) + logger.notify("Use the --no-site-packages option to use distribute in " + "the virtualenv.") + except ImportError: + pass + finally: + sys.path = _prev_sys_path if setup_fn is not None: setup_fn = _find_file(setup_fn, search_dirs) @@ -286,7 +510,6 @@ if is_jython and os._name == 'nt': # Jython's .bat sys.executable can't handle a command line # argument with newlines - import tempfile fd, ez_setup = tempfile.mkstemp('.py') os.write(fd, bootstrap_script) os.close(fd) @@ -296,6 +519,7 @@ if unzip: cmd.append('--always-unzip') env = {} + remove_from_env = [] if logger.stdout_level_matches(logger.DEBUG): cmd.append('-v') @@ -310,8 +534,23 @@ else: # the source is found, let's chdir if source is not None and os.path.exists(source): + logger.info('Using existing %s egg: %s' % (project_name, source)) os.chdir(os.path.dirname(source)) + # in this case, we want to be sure that PYTHONPATH is unset (not + # just empty, really unset), else CPython tries to import the + # site.py that it's in virtualenv_support + remove_from_env.append('PYTHONPATH') else: + if never_download: + logger.fatal("Can't find any local distributions of %s to install " + "and --never-download is set. Either re-run virtualenv " + "without the --never-download option, or place a %s " + "distribution (%s) in one of these " + "locations: %r" % (project_name, project_name, + setup_fn or source, + search_dirs)) + sys.exit(1) + logger.info('No %s egg found; downloading' % project_name) cmd.extend(['--always-copy', '-U', project_name]) logger.start_progress('Installing %s...' % project_name) @@ -324,16 +563,17 @@ return filter_ez_setup(line, project_name) if not os.access(os.getcwd(), os.W_OK): - cwd = '/tmp' + cwd = tempfile.mkdtemp() if source is not None and os.path.exists(source): # the current working dir is hostile, let's copy the - # tarball to /tmp + # tarball to a temp dir target = os.path.join(cwd, os.path.split(source)[-1]) shutil.copy(source, target) try: call_subprocess(cmd, show_stdout=False, filter_stdout=_filter_ez_setup, extra_env=env, + remove_from_env=remove_from_env, cwd=cwd) finally: logger.indent -= 2 @@ -357,19 +597,28 @@ dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support')) return [d for d in dirs if os.path.isdir(d)] -def install_setuptools(py_executable, unzip=False): - _install_req(py_executable, unzip) - -def install_distribute(py_executable, unzip=False): - _install_req(py_executable, unzip, distribute=True) +def install_setuptools(py_executable, unzip=False, + search_dirs=None, never_download=False): + _install_req(py_executable, unzip, + search_dirs=search_dirs, never_download=never_download) + +def install_distribute(py_executable, unzip=False, + search_dirs=None, never_download=False): + _install_req(py_executable, unzip, distribute=True, + search_dirs=search_dirs, never_download=never_download) _pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I) -def install_pip(py_executable): +def install_pip(py_executable, search_dirs=None, never_download=False): + if search_dirs is None: + search_dirs = file_search_dirs() + filenames = [] - for dir in file_search_dirs(): + for dir in search_dirs: filenames.extend([join(dir, fn) for fn in os.listdir(dir) if _pip_re.search(fn)]) - filenames.sort(key=lambda x: os.path.basename(x).lower()) + filenames = [(os.path.basename(filename).lower(), i, filename) for i, filename in enumerate(filenames)] + filenames.sort() + filenames = [filename for basename, i, filename in filenames] if not filenames: filename = 'pip' else: @@ -379,9 +628,18 @@ easy_install_script = 'easy_install-script.py' cmd = [py_executable, join(os.path.dirname(py_executable), easy_install_script), filename] if filename == 'pip': + if never_download: + logger.fatal("Can't find any local distributions of pip to install " + "and --never-download is set. Either re-run virtualenv " + "without the --never-download option, or place a pip " + "source distribution (zip/tar.gz/tar.bz2) in one of these " + "locations: %r" % search_dirs) + sys.exit(1) logger.info('Installing pip from network...') else: - logger.info('Installing %s' % os.path.basename(filename)) + logger.info('Installing existing %s distribution: %s' % ( + os.path.basename(filename), filename)) + logger.start_progress('Installing pip...') logger.indent += 2 def _filter_setup(line): return filter_ez_setup(line, 'pip') @@ -390,6 +648,7 @@ filter_stdout=_filter_setup) finally: logger.indent -= 2 + logger.end_progress() def filter_ez_setup(line, project_name='setuptools'): if not line.strip(): @@ -467,9 +726,30 @@ '--distribute', dest='use_distribute', action='store_true', - help='Use Distribute instead of Setuptools. Set environ variable' + help='Use Distribute instead of Setuptools. Set environ variable ' 'VIRTUALENV_USE_DISTRIBUTE to make it the default ') + default_search_dirs = file_search_dirs() + parser.add_option( + '--extra-search-dir', + dest="search_dirs", + action="append", + default=default_search_dirs, + help="Directory to look for setuptools/distribute/pip distributions in. " + "You can add any number of additional --extra-search-dir paths.") + + parser.add_option( + '--never-download', + dest="never_download", + action="store_true", + help="Never download anything from the network. Instead, virtualenv will fail " + "if local distributions of setuptools/distribute/pip are not present.") + + parser.add_option( + '--prompt=', + dest='prompt', + help='Provides an alternative prompt prefix for this environment') + if 'extend_parser' in globals(): extend_parser(parser) @@ -494,15 +774,16 @@ file = __file__ if file.endswith('.pyc'): file = file[:-1] - os.execvpe(interpreter, [interpreter, file] + sys.argv[1:], env) + popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env) + raise SystemExit(popen.wait()) if not args: - print 'You must provide a DEST_DIR' + print('You must provide a DEST_DIR') parser.print_help() sys.exit(2) if len(args) > 1: - print 'There must be only one argument: DEST_DIR (you gave %s)' % ( - ' '.join(args)) + print('There must be only one argument: DEST_DIR (you gave %s)' % ( + ' '.join(args))) parser.print_help() sys.exit(2) @@ -523,17 +804,21 @@ create_environment(home_dir, site_packages=not options.no_site_packages, clear=options.clear, unzip_setuptools=options.unzip_setuptools, - use_distribute=options.use_distribute) + use_distribute=options.use_distribute or majver > 2, + prompt=options.prompt, + search_dirs=options.search_dirs, + never_download=options.never_download) if 'after_install' in globals(): after_install(options, home_dir) def call_subprocess(cmd, show_stdout=True, filter_stdout=None, cwd=None, - raise_on_returncode=True, extra_env=None): + raise_on_returncode=True, extra_env=None, + remove_from_env=None): cmd_parts = [] for part in cmd: - if len(part) > 40: - part = part[:30]+"..."+part[-5:] + if len(part) > 45: + part = part[:20]+"..."+part[-20:] if ' ' in part or '\n' in part or '"' in part or "'" in part: part = '"%s"' % part.replace('"', '\\"') cmd_parts.append(part) @@ -543,24 +828,30 @@ else: stdout = subprocess.PIPE logger.debug("Running command %s" % cmd_desc) - if extra_env: + if extra_env or remove_from_env: env = os.environ.copy() - env.update(extra_env) + if extra_env: + env.update(extra_env) + if remove_from_env: + for varname in remove_from_env: + env.pop(varname, None) else: env = None try: proc = subprocess.Popen( cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout, cwd=cwd, env=env) - except Exception, e: + except Exception: + e = sys.exc_info()[1] logger.fatal( "Error %s while executing command %s" % (e, cmd_desc)) raise all_output = [] if stdout is not None: stdout = proc.stdout + encoding = sys.getdefaultencoding() while 1: - line = stdout.readline() + line = stdout.readline().decode(encoding) if not line: break line = line.rstrip() @@ -592,7 +883,8 @@ def create_environment(home_dir, site_packages=True, clear=False, - unzip_setuptools=False, use_distribute=False): + unzip_setuptools=False, use_distribute=False, + prompt=None, search_dirs=None, never_download=False): """ Creates a new environment in ``home_dir``. @@ -608,16 +900,18 @@ home_dir, lib_dir, inc_dir, bin_dir, site_packages=site_packages, clear=clear)) - install_distutils(lib_dir, home_dir) + install_distutils(home_dir) if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'): - install_distribute(py_executable, unzip=unzip_setuptools) + install_distribute(py_executable, unzip=unzip_setuptools, + search_dirs=search_dirs, never_download=never_download) else: - install_setuptools(py_executable, unzip=unzip_setuptools) + install_setuptools(py_executable, unzip=unzip_setuptools, + search_dirs=search_dirs, never_download=never_download) - install_pip(py_executable) + install_pip(py_executable, search_dirs=search_dirs, never_download=never_download) - install_activate(home_dir, bin_dir) + install_activate(home_dir, bin_dir, prompt) def path_locations(home_dir): """Return the path locations for the environment (where libraries are, @@ -633,9 +927,9 @@ try: import win32api except ImportError: - print 'Error: the path "%s" has a space in it' % home_dir - print 'To handle these kinds of paths, the win32api module must be installed:' - print ' http://sourceforge.net/projects/pywin32/' + print('Error: the path "%s" has a space in it' % home_dir) + print('To handle these kinds of paths, the win32api module must be installed:') + print(' http://sourceforge.net/projects/pywin32/') sys.exit(3) home_dir = win32api.GetShortPathName(home_dir) lib_dir = join(home_dir, 'Lib') @@ -645,16 +939,64 @@ lib_dir = join(home_dir, 'Lib') inc_dir = join(home_dir, 'Include') bin_dir = join(home_dir, 'bin') + elif is_pypy: + lib_dir = home_dir + inc_dir = join(home_dir, 'include') + bin_dir = join(home_dir, 'bin') else: lib_dir = join(home_dir, 'lib', py_version) - inc_dir = join(home_dir, 'include', py_version) + inc_dir = join(home_dir, 'include', py_version + abiflags) bin_dir = join(home_dir, 'bin') return home_dir, lib_dir, inc_dir, bin_dir + +def change_prefix(filename, dst_prefix): + prefixes = [sys.prefix] + + if sys.platform == "darwin": + prefixes.extend(( + os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(sys.prefix, "Extras", "lib", "python"), + os.path.join("~", "Library", "Python", sys.version[:3], "site-packages"))) + + if hasattr(sys, 'real_prefix'): + prefixes.append(sys.real_prefix) + prefixes = list(map(os.path.abspath, prefixes)) + filename = os.path.abspath(filename) + for src_prefix in prefixes: + if filename.startswith(src_prefix): + _, relpath = filename.split(src_prefix, 1) + assert relpath[0] == os.sep + relpath = relpath[1:] + return join(dst_prefix, relpath) + assert False, "Filename %s does not start with any of these prefixes: %s" % \ + (filename, prefixes) + +def copy_required_modules(dst_prefix): + import imp + for modname in REQUIRED_MODULES: + if modname in sys.builtin_module_names: + logger.info("Ignoring built-in bootstrap module: %s" % modname) + continue + try: + f, filename, _ = imp.find_module(modname) + except ImportError: + logger.info("Cannot import bootstrap module: %s" % modname) + else: + if f is not None: + f.close() + dst_filename = change_prefix(filename, dst_prefix) + copyfile(filename, dst_filename) + if filename.endswith('.pyc'): + pyfile = filename[:-1] + if os.path.exists(pyfile): + copyfile(pyfile, dst_filename[:-1]) + + def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear): """Install just the base environment, no distutils patches etc""" if sys.executable.startswith(bin_dir): - print 'Please use the *system* python to run this script' + print('Please use the *system* python to run this script') return if clear: @@ -670,29 +1012,42 @@ prefix = sys.prefix mkdir(lib_dir) fix_lib64(lib_dir) + fix_local_scheme(home_dir) stdlib_dirs = [os.path.dirname(os.__file__)] if sys.platform == 'win32': stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs')) elif sys.platform == 'darwin': stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages')) - for stdlib_dir in stdlib_dirs: - if not os.path.isdir(stdlib_dir): - continue - if hasattr(os, 'symlink'): - logger.info('Symlinking Python bootstrap modules') - else: - logger.info('Copying Python bootstrap modules') - logger.indent += 2 - try: + if hasattr(os, 'symlink'): + logger.info('Symlinking Python bootstrap modules') + else: + logger.info('Copying Python bootstrap modules') + logger.indent += 2 + try: + # copy required files... + for stdlib_dir in stdlib_dirs: + if not os.path.isdir(stdlib_dir): + continue for fn in os.listdir(stdlib_dir): - if fn != 'site-packages' and os.path.splitext(fn)[0] in REQUIRED_MODULES: + bn = os.path.splitext(fn)[0] + if fn != 'site-packages' and bn in REQUIRED_FILES: copyfile(join(stdlib_dir, fn), join(lib_dir, fn)) - finally: - logger.indent -= 2 + # ...and modules + copy_required_modules(home_dir) + finally: + logger.indent -= 2 mkdir(join(lib_dir, 'site-packages')) - writefile(join(lib_dir, 'site.py'), SITE_PY) - writefile(join(lib_dir, 'orig-prefix.txt'), prefix) - site_packages_filename = join(lib_dir, 'no-global-site-packages.txt') + import site + site_filename = site.__file__ + if site_filename.endswith('.pyc'): + site_filename = site_filename[:-1] + elif site_filename.endswith('$py.class'): + site_filename = site_filename.replace('$py.class', '.py') + site_filename_dst = change_prefix(site_filename, home_dir) + site_dir = os.path.dirname(site_filename_dst) + writefile(site_filename_dst, SITE_PY) + writefile(join(site_dir, 'orig-prefix.txt'), prefix) + site_packages_filename = join(site_dir, 'no-global-site-packages.txt') if not site_packages: writefile(site_packages_filename, '') else: @@ -700,13 +1055,17 @@ logger.info('Deleting %s' % site_packages_filename) os.unlink(site_packages_filename) - stdinc_dir = join(prefix, 'include', py_version) + if is_pypy or is_win: + stdinc_dir = join(prefix, 'include') + else: + stdinc_dir = join(prefix, 'include', py_version + abiflags) if os.path.exists(stdinc_dir): copyfile(stdinc_dir, inc_dir) else: logger.debug('No include dir %s' % stdinc_dir) - if sys.exec_prefix != prefix: + # pypy never uses exec_prefix, just ignore it + if sys.exec_prefix != prefix and not is_pypy: if sys.platform == 'win32': exec_dir = join(sys.exec_prefix, 'lib') elif is_jython: @@ -755,6 +1114,11 @@ if os.path.exists(pythonw): logger.info('Also created pythonw.exe') shutil.copyfile(pythonw, os.path.join(os.path.dirname(py_executable), 'pythonw.exe')) + if is_pypy: + # make a symlink python --> pypy-c + python_executable = os.path.join(os.path.dirname(py_executable), 'python') + logger.info('Also created executable %s' % python_executable) + copyfile(py_executable, python_executable) if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe: secondary_exe = os.path.join(os.path.dirname(py_executable), @@ -779,10 +1143,9 @@ # the stub executable in ${sys.prefix}/bin # See http://groups.google.com/group/python-virtualenv/ # browse_thread/thread/17cab2f85da75951 - shutil.copy( - os.path.join( - prefix, 'Resources/Python.app/Contents/MacOS/%s' % os.path.basename(sys.executable)), - py_executable) + original_python = os.path.join( + prefix, 'Resources/Python.app/Contents/MacOS/Python') + shutil.copy(original_python, py_executable) # Copy the framework's dylib into the virtual # environment @@ -828,12 +1191,22 @@ # argument that has a space in it. Instead we have to quote # the value: py_executable = '"%s"' % py_executable - cmd = [py_executable, '-c', 'import sys; print sys.prefix'] + cmd = [py_executable, '-c', 'import sys; print(sys.prefix)'] logger.info('Testing executable with %s %s "%s"' % tuple(cmd)) - proc = subprocess.Popen(cmd, + try: + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - proc_stdout, proc_stderr = proc.communicate() - proc_stdout = os.path.normcase(os.path.abspath(proc_stdout.strip())) + proc_stdout, proc_stderr = proc.communicate() + except OSError: + e = sys.exc_info()[1] + if e.errno == errno.EACCES: + logger.fatal('ERROR: The executable %s could not be run: %s' % (py_executable, e)) + sys.exit(100) + else: + raise e + + proc_stdout = proc_stdout.strip().decode(sys.getdefaultencoding()) + proc_stdout = os.path.normcase(os.path.abspath(proc_stdout)) if proc_stdout != os.path.normcase(os.path.abspath(home_dir)): logger.fatal( 'ERROR: The executable %s is not functioning' % py_executable) @@ -856,7 +1229,7 @@ ## FIXME: really this should be calculated earlier return py_executable -def install_activate(home_dir, bin_dir): +def install_activate(home_dir, bin_dir, prompt=None): if sys.platform == 'win32' or is_jython and os._name == 'nt': files = {'activate.bat': ACTIVATE_BAT, 'deactivate.bat': DEACTIVATE_BAT} @@ -864,15 +1237,28 @@ files['activate'] = ACTIVATE_SH else: files = {'activate': ACTIVATE_SH} + + # suppling activate.fish in addition to, not instead of, the + # bash script support. + files['activate.fish'] = ACTIVATE_FISH + + # same for csh/tcsh support... + files['activate.csh'] = ACTIVATE_CSH + + + files['activate_this.py'] = ACTIVATE_THIS + vname = os.path.basename(os.path.abspath(home_dir)) for name, content in files.items(): + content = content.replace('__VIRTUAL_PROMPT__', prompt or '') + content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname) content = content.replace('__VIRTUAL_ENV__', os.path.abspath(home_dir)) - content = content.replace('__VIRTUAL_NAME__', os.path.basename(os.path.abspath(home_dir))) + content = content.replace('__VIRTUAL_NAME__', vname) content = content.replace('__BIN_NAME__', os.path.basename(bin_dir)) writefile(os.path.join(bin_dir, name), content) -def install_distutils(lib_dir, home_dir): - distutils_path = os.path.join(lib_dir, 'distutils') +def install_distutils(home_dir): + distutils_path = change_prefix(distutils.__path__[0], home_dir) mkdir(distutils_path) ## FIXME: maybe this prefix setting should only be put in place if ## there's a local distutils.cfg with a prefix setting? @@ -882,6 +1268,21 @@ writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT) writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False) +def fix_local_scheme(home_dir): + """ + Platforms that use the "posix_local" install scheme (like Ubuntu with + Python 2.7) need to be given an additional "local" location, sigh. + """ + try: + import sysconfig + except ImportError: + pass + else: + if sysconfig._get_default_scheme() == 'posix_local': + local_path = os.path.join(home_dir, 'local') + if not os.path.exists(local_path): + os.symlink(os.path.abspath(home_dir), local_path) + def fix_lib64(lib_dir): """ Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y @@ -910,9 +1311,16 @@ break if not os.path.exists(exe): logger.fatal('The executable %s (from --python=%s) does not exist' % (exe, exe)) - sys.exit(3) + raise SystemExit(3) + if not is_executable(exe): + logger.fatal('The executable %s (from --python=%s) is not executable' % (exe, exe)) + raise SystemExit(3) return exe +def is_executable(exe): + """Checks a file is executable""" + return os.access(exe, os.X_OK) + ############################################################ ## Relocating the environment: @@ -921,7 +1329,8 @@ Makes the already-existing environment use relative paths, and takes out the #!-based environment selection in scripts. """ - activate_this = os.path.join(home_dir, 'bin', 'activate_this.py') + home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) + activate_this = os.path.join(bin_dir, 'activate_this.py') if not os.path.exists(activate_this): logger.fatal( 'The environment doesn\'t have a file %s -- please re-run virtualenv ' @@ -939,7 +1348,12 @@ # This is what we'll put: new_shebang = '#!/usr/bin/env python%s' % sys.version[:3] activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this" - bin_dir = os.path.join(home_dir, 'bin') + if sys.platform == 'win32': + bin_suffix = 'Scripts' + else: + bin_suffix = 'bin' + bin_dir = os.path.join(home_dir, bin_suffix) + home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) for filename in os.listdir(bin_dir): filename = os.path.join(bin_dir, filename) if not os.path.isfile(filename): @@ -1122,368 +1536,417 @@ ##EXTEND## +def convert(s): + b = base64.b64decode(s.encode('ascii')) + return zlib.decompress(b).decode('utf-8') + ##file site.py -SITE_PY = """ -eJzVPGtz2ziS3/krsHSlKGVkOo/ZqS1nPFdO4sx4z5N4J5na3HpSWkqCJI4pkkOQlrVXd7/9+gGA -AEn5sbP74VSpWCKARqPRbzQYhuFpWcp8ITbFosmkUDKp5mtRJvVaiWVRiXqdVovDMqnqHTydXycr -qURdCLVTMfaKg+Dp7/wET8WndaoMCvAtaepik9TpPMmynUg3ZVHVciEWTZXmK5HmaZ0mWfoP6FHk -sXj6+zEIznMBK89SWYkbWSmAq0SxFJe7el3kYtSUuObn8R+Tl+OJUPMqLWvoUGmcgSLrpA5yKReA -JvRsFJAyreWhKuU8XaZz23FbNNlClFkyl+Lvf+elUdcoClSxkdu1rKTIARmAKQFWiXjA17QS82Ih -YyFey3mCE/DzllgBQ5vgnikkY16IrMhXsKZczqVSSbUTo1lTEyBCWSwKwCkFDOo0y4JtUV2rMWwp -7ccWHomE2cNfDLMHrBPn73MO4PghD37O09sJwwbuQXD1mtmmksv0ViQIFn7KWzmf6mejdCkW6XIJ -NMjrMXYJGAElsnR2VNJ2fKt36LsjwspyZQJzSESZO3MjjYiD81okmQK2bUqkkSLM38pZmuRAjfwG -pgOIQNJgaJ5Fqmo7D61OFACgwn2sQUo2Sow2SZoDs/6YzAntv6b5otiqMVEAdkuJXxtVu+sfDRAA -ejsEmAS4WWY3mzxLr2W2GwMCnwD7Sqomq1EgFmkl53VRpVIRAEBtJ+QtID0RSSU1CZkzjdxOiP5E -kzTHjUUBQ4HHRiTJMl01FUmYWKbAucAV7z78JN6evT4/fa95zABjmV1tAGeAQhvt4AQTiKNGVUdZ -AQIdBxf4RySLBQrZCucHvNoOR/fudDCCtZdxd4yz4UB2vbl6GlhjDcqE5gpo3H/DkIlaA33+5579 -DoLTfVShhfO37boAmcyTjRTrhPkLOSP4VsP5Li7r9SvgBoVwaiCVws1BBFOEByRxaTYqcilKYLEs -zeU4AArNqK+/i8AK74v8kPa6wwkAoQpyaHSejWnGXMJC+7Beob4wnXe0Mt0lsPu8KSpSHMD/+Zx0 -UZbk14SjIobibzO5SvMcEUJeCKKDiCZW1ylw4iIWF9SL9ILpJCLWXtwTRaIBXkKmA56Ut8mmzOSE -xRd1691qhCaTtTB7nTHHQc+a1CvtWrvUQd57EX/ucB2hWa8rCcCbmSd0y6KYiBnobMKmTDYsXvW2 -IM4JBuSJBiFPUE8Yi9+BoqdKNRtpG5FXQLMQQwXLIsuKLZDsOAiEOMBOxij7zAmt0Ab/A1z8P5P1 -fB0EzkwWsAaFyO8DhUDAJMhcc7VGwuM2zcpdJZPmrCmKaiErmuphxD5ixB/YGdcavC9qbdR4ubjL -xSatUSXNtMlM2eLlUc368RWvG5YBllsRzUzXlk4bXF5WrpOZNC7JTC5REvQmvbLbDnMGA3OSLa7F -hq0MtAFZZMoWZFixoNJZ1pKcAIDBwpfkadlk1Ekhg4kEJtqUBH+ToEkvtLME7M1mOUCFxOZ7DvYH -cPsHiNF2nQJ95gABNAxqKdi+WVpX6CC0+ijwjb4Zz/MDp54vtW3iKZdJmmkrn+TBOT08qyoS37ks -cdREE0PBCvMaXbtVDnREMQ/DMAiMO7RT5mthv02nsyZFezedBnW1OwbuECjkAUMX72GhNB23LKti -g80WvY+gD0Av44jgQFySopDs43rM9Aop4Grl0nRF8+twpEBVElz+dPbu/PPZR3EirlqtNOmqpC8w -51meAGeSUge+6EzbqiPoiborRfUl3oGFpn0Fk0SjSQJlUjfAfoD6p6qhZljG3GsMzt6fvr44m/78 -8eyn6cfzT2eAIJgKGRzQktHCNeDzqRj4GxhroWJtIoPeCHrw+vSjfRBMUzX9lV3jExZ27QddHX/9 -RZyciOjX5CaJAvBF2q68Lz8SW37alRKG1vBnVKhxECzkElj4WiKjj56SfznmAUAX6Floe/drkeam -nZq9KUgORzQCcJhO51miFHaeTiOgFg0Y+MCAmJ1U5N4RDCx37tCxRgU/lQTq5jhkgv8NoJjMaByi -wSi6Q0wnYPvNPFGSe9HyYdx0irI/nY70hCAUxLbguLA4R8J0QdmvUvAPaftRF8xUkeFPhI/SRFKA -IQpqG9wkHYLEN0nWSDVyFgVEHI06ZESFlSpiCjD1I7Bo7daNx11qgsuDCGE3IF9WgDaqOpTDzwH4 -DSD2JhjCgIljGKYZYvpn9tgJB3DdIlSbSnWgsJYRl2eX4uWzF4foFkDstrDU8bqjpUvzRtqHS9it -lawdhHlUNCH+Hrt0WaK+wqfHd8PcxHZn+qyw1FtcyU1xIxeALTKws8viJ2qBCBfWMU9gF0E/kl1l -PWb8rwTjOV49SAvaYKDehqCY/Tdbf8BBtcwVaAMOUInUOnpmk1JWxU2KRnu2041gc0BjoeUxDkLg -bJzHZGhawA6BN5kjpbYyAp1UNez4Ed4IErX2otVuMYG7QHX5hb5e58U2n3JEeYKabzS2rIuCpZkX -O7RbcCDegS0AJAsIkFqiMRRwnQXK1iEgD8uH5QJlyUcHQGAwFYU9DiwTMtESOfrCaRHG+JUg4a0k -2t0bMwWFLIYYDiRqje0DoyUQEizOKjirGjSToayZbjCxQxKf6y5iDuV8AB0qxmC7RhoadzL0uzoG -5SwuXKXkjEOz+PnzZ2YbtaY8BSI2w0WjKV6SxYrLHVi3FHSC8Ww460FssAUnEcA0SrOmOPwoipK9 -GtjPSy3bYIwhSqrr8vjoaLvdxjpKL6rVkVoe/fFP33zzp2esExcL4h9YjiMtOmUVH1Ebeobxt8YC -fWd2rsOPae5zI8EaSfJuyKVD/L5v0kUhjg/HVn8iF7e2Ev83/gQokKmZlKkMtA1bjJ6owyfxSxWK -J2Lk9h2N2TnQwaa1YkaDQhuoJBhRF2COwXmYF01eR44iVeIrsG4Q6S7krFlFdnLPRpofsFSU05Hl -gcPnXxADnzMMXxlTPEUtQWyR5svCIf1PzDYJuShaQyB50UT1otDdsBYzxF08XN6tw+cIjVlhqpA7 -UCL8Lg8WQNu5Lzn40f4l2j3HvzQfzxAYSx8Y5tXe3QgFh3DBvZi4UudwNbqdIE1bVs2gYFzVCAoa -PLUZU1uDIxsZIUj0bkzQzBurewCdOhk4E2ebXYAe7jw9a9dlBccTQh44Ec/piQQ/9bjX9oy3tsky -Sox0eNSjCgP2NhrtdAF8OTIAJiKsfg65p96W8w+dTeE9GABWcC4FGWzZYyZscX3A8CAcYKee1d83 -mmk8BAI3ifo/DDhhfMITVAqEqRz5jLuPwy1tOX/UQXi/wSGeMrtEEq32yFZXdwzK1J12aZnmqHqd -PYrnWQFOsVWKxEdtu+8rUCyCj4dsmRZATYaWHE6nE3L2PPmLdD/MQq0ajNfddAZitEkVGTck0xr+ -A6+C0gSU0wFaEjQL5qFC5i/sXyBydr36yx72sIRGhnC77vNCegZDwzHtBwLJqJMaIAQ5kLAvi+Q5 -sjbIgMOcDfJkG5rlXuEmGLECMXMMCGkZwJ0avfgGn8R4kEACipBvayVL8ZUIYfu6kvow1f0v5VKT -CBg5HchT0BmEEze74GQWTjqZBp+h/RwDHTmUBXDwDDweN1/usrlhWpv4AF/d19sWKVDIlAsJxy6q -Xwxh3JzsH06cHi2xzCSGobyJvJMRM9M4sNutQcOGGzDennfn0o/dhAWOHUWFeiE3txD+RVWq5oWK -ML7tpS7cj+aKPm0sthfpLIQ/3gaE4y8eJJl10cG8xSKptmkekYrRKzzxiddDxy7Ws0JHHyneOQJU -MLV39K4CFqYzviNgeJRVCJtlpLRf3gd750pDC5eHh55fe3X88kt/+ZN9KRj7GSbm2W1dJQrpmTFZ -mW2Rnn0Li2oRFpfkO31Kp09x0Y+vCgVhnvjw8bNAQnACc5vsHrf0liURm3vX5H0M6qB57iVXZ3XE -LoAI6i1klKPo8Yz5cGQfu7g7FvYIII9imDs2xUDSfPLPwLlro2COw8Uux0RXV6jxA83ffD0dSF26 -SH7zdXjPLB1iDIn9qOOr2Znp9FwMLtsMqWSSkTfgDKK0X97yju1TjlnlUoCmmezLgFuIH9NulHoL -v9e9F9mZzwHRA+LgYvYrRJNKJ6BukjSjRDigcXiIes4EwhzbD+PjQbobZUwagU/xbDIYq6irZ7Ax -EUfe4/5ytOdyapKzAxGj+ZSJ6qNyoM+t22MX7yzaPXLbL/uDtvTfpLMeCchbTThAwAeuwRwJ/v9f -CSsrhqaV1bij9ZW8W88bYA9Qh3sckTvckP7UfIK0NM4Ey50ST1FAn4otnQNTsg2PDgDKgv2MATi4 -jfo08U1TVXwmSHJeyuoQD8kmAktgjKdBlTV9MEfvZY2Y2G5zSl46BRPFkOqMdDrSriRqPclhkV0X -Jokh85u0grGgVUbRDx9+PIv6DKCnwUHD4Nx9NFzycDuFcB/BtJEmTvSYMUyhxwz556Uq8ji0q1zN -Oa1JEWqy9QnbywyayHJ4D+7JEXgneHz4iTHbfC3n11NJB7rIpjjUyZK+wWbExJ7z+oU1KllSdRCs -ZJ41SCt29LCsa9nkc0qY1xLsua7BxJoMOqblhNAyS1ZiRIMXmIzQ3Ej5ipuk0t5OWRVY9SeadHG0 -ShdC/tYkGQZ6crkEXPA0QzfFPD3lJMRbPmnmajAl502V1jsgQaIKfRhEh9JOx9mOFzrykOS8PxMQ -j6mPxUdcNrYz4RaGXCZc9FPguEiMxHCAOa1D7qLn0J4XU5x1SsWTE0aqf1BLj4PuDAUACAEorD8c -61yO3yKpyT1xoj13iYpa0iOlG3sW5HEglNEYY1/+TT99RnR5aw+Wq/1Yru7GctXFcjWI5crHcnU3 -lq5I4MbaNIaRhKFURjfPPVgF4WYheJqzZL7mflhUh8VzAFGUJqAzMsW1pV6ugw98CAipbecEkh62 -VQ0pV+tVBSdFNUjkfjzV0MGjqQp2BlONhB7MSzE+277KDn/sURxTDc6MhrO8LZI6iT25WGXFDMTW -ojtpAUxEt8iDs2f5zXTG+b6OpQov/+vTDx/eY3cEFZrzbhqGm4iGBZcyeppUK9WXpjbYKIEdqadf -mUHDNMCDB+ZaeJYD/u8tHfkj44gtHVkXogQPgGptbDe3IiWKOs916Yp+zkzOpw8nIszrsF3UHiKd -Xl6+Pf10GlISKPzf0BUYQ1tfOlx8TA/boe+/ud0txXEMCLXOpbTGz12TR+uWI+63sQZsx+199qXz -4MVDDPZgWOqv8t9KKdgSIFSs04GPIdSDg5/fFSb06GMYsVeS5Z61sLNi2xzZc1wUR/SHEtHdCfzT -L4wxpkAA7UKNTGTQBlMdpW/N6x0UdYA+0Nf73SFYN/TqRjI+Re0iBhxAh7K22373z8vcs9FTsn59 -9v35+4vz15enn35wXEB05T58PHohzn78LKhgAA0Y+0QJnpXXWJoChsW9QSIWBfxrML2xaGpOSsKo -txcXOne/wTsEWFSKNieG51zXYqFxjoaznvahLkhBjDIdIDmXNah+gy5zYLy04YsCqtCFp3QHZIbO -aqNDL30Jx1zWoYPOGKQPOrukYBBccwRNVB5cm6iw4jMhfYFlAClto22lQEY5qN75sXMiYvLtXmKO -BsOTdrBW9FeRi2v0JVZllkIk9yqysqSHYb1Eyzj6oT3yZLyGNKAzHGbWHXnVe7FAq/Uq4rXp8eOW -0X5rAMOWwd7CunNJ9QJUGIvVTiLCTnxyEMlb+Gq3Xu+Bgg3Do58aN9EwXQqrTyC4FusUAgjgyTVY -X4wTAEJnJ/wE9LGTHZAFHtdHbzaLw79EmiB+719+GeheV9nh30QJUZDg2pJogJhu57cQ+MQyFmcf -3o0jRo5qNcVfGqy7BoeEsnyOtFNBC5+pTkdKZktdcODrA2zQfgI1d4ZXsqz08GHXOEIJeKJG5DU8 -UYZ+Edb/WNgTXMq4AxpLyi1meDXLPZg2nwPxcS2zTFchn7+9OAPfEavcUYL4nOcMpuN8CR6q6mos -vjrWAYVHrtBcIRtX6MLSsfsi9roNZmZR5Gi0d1Jv94myn/1RvVRnlaTKRXuEy2ZYTp13jNwM22F2 -lrm73w3p7HYjuqPkMGNMLyuqa/Q5AzianiYcGEHEhJX0JtnMp4tpXptCtiydgzYFxQtqdQKigiTG -62LEf0XO6d6iUuaWCTwsd1W6WteYUofBMVW4Y/cfTz9fnL+nkvEXL1vfe4BFJxQPTLi44AQrxzDn -AV/cajDkrel0iHN1E8JAHQR/uk1ctXDCE/TGcXoR/3Sb+JrPiRMP8gpATTVlV0gwDHCGDUlPKxGM -q42G8eNWhrWY+WAoI4m3CnQBgLu+Pj/anh2DQtkf0/iIs4plqWk4MoPdSqXuR69xWeLhymI03Ala -hyTMfGYw9LrXsq8myv30ZBFvHAJG/d7+HKZqqNdVL8dhtn3cQsGttrS/5E7G1Ok3z1GUgYgjd/DY -ZbJhVay7Mwd61bU9YOJbja6RxEGFHv6Sh9rP8DCxxO5FK2Yg3W4gU4D5DKnvZTTgSaFdAAVCRaEj -R3In46cvvDU6NuH+NWrdBRbyB1CEukSTSv+LCjgRvvzG7iM3EVqoSo9F5PgrucwLWz+En+0afcvn -/hoHZYBSmSh2VZKv5IhhTQzMr3xi70nEkrb1OOYq7VRLaO4GD/V2D4P3xWL49MRg1uGDXr9ruetq -I5862GHwgoAPoUq2oN3Lph7xXu09LMDu+gh2FGGS5LdoD73uQU/DQr/rt4EzHPwwsYx7ae1V5/JJ -ZBu0XzmvIGCqFR2WOFbYeIiuYW5t4ElrhUP7VFeM2N8DN3qcOlQXLqPgQvVWGOoOnVA/5LslfF0u -pdrl9uqDblvIG5kV4BZBxIWl6b/a0vRxPJjquAevFhUk6C/aHU/ya/IQ3/z1fCLevP8J/n8tP0BM -gdexJuJvgIB4U1QQW/GVQLqrjWXtNQdNRaPwzhZBozQ9X2tHZ+XSWwceCeh6e7/Q3uoHgTWG1Ybf -pQAo8hrpmmxrHU0VOfw211z6bphxkYZ2JdSNSIb9xf9YMH+ke8brepOhonSSBO12XoUX52/O3n88 -i+tb5CPzM3SSCH79C65IH5FWeBw0EfbJvMEnXxyP8QeZlQMOo465zEUCjLlEBG55aeMsvqqfWN86 -qTBwFuVuUcxj7AlcxXeX6i14kGMnvLrXwnnmBWGNxvoQqXVj8TFQQ/zSlfgQOtIYvSYaSQglM7xE -w4/jcNgGTQRlduHP0+vtwk0M69sQtMAupu2qR/5wq3TWTGcNz2UmQu3E7oS5I5elidrM5u7dqQ+5 -0C9bAHVCmX65TJqsFjKHqILCXLr1DlrVve7EcsLcwrqc7gBRoiLbJjvl1JokSoQ4a0gXd/FIgnJm -EIX+mFyz7sV7WKLhO5oAnRCl2KFwhqpmvmY55nBAq7ve0fs2zV++iHpE5kk5Rpy3ThysE10mxmgl -a71+fjAaXz1vzSjlZefeZcd5CRbG5ZQDUJ/l06dPQ/Ef91t+RiXOiuIaXBKAPRQQigtq3mOz9eLs -bvW9WtMSA0vO1/IKHnyh/LF93uSUnLtjKG2ItH8NjAj3JrL8aPp3bCCnrSo+auUefGSjbcfPeUqv -VMHkikSVq99Mg4kXI1DEkqAbokTN0zTiQB32Y1c0eE8JE22aX+QtcHyKYCbYimdEHGau0buikkXL -PRadExES4JBKiHg2uuhJN3UAz+nlTqM5Pc/Tuq2xf+YeH+o7yrV9U4rmK5FsUTLMOjrEcK68eaza -epfFnSzqeevF/MpNuXVWyc334Q6sDZJWLJcGU3hoNmleyGpujCruWDpPaweM6YdweDC9IIYMUBwM -oBSChifDsLASbVv/YPfFxfQDnaQempl0AU1tX7rD6ZEk79SRxXE7PyViLCEt35ovY5jlPSV2tT/g -zSX+oNOKWGDtvRvAverV5PrOP1cwtC8CADj0nhmrIC07ejrCebmRhc9Mqx359hUBTj04hqeE201a -1U2STfW99Cm6bFN7tKzxtFeE7rz8Zn0WcKgLcDUPdbE0+A6mzgTpibWOplwd4nMdnsfutRv/hkpZ -oK/3wtPjmPR9xpfgHQ2OPb8yFzceovLN9YFe5b2L5YSqeqJxt1ax1wtPECJd80Vp2SEP+1FTGliu -K/xQABkAgD/s+EVfdU6BnNI0rhvdl/rvAf3m67vAukpmsGiW8u2+4tEXl9wq1jbhz7JsfL41uJUo -GQtz1VQLHt/KQylhlW9vEptah+6FCGh++JLvWPADTtMinOzwiYq0m2048i5aWfzuIlXbKfinqKRH -DdMK3TwsM1wn3ILi2pTHNhgybxLAFO3ILT7BT309WJad4MtqkKCH9XV01/J5/F1r1z0Cu3Jz9tJb -u3/9wqWBHrufX4ZowC6oJsSDKjotRtN/jehO9LHgcHpDf5b2tXmc5SAe1KhNNEtukrn7HQ+nD/mt -e219oHM5wt31zpr2Xhs27Nzn5D4380EcPrf33+h0daHZiw0WvYNlyvU6U7laqWmCr/CZkpdDZ8s9 -82Xs5jt6fYtM1M6YO7xRDyAMq+gqILfQD3YdPCl+lSAfzTpXpwVNTQVMTkWUShccvWrbCuBijlpp -vEmKcElTmEnMN6imKitwR0L9wjk+Mxwqs2qBmghqk6hrg7oZMdHvH8Mp+KDaXL/hWJldHI86QAiu -ynfe28E1gtOpbQN+edZeBEwnliFk3mwgPq7bO/D+2UQqvnNmoEtXuMFOjNSKXYdTXMRSyx8OUhil -2O9fafPveTd33P4bW5X2cLaiETr8fszFQkfKDTent/YdOO67Fxb0HkOKiPjdCcJ2a7nP3vuHrTAv -dCFFqIMWbtUvmeAXinFWBSuyHD4CuXevPPiVcVZnscNg0XCeuYqh/1YBvDVHhnboZUE9Lui/Fshn -hnZ+X29YZullovd0tlQ84R6Diqedbdy68ljEco8r7xcqPtKV9+A/0JXXr3YCa6Lx0fpgsHTxHp+f -1YT7nqSWEWDMFIiEyfbOW3aMPRy5hYDgkKe3oX17IOtM53aBMRPIkf0XaBAIfh+ScqumvPeVmHmH -fG1fuujx9xcfXp9eEC2ml6dv/vP0ezoixrxVx2Y9ONbJi0Om9qFXkubGPfpYb2jyFtuBd4lxXbWG -0GvvHYkMQBiuoR/a0K4ic5v3DejVIvcHAeJ3L7sDdZ/KHoTcc7503at7mNepHQv0Uy70Mb+ccxnz -yGRNWRzalKhpb7NYWkZ7Qf6+jXNKbvrqRDul+lVVexIQY1v4RTuAySvkL5u7MlW8NkPCjkr3nc5U -rYY3IMw9b5DCuXReN0RvGmJQtf/y6AqUXYI5eHYYJ/ZFjNSP83TKvmEU8/BzGRuCeFcQwv76XGFf -yGwPFYKAFZ5+mQ4jYvSfzmzb06AnSlwd0mWnQ1Q2X+wv3DPt5P41xTOf2r6VQpnjUsx3Q+dlk7nn -OHZMbwA5f5QWLJZOdS1oviOgcyueCtgbfSZWiLOdiCBK1IcVWLBDdNRvlHGQR7vpYG9o9Uwc7rsK -414FEeL5/o6Lzm0TPeIFj1D3jFCNuXDgWGCsGdl3x0V8R5A5ryzoNRSe84HnGfrlh/D15ur5sU1K -Ir9js/uSA6R96Bj2q7aq/M4XHzmjiVeqCdUOYKHKuAv+S+iw5lLsD3B6NbJ7giBz4MSQQq99+Fzd -jPBeshp2EbV8dwwLEqMnakyLcqqKNe72ybi32FZl9WFwgfT9MHraD0AhlGHfBD/8rg1Qz890PDhr -6G1x1uHEa4WOPNAhuc8LPMJ4fS123eF0relBw6lc3BaZc4cu7+n9BrFmr4F7eYmO/bagu/KWB/bY -fr4gNjz++QPG98sp7PAXdznUttfLwUsJ7MRiAQ4ez3YoZB7HYF1AYY5ITWPtppFwvPjdktHhpnZp -yBXo8FFND74JkgILcmKn2vJbYxD8H2/QG9E= -""".decode("base64").decode("zlib") +SITE_PY = convert(""" +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 +""") ##file ez_setup.py -EZ_SETUP_PY = """ -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 -178BYnMUkw== -""".decode("base64").decode("zlib") +EZ_SETUP_PY = convert(""" +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 +BDaonX65d/fwEjNqlDjLVIvM9X+XVxF7 +""") ##file distribute_setup.py -DISTRIBUTE_SETUP_PY = """ -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 -""".decode("base64").decode("zlib") +DISTRIBUTE_SETUP_PY = convert(""" +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 +""") ##file activate.sh -ACTIVATE_SH = """ -eJytVFFv2jAQfs+vuIU+QDWK+tqKB6oigdRC1bBOW1sZk1yIpWAj2yGj0/77ziFAUijStPIA2Hc+ -f/7u+64Bk0QYiEWKsMiMhRlCZjCCXNgEfKMyHSLMhOzw0IoVt+jDeazVAmbcJOdeA9Yqg5BLqSzo -TIKwEAmNoU3Xnhfh9hQ0W/DbA/o0QKNBCyqNAOVKaCUXKC2suBZ8lqIpskQMz9CW4J+x8d0texo+ -Tr717thDbzLw4RWuwSYoi0z3cdvdY6m7DPy1VNoWibu9TDocB4eKeCxOwvgxGYxHg/F9/xiYXfAA -0v7YAbBd6CS8ehaBLCktmmgSlRGpEVqiv+gPcBnBm0m+Qp6IMIGErxA4/VAoVIuFC9uE26L1ZSkS -QMjTlCRgFcwJAXWU/sVKu8WSk0bKo+YC4DvJRGW2DFsh52WZWqIjCM4cuRAmXM7RQE5645H7WoPT -Dl1LulgScozeUX/TC6jpbbVZ/QwG7Kn/GAzHoyPkF09r6xo9HzUxuDzWveDyoG2UeNCv4PJko8rw -FsImZRvtj572wL4QLgLSBV8qGaGxOnOewXfYGhBgGsM24cu729sutDXb9uo/HvlzExdaY0rdrxmt -Ys/63Z5Xgdr1GassGfO9koTqe7wDHxGNGw+Wi0p2h7Gb4YiNevd9xq7KtKpFd7j3inds0Q5FrBN7 -LtIUYi5St1/NMi7LKdZpDhdLuwZ6FwkTmhsTUMaMR2SNdc7XLaoXFrahqQdTqtUs6Myu4YoUu6vb -guspCFm4ytsL6sNB8IFtu7UjFWlUnO00s7nhDWqssdth0Lu567OHx/H9w+TkjYWKd8ItyvlTAo+S -LxBeanVf/GmhP+rsoR8a4EwpeEpTgRgin0OPdiQZdy7CctYrLcq5XR5BhMTa5VWnk+f5xRtasvrq -gsZBx6jY5lxjh7sqnbrvnisQp1T6KNiX6fQV9m/D1GC9SvPEQ1v7g+WIrxjaMf9Js/QT5uh/ztB/ -n5/b2Uk0/AXm/2MV -""".decode("base64").decode("zlib") +ACTIVATE_SH = convert(""" +eJytVU1v4jAQPW9+xTT0ANVS1GsrDlRFAqmFqmG72m0rY5IJsRRslDiktNr/vuMQ8tFQpNU2B4I9 +H36eeW/SglkgYvBFiLBKYg0LhCRGD1KhA7BjlUQuwkLIHne12HCNNpz5kVrBgsfBmdWCrUrA5VIq +DVEiQWjwRISuDreW5eE+CtodeLeAnhZEGKMGFXqAciMiJVcoNWx4JPgixDjzEj48QVeCfcqmtzfs +cfww+zG4ZfeD2ciGF7gCHaDMPM1jtvuHXAsPfF2rSGeOxV4iDY5GUGb3xVEYv2aj6WQ0vRseAlMY +G5DKsAawwnQUXt2LQOYlzZoYByqhonqoqfxZf4BLD97i4DukgXADCPgGgdOLTK5arYxZB1xnrc9T +EQFcHoZEAa1gSQioo/TPV5FZrDlxJA+NzwF+Ek1UonOzFnKZp6k5mgLBqSkuuAGXS4whJb5xz/xs +wXCHjiVerAk5eh9Kfz1wqOldtVv9dkbscfjgjKeTA8XPrtaNauX5rInOxaHuOReNtpFjo1/OxdFG +5eY9hJ3L3jqcPJbATggXAemDLZX0MNZRYjSDH7C1wMHQh73DyYfTu8a0F9v+6D8W6XNnF1GEIXW/ +JrSKPOtnW1YFat9mrLJkzLbyIlTvYzV0RGXcaTBfVLx7jF2PJ2wyuBsydpm7VSVa4C4Zb6pFO2TR +huypCEPwuQjNftUrNl6GsYZzuFrrLdC9iJjQ3omAPBbcI2lsU77tUD43kw1NPZhTrnZWzuQKLomx +Rd4OXM1ByExVVkmoTwfBJ7Lt10Iq1Kgo23Bmd8Ib1KrGbsbO4Pp2yO4fpnf3s6MnZiwuiJuls1/L +Pu4yUCvhpA+vZaJvWWDTr0yFYYyVnHMqCEq+QniuYX225xmnzRENjbXACF3wkCYNVZ1mBwxoR9Iw +WAo3/36oSOTfgjwEEQKt15e9Xpqm52+oaXxszmnE9GLl65RH2OMmS6+u5acKxDmlPgj2eT5/gQOX +LLK0j1y0Uwbmn438VZkVpqlfNKa/YET/53j+99G8H8tUhr9ZSXs2 +""") + +##file activate.fish +ACTIVATE_FISH = convert(""" +eJydVm1v4jgQ/s6vmA1wBxUE7X2stJVYlVWR2lK13d6d9laRk0yIr8HmbIe0++tvnIQQB9pbXT5A +Ys/LM55nZtyHx5RrSHiGsMm1gRAh1xhDwU0Kng8hFzMWGb5jBv2E69SDs0TJDdj3MxilxmzPZzP7 +pVPMMl+q9bjXh1eZQ8SEkAZULoAbiLnCyGSvvV6SC7IoBcS4Nw0wjcFbvJDcjiuTswzFDpiIQaHJ +lQAjQUi1YRmUboC2uZJig8J4PaCnT5IaDcgsbm/CjinOwgx1KcUTMEhhTgV4g2B1fRk8Le8fv86v +g7v545UHpZB9rKnp+gXsMhxLunIIpwVQxP/l9c/Hq9Xt1epm4R27bva6AJqN92G4YhbMG2i+LB+u +grv71c3dY7B6WtzfLy9bePbp0taDTXSwJQJszUnnp0y57mvpPcrF7ZODyhswtd59+/jdgw+fwBNS +xLSscksUPIDqwwNmCez3PpxGeyBYg6HE0YdcWBxcKczYzuVJi5Wu915vn5oWePCCoPUZBN5B7IgV +MCi54ZDLG7TUZ0HweXkb3M5vFmSpFm/gthhBx0UrveoPpv9AJ9unIbQYdUoe21bKg2q48sPFGVwu +H+afrxd1qvclaNlRFyh1EQ2sSccEuNAGWQwysfVpz1tPajUqbqJUnEcIJkWo6OXDaodK8ZiLdbmM +L1wb+9H0D+pcyPSrX5u5kgWSygRYXCnJUi/KKcuU4cqsAyTKZBiissLc7NFwizvjxtieKBVCIdWz +fzilzPaYyljZN0cGN1v7NnaIPNCGmVy3GKuJaQ6iVjE1Qfm+36hglErwmnAD8hu0dDy4uICBA8ZV +pQr/q/+O0KFW2kjelu9Dgb9SDBsWV4F4x5CswgS0zBVlk5tDMP5bVtUGpslbm81Lu2sdKq7uNMGh +MVQ4fy9xhogC1lS5guhISa0DlBWv0O8odT6/LP+4WZzDV6FzIkEqC0uolGZSZoMnlpxplmD2euaT +O4hkTpPnbztDccey0bhjDaBIqaWQa0uwEtQEwtyU56i4fq54F9IE3ORR6mKriODM4XOYZwaVYLYz +7SPbKkz4i7VkB6/Ot1upDE3znNqYKpM8raa0Bx8vfvntJ32UENsM4aI6gJL+jJwhxhh3jVIDOcpi +m0r2hmEtS8XXXNBk71QCDXTBNhhPiHX2LtHkrVIlhoEshH/EZgdq53Eirqs5iFKMnkOmqZTtr3Xq +djvPTWZT4S3NT5aVLgurMPUWI07BRVYqkQrmtCKohNY8qu9EdACoT6ki0a66XxVF4f9AQ3W38yO5 +mWmZmIIpnDFrbXakvKWeZhLwhvrbUH8fahhqD0YUcBDJjEBMQwiznE4y5QbHrbhHBOnUAYzb2tVN +jJa65e+eE2Ya30E2GurxUP8ssA6e/wOnvo3V78d3vTcvMB3n7l3iX1JXWqk= +""") + +##file activate.csh +ACTIVATE_CSH = convert(""" +eJx9U11vmzAUffevOCVRu+UB9pws29Kl0iq1aVWllaZlcgxciiViItsQdb9+xiQp+dh4QOB7Pu49 +XHqY59IgkwVhVRmLmFAZSrGRNkdgykonhFiqSCRW1sJSmJg8wCDT5QrucRCyHn6WFRKhVGmhKwVp +kUpNiS3emup3TY6XIn7DVNQyJUwlrgthJD6n/iCNv72uhCzCpFx9CRkThRQGKe08cWXJ9db/yh/u +pvzl9mn+PLnjj5P5D1yM8QmXlzBkSdXwZ0H/BBc0mEo5FE5qI2jKhclHOOvy9HD/OO/6YO1mX9vx +sY0H/tPIV0dtqel0V7iZvWyNg8XFcBA0ToEqVeqOdNUEQFvN41SumAv32VtJrakQNSmLWmgp4oJM +yDoBHgoydtoEAs47r5wHHnUal5vbJ8oOI+9wI86vb2d8Nrm/4Xy4RZ8R85E4uTZPB5EZPnTaaAGu +E59J8BE2J8XgrkbLeXMlVoQxznEYFYY8uFFdxsKQRx90Giwx9vSueHP1YNaUSFG4vTaErNSYuBOF +lXiVyXa9Sy3JdClEyK1dD6Nos9mEf8iKlOpmqSNTZnYjNEWiUYn2pKNB3ttcLJ3HmYYXy6Un76f7 +r8rRsC1TpTJj7f19m5sUf/V3Ir+x/yjtLu8KjLX/CmN/AcVGUUo= +""") ##file activate.bat -ACTIVATE_BAT = """ -eJyFUssKgzAQvAfyD3swYH+hItSiVKlGsalQKOyhauvFHOr/U+MzFcWc9jEzO7vkVLw+EmRZUvIt -GsiCVNydED2e2YhahkgJJVUJtWwgL8qqLnJI0jhKBJiUQPsUv6/YRmJcKDkMlBGOcehOmptctgJj -e2IP4cfcjyNvFOwVp/JSdWqMygq+MthmkwHNojmfhjuRh3iAGffncsPYhpl2mm5sbY+9QzjC7ylt -sFy6LTEL3rKRcLsGicrXV++4HVz1jzN4Vta+BnsingM+nMLSiB53KfkBsnmnEA== -""".decode("base64").decode("zlib") +ACTIVATE_BAT = convert(""" +eJyFUkEKgzAQvAfyhz0YaL9QEWpRqlSjWGspFPZQTevFHOr/adQaU1GaUzI7Mzu7ZF89XhKkEJS8 +qxaKMMsvboQ+LxxE44VICSW1gEa2UFaibqoS0iyJ0xw2lIA6nX5AHCu1jpRsv5KRjknkac9VLVug +sX9mtzxIeJDE/mg4OGp47qoLo3NHX2jsMB3AiDht5hryAUOEifoTdCXbSh7V0My2NMq/Xbh5MEjU +ZT63gpgNT9lKOJ/CtHsvT99re3pX303kydn4HeyOeAg5cjf2EW1D6HOPkg9NGKhu +""") ##file deactivate.bat -DEACTIVATE_BAT = """ +DEACTIVATE_BAT = convert(""" eJxzSE3OyFfIT0vj4spMU0hJTcvMS01RiPf3cYkP8wwKCXX0iQ8I8vcNCFHQ4FIAguLUEgWIgK0q FlWqXJpcICVYpGzx2BAZ4uHv5+Hv6wq1BWINXBTdKriEKkI1DhW2QAfhttcxxANiFZCBbglQSJUL i2dASrm4rFz9XLgAwJNbyQ== -""".decode("base64").decode("zlib") +""") ##file distutils-init.py -DISTUTILS_INIT = """ -eJytVl2L6zYQffevGBKK7XavKe3bhVBo78uFSyml0IdlEVpbTtR1JCMpm6S/vjOSY0v+uO1DDbs4 -0tF8nJk5sjz32jjQNpPhzd7H1ys3SqqjhcfCL1q18vgbN1YY2Kc/pQWlHXB4l8ZdeCfUO5x1c+nE -E1gNVwE1V3CxAqQDp6GVqgF3EmBd08nXLGukUfws4IDBVD13p2pYoS3rLk52ltF6hPhLS1XM4EUc -VsVYKzvBWPkE+WgmLzPZjkaUNmd6KVI3JRwWoRSLM6P98mMG+Dw4q+il8Ev07P7ATCNmRlfQ8/qN -HwVwB99Y4H0vMHAi6BWZUoEhoqXTNXdSK+A2LN6tE+fJ0E+7MhOdFSEM5lNgrJIKWXDF908wy87D -xE3UoHsxkegZTaHIHGNSSYfm+ntelpURvCnK7NEWBI/ap/b8Z1m232N2rj7B60V2DRM3B5NpaLSw -KnfwpvQVTviHOR+F88lhQyBAGlE7be6DoRNg9ldsG3218IHa6MRNU+tGBEYIggwafRk6yzsXDcVU -9Ua08kYxt+F3x12LRaQi52j0xx/ywFxrdMRqVevzmaummlIYEp0WsCAaX8cFb6buuLUTqEgQQ6/Q -04iWRoF38m/BdE8VtlBY0bURiB6KG1crpMZwc2fIjqWh+1UrkSLpWUIP8PySwLKv4qPGSVqDuMPy -dywQ+gS7L1irXVkm5pJsq3l+Ib1lMOvUrxI+/mBBY4KB+WpUtcO06RtzckNvQ6vYj1lGoZM2sdDG -fryJPYJVn/Cfka8XSqNaoLKhmOlqXMzW9+YBVp1EtIThZtOwzCRvMaARa+0xD0b2kcaJGwJsMbc7 -hLUfY4vKvsCOBdvDnyfuRbzmXRdGTZgPF7oGQkJACWVD22IMQdhx0npt5S2f+pXO+OwH6d+hwiS5 -7IJOjcK2emj1zBy1aONHByfAMoraw6WlrSIFTbGghqASoRCjVncYROFpXM4uYSqhGnuVeGvks4jz -cjnCoR5GnPW7KOh4maVbdFeoplgJ3wh3MSrAsv/QuMjOspnTKRl1fTYqqNisv7uTVnhF1GhoBFbp -lh+OcXN2riA5ZrYXtWxlfcDuC8U5kLoN3CCJYXGpesO6dx6rU0zGMtjU6cNlmW0Fid8Sja4ZG+Z3 -fTPbyj+mZnZ2wSQK8RaT9Km0ySRuLpm0DkUUL0ra3WQ2BgGJ7v9I9SKqNKZ/IR4R28RHm+vEz5ic -nZ2IH7bfub8pU1PR3gr10W7xLTfHh6Z6bgZ7K14G7Mj/1z5J6MFo6V5e07H0Ou78dTyeI+mxKOpI -eC2KMSj6HKxd6Uudf/n886fPv+f++x1lbASlmjQuPz8OvGA0j7j2eCu/4bcW6SFeCuNJ0W1GQHI5 -iwC9Ey0bjtHd9P4dPA++XxLnZDVuxvFEtlm3lf5a2c02u2LRYXHH/AOs8pIa -""".decode("base64").decode("zlib") +DISTUTILS_INIT = convert(""" +eJytV92L4zYQf/dfMU0ottuse7RvC6FQrg8Lxz2Ugz4si9HacqKuIxlJ2ST313dG8odkO9d7aGBB +luZLv/nNjFacOqUtKJMIvzK3cXlhWgp5MDBsqK5SNYftsBAGpLLA4F1oe2Ytl+9wUvW55TswCi4c +KibhbFDSglXQCFmDPXIwtm7FawLRbwtPzg2T9gf4gupKv4GS0N262w7V0NvpbCy8cvTo3eAus6C5 +ETU3ICQZX1hFTw/dzR6V/AW1RCN4/XAtbsVXqIXmlVX6liS4lOzEYY9QFB2zx6LfoSNjz1a0pqT9 +QOIfJWQ2E888NEVZNqLlZZnvIB0NpHkimlFdKn2iRRY7yGG/CCJb6Iz280d34SFXBS2yEYPNF0Q7 +yM7oCjpWvbEDQmnhRwOs6zjThpKE8HogwRAgraqYFZgGZvzmzVh+mgz9vskT3hruwyjdFcqyENJw +bbMPO5jdzonxK68QKT7B57CMRRG5shRSWDTX3dI8LzRndZbnSWL1zfvriUmK4TcGWSnZiEPCrxXv +bM+sP7VW2is2WgWXCO3sAu3Rzysz3FiNCA8WPyM4gb1JAAmCiyTZbhFjWx3h9SzauuRXC9MFoVbc +yNTCm1QXOOIfIn/g1kGMhDUBN72hI5XCBQtIXQw8UEEdma6Jaz4vJIJ51Orc15hzzmu6TdFp3ogr +Aof0c98tsw1SiaiWotHffk3XYCkqdToxWRfTFXqgpg2khcLluOHMVC0zZhLKIomesfSreUNNgbXi +Ky9VRzwzkBneNoGQyyvGjbsFQqOZvpWIjqH281lJ/jireFgR3cPzSyTGWzQpDNIU+03Fs4XKLkhp +/n0uFnuF6VphB44b3uWRneSbBoMSioqE8oeF0JY+qTvYfEK+bPLYdoR4McfYQ7wMZj39q0kfP8q+ +FfsymO0GzNlPh644Jje06ulqHpOEQqdJUfoidI2O4CWx4qOglLye6RrFQirpCRXvhoRqXH3sYdVJ +AItvc+VUsLO2v2hVAWrNIfVGtkG351cUMNncbh/WdowtSPtCdkzYFv6mwYc9o2Jt68ud6wectBr8 +hYAulPSlgzH44YbV3ikjrulEaNJxt+/H3wZ7bXSXje/YY4tfVVrVmUstaDwwOBLMg6iduDB0lMVC +UyzYx7Ab4kjCqdViEJmDcdk/SKbgsjYXgfMznUWcrtS4z4fmJ/XOM1LPk/iIpqass5XwNbdnLb1Y +8h3ERXSWZI6rZJxKs1LBqVH65w0Oy4ra0CBYxEeuOMbDmV5GI6E0Ha/wgVTtkX0+OXvqsD02CKLf +XHbeft85D7tTCMYy2Njp4DJP7gWJr6paVWXZ1+/6YXLv/iE0M90FktiI7yFJD9e7SOLhEkkaMTUO +azq9i2woBNR0/0eoF1HFMf0H8ChxH/jgcB34GZIz3Qn4/vid+VEamQrOVqAPTrOfmD4MPdVh09tb +8dLLjvh/61lEP4yW5vJaH4vHcevG8agXvzPGoOhhXNncpTr99PTHx6e/UvffFLaxUSjuSeP286Dw +gtEMcW1xKr/he4/6IQ6FUXP+0gkioHY5iwC9Eyx3HKO7af0zPPe+XyLn7fAY78k4aiR387bCr5XT +5C4rFgwLGfMvJuAMew== +""") ##file distutils.cfg -DISTUTILS_CFG = """ +DISTUTILS_CFG = convert(""" eJxNj00KwkAMhfc9xYNuxe4Ft57AjYiUtDO1wXSmNJnK3N5pdSEEAu8nH6lxHVlRhtDHMPATA4uH xJ4EFmGbvfJiicSHFRzUSISMY6hq3GLCRLnIvSTnEefN0FIjw5tF0Hkk9Q5dRunBsVoyFi24aaLg 9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q= -""".decode("base64").decode("zlib") +""") ##file activate_this.py -ACTIVATE_THIS = """ -eJyNUk2L3DAMvftXiCxLEphmSvc2MIcu9NaWHnopwxCcRNlRN7GD7clM/n0lp5mPZQs1JLb8pKcn -WUmSPE9w9GReAM9Yt9RhFg7kSzmtoKE6ZGU0ynJ7AfIcJnuEE3Wd0nWgUQcEQWEkF466QzMCf+Ss -6dGEQqmfgtbaQIWcDxs4HdBElv7og1wBg3gmH0TMjykcrAEyAd3gkP8rMDaocMDbHBWZ9RBdVZIk -SgU3bRTwWjQrPNc4BPiue/zinHUz7DRxws/eowtkTUSyiMhKfi2y3NHMdXX0itcOpYMOh3Ww61g8 -luJSDFP6tmH3ftyki2eeJ7mifrAugJ/8crReqUqztC0fC4kuGnKGxWf/snXlZb8kzXMmboW0GDod -Wut62G4hPZF5+pTO5XtiKYOuX/UL+ptcvy2ZTPKvIP1KFdeTiuuHxTXNFXYe/5+km0nmJ3r0KTxG -YSM6z23fbZ7276Tg9x5LdiuFjok7noks1sP2tWscpeRX6KaRnRuT3WnKlQQ51F3JlC2dmSvSRENd -j3wvetUDfLOjDDLPYtPwjDJb7yHYeNXyMPMLtdEQKRtl8HQrdLdX3O4YxZP7RvfcNH6ZCPMsi8td -qZvLAN7yFnoY0DSZhOUXj4WWy+tZ8190ud1tPu5Zzy2N+gOGaVfA -""".decode("base64").decode("zlib") +ACTIVATE_THIS = convert(""" +eJyNUlGL2zAMfvevEBlHEujSsXsL9GGDvW1jD3sZpQQ3Ua7aJXawnbT595Ocpe0dO5ghseVP+vRJ +VpIkn2cYPZknwAvWLXWYhRP5Sk4baKgOWRWNqtpdgTyH2Y5wpq5Tug406YAgKEzkwqg7NBPwR86a +Hk0olPopaK0NHJHzYQPnE5rI0o8+yBUwiBfyQcT8mMPJGiAT0A0O+b8BY4MKJ7zPcSSzHaKrSpJE +qeDmUgGvVbPCS41DgO+6xy/OWbfAThMn/OQ9ukDWRCSLiKzk1yrLjWapq6NnvHUoHXQ4bYPdrsVX +4lQMc/q6ZW975nmSK+oH6wL42a9H65U6aha342Mh0UVDzrD87C1bH73s16R5zsStkBZDp0NrXQ+7 +HaRnMo8f06UBnljKoOtn/YT+LtdvSyaT/BtIv9KR60nF9f3qmuYKO4//T9ItJMsjPfgUHqKwCZ3n +xu/Lx8M/UvCLTxW7VULHxB1PRRbrYfvWNY5S8it008jOjcleaMqVBDnUXcWULV2YK9JEQ92OfC96 +1Tv4ZicZZZ7GpuEpZbbeQ7DxquVx5hdqoyFSSmXwfC90f1Dc7hjFs/tK99I0fpkI8zSLy4tSy+sI +3vMWehjQNJmE5VePlZbL61nzX3S93ZcfDqznnkb9AZ3GWJU= +""") if __name__ == '__main__': main() Binary files /tmp/fK1P6nZ510/python-virtualenv-1.4.9/virtualenv_support/distribute-0.6.19.tar.gz and /tmp/bKAKaRp6nY/python-virtualenv-1.6.4/virtualenv_support/distribute-0.6.19.tar.gz differ Binary files /tmp/fK1P6nZ510/python-virtualenv-1.4.9/virtualenv_support/distribute-0.6.8.tar.gz and /tmp/bKAKaRp6nY/python-virtualenv-1.6.4/virtualenv_support/distribute-0.6.8.tar.gz differ Binary files /tmp/fK1P6nZ510/python-virtualenv-1.4.9/virtualenv_support/pip-0.7.2.tar.gz and /tmp/bKAKaRp6nY/python-virtualenv-1.6.4/virtualenv_support/pip-0.7.2.tar.gz differ Binary files /tmp/fK1P6nZ510/python-virtualenv-1.4.9/virtualenv_support/pip-1.0.2.tar.gz and /tmp/bKAKaRp6nY/python-virtualenv-1.6.4/virtualenv_support/pip-1.0.2.tar.gz differ Binary files /tmp/fK1P6nZ510/python-virtualenv-1.4.9/virtualenv_support/setuptools-0.6c11-py2.7.egg and /tmp/bKAKaRp6nY/python-virtualenv-1.6.4/virtualenv_support/setuptools-0.6c11-py2.7.egg differ