Compare commits

...

545 Commits
v5 ... v43

Author SHA1 Message Date
Kenneth Reitz 47c40ce086 Squashed commit of smart-requirements branch
commit 60a2a9d0720693b9438b0f1c75f570dc96bf3a4b
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:58:29 2014 -0400

    silent mode

commit 20368e741993a2c96739aa1de457618a5272bfe7
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:56:00 2014 -0400

    pylibmc

commit 8a512995d806ad58e4a8cab9cd712e762277dcf3
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:55:25 2014 -0400

    fix for pip-grep

commit 0b83a0ac11ee67f08dc843b01ecfe72c9b9c2938
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:50:35 2014 -0400

    cat that shit

commit 27095d320f4e6c0a6bccec945efbdb6f09598cfc
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:49:11 2014 -0400

    don't silence the output

commit db15ac279169467e1e78cfcc55cb740660d4b4c9
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:46:55 2014 -0400

    hello

commit 6b851815b07331bf185f218c40d62123df048b7b
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:41:37 2014 -0400

    cleanup

commit b2ccf76ccb244976e5ee71164cfe591925cb13a4
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:41:14 2014 -0400

    remove last debugging statement

commit fdcb7a210327f01fdc49dba00c3928cbb4778c72
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:39:10 2014 -0400

    remove debugging statements

commit dd58a898e4e5244f3b78ce0402537a1b730a3cc3
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:36:02 2014 -0400

    bp watch

commit c722f6e964b2a25f91d153c65f0c473ff22ff4c8
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:34:34 2014 -0400

    install finished

commit 81644ba1956798c06f55a8ce4c86239ca4ee8036
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Fri Aug 1 14:33:04 2014 -0400

    install started

commit 62d0e3b81a5ac25e8ceab735e25cf2bb8d161f0b
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 14:54:59 2014 -0400

    debug

commit 1775a1b206780fd99d013ca7c0cb8d8de17a8461
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 13:01:15 2014 -0400

    test0

commit 3d20cf89ae0f9436a54c456779a544a3b9d226ac
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:57:07 2014 -0400

    test2/2

commit 751d7496893bc84430a93cd479511786bce9abb9
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:50:11 2014 -0400

    silent mode

commit f927b7b3dee18c6ee58b36a3f96ad66e53b8d46d
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:44:58 2014 -0400

    pylibmc with pip-grep

commit 00dfc36701bf72191f0ad7b7d5533ba7a9ac3b10
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:41:11 2014 -0400

    no debug echo

commit 38d78d800583fc89100cadc551ce715c5800f0b8
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:40:06 2014 -0400

    source, not subenv

commit f455de19a8c1150aa2a4df164b90c2dc9a195942
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:36:35 2014 -0400

    don't print "installing dependencies with pip" twice

commit e72ed7ddbafa0722d2ac6f0cdaf4ac4d0ca0f634
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:35:47 2014 -0400

    refactor

commit 64819d9fd7ac042ef56499750b47214eb863f8d2
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:24:26 2014 -0400

    pip-grep

commit 5e075dd7dbeda9084ea7ce0151dc17924251c258
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Thu Jul 31 12:24:13 2014 -0400

    no more travis

commit bc9baba04436dc7b8aefeaee24e820a9720ee9e8
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 13:32:40 2014 -0400

    if not requirement

commit 0918d781e50e6190d1045c19c5c5a37e00d669dc
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 13:28:28 2014 -0400

    only use requirments that are truthy

commit 4f0f750407eae6bc7faea50c7b607a10a11ad1c5
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 13:25:15 2014 -0400

    new version of pip-diff

commit d13b397a21733d0a0a5e31c4995dc6a3b65cd977
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 13:12:23 2014 -0400

    ignore errors for pip-diff

commit bb09fb0d5051f69a35e086030b11fd39d1539f84
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 12:55:55 2014 -0400

    uninstall the packages

commit 29b2e1f2dbe7761e3f7f55827d0adcd0025aeb4b
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 12:47:21 2014 -0400

    maybe this one should be relative

commit 2448558624fdce634350e904eaad5fd3aa725c22
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 12:44:04 2014 -0400

    docopt

commit 47010d297330869516f6add46ace97a41cdccb8d
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 29 12:40:36 2014 -0400

    first pass at pip-pop integration

commit 59ac5912e1322be771d1969687891ebeb9f4b5f0
Author: Kenneth Reitz <me@kennethreitz.com>
Date:   Tue Jul 22 14:42:08 2014 -0400

    copy requirements
2014-08-01 15:00:38 -04:00
Kenneth Reitz 2032942b61 Merge remote-tracking branch 'origin/master' 2014-07-18 14:46:33 -04:00
Kenneth Reitz 0076fe4f53 remove bunk pypys 2014-07-18 14:46:31 -04:00
Kenneth Reitz 9b18412ecc pypy ALL the things! 2014-07-18 14:30:02 -04:00
Kenneth Reitz 5f0ba6a371 pypy 2.3.1 attempt for cedar-14 2014-07-18 14:08:02 -04:00
kennethreitz 1e2953b22e Update Readme.md 2014-07-18 13:53:51 -04:00
kennethreitz e27ad6f919 Update Readme.md 2014-07-18 13:52:48 -04:00
Kenneth Reitz bfa7180b7b setuptools v5.4.1 2014-07-18 13:46:06 -04:00
Kenneth Reitz 24ae4f9bda further output cleanups 2014-07-18 13:42:32 -04:00
Kenneth Reitz cbb7512c9a cleanup build output a bit 2014-07-18 13:39:36 -04:00
Kenneth Reitz 869576e8ab hard-coded to system python 2014-07-18 13:31:14 -04:00
Kenneth Reitz 9187dccb54 remove debugging information 2014-07-17 16:44:38 -04:00
Kenneth Reitz eb6193d13e really don't skip install 2014-07-17 16:43:38 -04:00
Kenneth Reitz a43eaaaf81 don't skip the install 2014-07-17 16:42:05 -04:00
Kenneth Reitz c31574d7d6 record the stack 2014-07-17 16:40:04 -04:00
Kenneth Reitz 3a42f565cb change the order of things 2014-07-17 16:39:29 -04:00
Kenneth Reitz 8f1942a9a5 don't hardcode cedar-14 2014-07-17 16:24:38 -04:00
Kenneth Reitz ab05b61638 stack changed, delete things 2014-07-17 16:21:36 -04:00
Kenneth Reitz 5c4a414cb7 $STACK and $CACHED_PYTHON_STACK 2014-07-17 15:56:13 -04:00
Kenneth Reitz 0e11dbadbf bpwatch 2014-07-17 15:40:32 -04:00
Kenneth Reitz 96cf5718b2 2.6.0, 2.6.1 notices for cedar, not cedar-14 2014-07-16 10:34:25 -04:00
Kenneth Reitz d3f8351744 no tests 2014-07-15 10:56:04 -04:00
Kenneth Reitz 9d903fd92f changes 2014-07-15 10:36:01 -04:00
Kenneth Reitz f77d8aaec3 disable sticky versions 2014-07-11 14:50:31 -04:00
Kenneth Reitz 4c2b867172 cedar-14 in download url, echo stack 2014-07-11 14:36:51 -04:00
Kenneth Reitz 1bdf4a0c64 debugging 2014-07-11 13:39:16 -04:00
Kenneth Reitz c2b1465548 missed two more 2014-07-11 13:36:41 -04:00
Kenneth Reitz f4471062a9 missed one 2014-07-11 13:35:05 -04:00
Kenneth Reitz f843a95343 comment out all bpwatch calls 2014-07-11 13:28:28 -04:00
Kenneth Reitz 1605422808 no pypy yet 2014-07-09 16:37:33 -04:00
Kenneth Reitz 5ee2bdbd10 no shared for python-2.7.8 2014-07-09 16:37:12 -04:00
Kenneth Reitz f4c7160763 ld_library_path? 2014-07-07 14:20:34 -04:00
Kenneth Reitz 3e81740517 pypy v2.3.1 2014-07-07 14:10:38 -04:00
Kenneth Reitz a8e065969f libffi: --enable-shared 2014-07-07 13:59:34 -04:00
Kenneth Reitz 688d167190 pypy 2.0 2014-07-07 13:54:40 -04:00
Kenneth Reitz 4553dafeca autoconf formula 2014-07-07 13:47:02 -04:00
Kenneth Reitz 8aeceb00e4 libffi 2014-07-07 13:42:06 -04:00
Kenneth Reitz 022aa736ec update of autoconf 2014-07-07 13:39:36 -04:00
Kenneth Reitz 2cad413958 new libffi attempt 2014-07-07 13:28:12 -04:00
Kenneth Reitz f5fb42e535 add autoconf 2014-07-07 13:21:45 -04:00
Kenneth Reitz 4995eeec41 follow redirects 2014-07-07 13:16:19 -04:00
Kenneth Reitz 0961b59420 libffi attempt 2014-07-07 13:13:48 -04:00
Kenneth Reitz 1fdeedf112 python 3.3.5 2014-07-03 16:55:45 -04:00
Kenneth Reitz 43c7079a07 Default Python: 2.7.8 2014-07-02 10:33:24 -04:00
Kenneth Reitz 097f64721a merge 2014-07-02 10:28:38 -04:00
Kenneth Reitz b3b6c78657 update readme with new python versions 2014-07-02 10:27:38 -04:00
Kenneth Reitz fcfc2f8651 python-2.7.8 (--shared) 2014-07-02 10:12:19 -04:00
kennethreitz 1f9b0bfe02 Merge pull request #150 from cclauss/patch-2
Readme: Update Python versions to match compile
2014-06-20 06:04:33 +08:00
kennethreitz 533def6b57 Merge pull request #152 from yunojuno/master
Update pylibmc to support nested requirements.
2014-06-20 06:03:25 +08:00
Hugo Rodger-Brown 826193ef5a Update pylibmc to support nested requirements.
The current regex assumes that pylibmc appears at the beginning of a line
(whitespace only precedes it), which is a fair assumption in a single 'flat'
requirements.txt file. However, if you are using nested requirements then
this is not the case - your pylibmc may exist in a sub-directory. This is
very similar to the way in which mercurial is installed if "hg+" is found
in the requirements file (see the /bin/compile script). By insisting that
pylibmc appear at the beginning of the file, it's impossible to fool the
compilation into installing libmemcached (as this script does) by simply
putting the phrase into a comment, which is what you *can* do with 'hg+'.

I've updated the regex to remove the beginning of line restriction. This
means that you can add a comment to a top-level requirements.txt that
will trigger the install, without having to functionally alter your
nested requirements.

e.g. top-level requirements.txt:

    # fake comment to trigger pylibmc script
    # fake comment to trigger hg+ install
    -r requirements/production.txt
2014-06-18 18:13:37 +01:00
cclauss 631aa4b356 Readme: Update Python versions to match compile
Also matches recent updates to https://devcenter.heroku.com/articles/python-runtimes
2014-06-17 20:09:25 +02:00
Kenneth Reitz 067422b4b4 disabled shared for python-2.7.7 (for reportlab) 2014-06-12 16:46:34 -04:00
Kenneth Reitz 7ec8f12648 append $LD_LIBRARY_PATH 2014-06-04 17:12:24 -04:00
Kenneth Reitz 731a0cb0bf ignore LIBRARY_CONFIG from the environment. 2014-06-04 11:21:02 -04:00
Kenneth Reitz ebd97e9b93 Make LD_LIBRARY_PATH 2014-06-04 11:20:20 -04:00
kennethreitz 9fcf81c170 Merge pull request #147 from cclauss/patch-7
Update pypy-1.9
2014-06-03 16:12:38 -04:00
kennethreitz 1f2cb16dbb Merge pull request #148 from cclauss/patch-6
Update pypy-1.8
2014-06-03 14:45:29 -04:00
cclauss 827306728f Update pypy-1.9
1.7 --> 1.9 in two locations.
2014-06-03 06:57:01 +02:00
cclauss f6076cb7f0 Update pypy-1.8
1.7 --> 1.8 in two locations.
2014-06-03 06:55:47 +02:00
Kenneth Reitz 694386e233 pypy time 2014-06-02 17:55:32 -04:00
Kenneth Reitz f11928af11 pypy 1.x series 2014-06-02 17:49:12 -04:00
Kenneth Reitz acda8f640a ughhhhhh 2014-06-02 17:41:01 -04:00
Kenneth Reitz 4ff3a5d818 lol consistency
Who was the 3.3.0 release manager? :)
2014-06-02 17:39:07 -04:00
Kenneth Reitz 314b729c8a 3.3.x series 2014-06-02 17:35:10 -04:00
Kenneth Reitz 9fb676aba9 python 3.x series 2014-06-02 17:12:42 -04:00
Kenneth Reitz b91741d10d 3.1.x series 2014-06-02 17:08:15 -04:00
Kenneth Reitz f3787356b6 2.4.x series 2014-06-02 16:56:26 -04:00
Kenneth Reitz def3136c85 no shared for 2.5 2014-06-02 15:34:28 -04:00
Kenneth Reitz abb0c9b384 Python 2.5.x series 2014-06-02 14:49:11 -04:00
Kenneth Reitz 87b2891c1a set LIBRARY_PATH and LD_LIBRARY_PATH in runtime 2014-06-02 14:03:59 -04:00
Kenneth Reitz 52c34ef64f append to include paths 2014-06-02 13:55:05 -04:00
Kenneth Reitz 40bc836a55 --enable-shared
/cc @GrahamDumpleton
2014-06-02 10:44:05 -04:00
Kenneth Reitz d2738ece19 fix for 2.6.x series 2014-06-02 10:40:09 -04:00
Kenneth Reitz f758a5d738 --enable-shared 2014-06-02 10:28:35 -04:00
Kenneth Reitz 63edc5d89b let's see if that helps 2014-06-02 10:28:29 -04:00
Kenneth Reitz 0db1584f21 try different tarball 2014-06-02 10:15:03 -04:00
Kenneth Reitz 1ed173f21d 2.6.5 2014-06-02 10:06:12 -04:00
Kenneth Reitz b17f3f51f7 2.6.x series! 2014-06-02 10:05:28 -04:00
Kenneth Reitz 4f0556cce7 Import of full 2.7.x series 2014-06-02 09:44:20 -04:00
Kenneth Reitz b55a5e5ec8 python-2.7.7, new build infrastructure 2014-06-02 09:35:57 -04:00
Kenneth Reitz 68acbb064d chmod +x 2014-06-02 09:14:19 -04:00
Kenneth Reitz 92df76793f python 2.7.7 2014-06-02 08:47:06 -04:00
Kenneth Reitz 5cda51c7a5 Removing PYTHONPATH from sub-env blacklist
This should fixe the mysterious collectstatic bug. (#143)
2014-06-02 08:38:29 -04:00
Kenneth Reitz 659a406eb8 3.4.0 2014-05-30 09:43:29 -04:00
Kenneth Reitz 4cf2dd5b32 removed old pip vendoring style 2014-05-30 09:35:25 -04:00
Kenneth Reitz 100a5ba0bc fix uploads 2014-05-30 09:34:39 -04:00
Kenneth Reitz ab16abaa88 new style of pip and setuptools vendoring 2014-05-30 09:31:02 -04:00
Kenneth Reitz 989dd1dd2a pip v1.5.6, setuptools v3.6 2014-05-30 09:06:42 -04:00
Kenneth Reitz 0468ef22c4 revert pip/setuptools changes 2014-05-29 09:00:15 -04:00
kennethreitz 6238994a17 Merge pull request #131 from dulaccc/fix-build-api-compilation
Use a default SLUG_ID value
2014-05-26 09:09:37 -04:00
kennethreitz 7ba2fe66a0 Merge pull request #138 from cclauss/master
Test cases for django 1.6, simple-runtime-P2, P3, and Pypy2
2014-05-26 09:08:49 -04:00
kennethreitz dfaec438d9 Merge pull request #141 from cclauss/patch-3
Create python-3.4.1
2014-05-26 08:30:46 -04:00
cclauss aaeef59ff6 Create python-3.4.1 2014-05-19 21:13:31 +02:00
cclauss 4d35f5129a Updated latest supported Python3 to 3.4.0 2014-05-11 23:29:01 +02:00
cclauss 84f610347c Updated pip to 1.5.5 and setuptools to 3.6 2014-05-11 23:04:33 +02:00
cclauss 44bfda1320 Added django 1.6, simple-runtime-P2, P3, and Pypy2 2014-05-11 23:00:05 +02:00
cclauss 330524adba Changed if len(history): to if history: 2014-05-11 22:47:30 +02:00
cclauss 85bddf8f00 Added simple runtime test for Pypy 2 2014-05-11 22:44:39 +02:00
cclauss 7b0d891f4d Added simple runtime test for Pypy 2 2014-05-11 22:43:45 +02:00
cclauss 84f0e2feba Added simple runtime test for Pypy 2 2014-05-11 22:42:49 +02:00
cclauss 76309c35ec Added simple runtime test for Python 2 2014-05-11 22:38:35 +02:00
cclauss 3f6b453c0a Added simple runtime test for Python 2 2014-05-11 22:37:03 +02:00
cclauss 43dbb49103 Updated Requests to 2.2.1 2014-05-11 22:33:33 +02:00
cclauss f08f93f347 Updated Python to 3.4.0 2014-05-11 22:32:20 +02:00
cclauss e0c852f4b9 Added django 1.6 skeleton for testing 2014-05-11 22:30:27 +02:00
cclauss 15373996f4 Added django 1.6 skeleton for testing 2014-05-11 22:29:42 +02:00
cclauss ff1e8da0cb Added django 1.6 skeleton for testing 2014-05-11 22:28:41 +02:00
cclauss 99f7f5b9f1 Update __init__.py 2014-05-11 22:27:31 +02:00
cclauss 656f390de8 Added django 1.6 skeleton for testing 2014-05-11 22:27:15 +02:00
cclauss 42a7e79359 Added django 1.6 skeleton for testing 2014-05-11 22:26:20 +02:00
cclauss bf084cc2ac Added django 1.6 skeleton for testing 2014-05-11 22:24:44 +02:00
cclauss eaaba665bc Added django 1.6 skeleton for testing 2014-05-11 22:23:24 +02:00
kennethreitz 94d311134c Merge pull request #132 from dulaccc/fix-tests
Add missing Makefile
2014-04-28 18:16:50 -04:00
Pierre Dulac 0d49ae9851 Add missing Makefile 2014-04-21 11:46:45 +02:00
Pierre Dulac a5c39384a8 Use a default SLUG_ID value
otherwise the build fails using the Heroku beta
[builds api](https://gist.github.com/friism/c5df3e3e0091bbc6b9f2)
2014-04-20 14:53:47 +02:00
Kenneth Reitz cb6bc30bc6 deploy instructions 2014-04-02 14:40:15 -04:00
Kenneth Reitz 82c72a94d9 v0.0.5 2014-04-02 14:32:12 -04:00
Kenneth Reitz f327afd364 builds for python 2014-04-02 14:29:33 -04:00
Kenneth Reitz d94f4c5bbc Merge branch 'master' into builds 2014-04-02 14:06:57 -04:00
Kenneth Reitz 8be04ea656 no ! 2014-04-02 14:05:09 -04:00
Kenneth Reitz de7c16d942 handhold for collectstatic 2014-04-02 14:02:18 -04:00
Kenneth Reitz 5ea843458a improved collectstatic experience 2014-04-02 13:37:19 -04:00
Kenneth Reitz 758941d12f readme stub 2014-03-26 11:33:14 -04:00
Kenneth Reitz e01d5bc18b bob-builder start 2014-03-26 11:30:27 -04:00
Kenneth Reitz 2c16539190 Merge branch 'stop-finding' of git://github.com/agriffis/heroku-buildpack-python into develop 2014-03-21 15:57:39 -04:00
kennethreitz ed79e61a2f Merge pull request #120 from agriffis/sed-func
Use a sed() function for unbuffered output.
2014-03-21 15:51:18 -04:00
kennethreitz b7bcc69722 Update Readme.md 2014-03-03 16:02:31 -05:00
Kenneth Reitz 3dde375d0b pip v1.5.4 2014-02-21 10:08:50 -06:00
Kenneth Reitz 483e30a5ba --allow-all-external 2014-02-21 10:04:23 -06:00
Aron Griffis e783556e6b dotglob FTW. Doesn't expand . or .. but be explicit just in case. 2014-02-19 20:43:18 -05:00
Kenneth Reitz 5645a433dc Merge remote-tracking branch 'origin/master' 2014-02-19 11:59:07 -05:00
Kenneth Reitz 715ab8b96a Update to Setuptools 2.1 and Pip 1.5.2
So seamless.
2014-02-19 11:59:02 -05:00
Aron Griffis 5f96190eb5 Stop calling find for simple operations. Just use extglob.
Additionally use `cp -a` consistently rather than alternating between
`cp -a` and `cp -r`, and don't fail compile if the glob doesn't expand to
anything.
2014-02-17 15:28:17 -05:00
Aron Griffis c579162ef9 Use consistent syntax for declaring functions in utils 2014-02-17 14:55:55 -05:00
Aron Griffis a5cca6de75 Use a sed() function for unbuffered output.
In `bin/steps/collectstatic` the unbuffered output in `indent` is subverted
by calling `sed` first:

```shell
python $MANAGE_FILE collectstatic --noinput  2>&1 | sed '/^Copying/d;/^$/d;/^ /d' | indent
```

This commit fixes this by making `sed` itself unbuffered rather than
putting that logic in the `indent` function.
2014-02-17 14:49:09 -05:00
kennethreitz b7f1157693 Merge pull request #118 from uniphil/master
fix url to testing buildpack
2014-02-14 13:58:49 -05:00
Phil Schleihauf ae7b6fc715 fix url to testing buildpack 2014-02-14 13:56:49 -05:00
Kenneth Reitz e0c3b72950 update runtime docs, thanks @uniphil!
#117
2014-02-14 13:41:34 -05:00
Kenneth Reitz 566f7f4555 new buildpack env standard 2014-01-21 17:47:05 -05:00
Kenneth Reitz 4ff62b2b41 sticky python versions bugfix 2014-01-17 17:06:54 -08:00
Kenneth Reitz d47970fd81 sticky runtimes 2014-01-17 16:47:55 -08:00
Kenneth Reitz 69bdca063f fix sub-env for when env file is not present 2013-12-20 17:15:24 -05:00
Kenneth Reitz 63cea99415 chmod +x 2013-12-20 16:48:34 -05:00
Kenneth Reitz 5ecd27e3b8 chmod +x 2013-12-13 16:03:39 -08:00
Kenneth Reitz 206a2dbc04 third argument support for envs in compile 2013-12-13 15:48:39 -08:00
kennethreitz 2a083791b6 Merge pull request #113 from zyegfryed/patch-3
Fixed Python runtime according to the official Heroku doc
2013-11-14 19:59:56 -08:00
kennethreitz d5b2b0b464 Merge pull request #114 from catsby/update_default_postgresql
Update Heroku Postgresql default add-on to hobby-dev
2013-11-14 19:59:40 -08:00
Clint Shryock 2eab1ad845 Update Heroku Postgresql default add-on to hobby-dev 2013-11-12 14:10:52 -06:00
Sébastien Fievet 2b16420d41 Fixed Python runtime according to the official Heroku doc
See https://devcenter.heroku.com/articles/python-runtimes#supported-runtimes
2013-11-04 09:24:36 +01:00
kennethreitz 9fa0889499 Update bpwatch 2013-10-17 15:43:51 -04:00
kennethreitz 99b17fabeb Merge pull request #105 from bacongobbler/patch-1
update shebang to use python2 for bpwatch
2013-10-17 11:37:00 -07:00
kennethreitz 933d3014d7 Merge pull request #103 from grosskur/library-path-fix
Make vendored libraries available at compile time (fixes #57)
2013-10-17 11:36:34 -07:00
Kenneth Reitz 018e0f31de Merge remote-tracking branch 'origin/master' 2013-09-01 06:27:46 +05:30
Kenneth Reitz cf1647e937 no --use-mirrors 2013-09-01 06:27:18 +05:30
Matthew Fisher b9f154bf38 update shebang to use python2 for bpwatch 2013-08-27 16:49:55 -07:00
Kenneth Reitz 4cc18ce0af Merge pull request #104 from zyegfryed/patch-1
Typo
2013-08-27 09:12:23 -07:00
Sébastien Fievet f5ea1c24a3 Typo 2013-08-25 18:41:46 +02:00
Kenneth Reitz 952b0bb735 v28 2013-08-14 22:02:11 -04:00
Kenneth Reitz 8b7edad8a2 bugfix for bpwatch 2013-08-14 22:01:16 -04:00
Kenneth Reitz 02787ac910 update bpwatch.zip for request_id 2013-08-14 21:19:12 -04:00
Alan Grosskurth bcc3ba09ca Make vendored libraries available at compile time (fixes #57)
When building, BUILD_DIR is set to a temporary directory. Vendored
libraries (e.g., pylibmc) are downloaded and unpacked in
$BUILD_DIR/.heroku/vendor/lib, but this is not currently in
LIBRARY_PATH or LD_LIBRARY_PATH.

Fix this by doing the following:

* Add $BUILD_DIR/.heroku/vendor/lib to LIBRARY_PATH/LD_LIBRARY_PATH

* Add $BUILD_DIR/.heroku/vendor/include to
  C_INCLUDE_PATH/CPLUS_INCLUDE_PATH

* Add $BUILD_DIR/.heroku/vendor/bin to PATH, so vendored commands can
  be used at compile time (e.g., curl-config)

* Add $BUILD_DIR/.heroku/vendor/lib/pkg-config to PKG_CONFIG_PATH, so
  vendored packages can be found with pkg-config
2013-08-14 16:59:31 -07:00
Kenneth Reitz 31e65dc58b new bpwatch 2013-07-17 17:04:37 -04:00
Kenneth Reitz 9a227e6c73 v24 2013-07-17 08:38:47 -04:00
Kenneth Reitz ddc9c24d34 deep-rm for normal builds 2013-07-17 08:34:14 -04:00
Kenneth Reitz 42488a2be7 deep-rm 2013-07-17 08:33:36 -04:00
Kenneth Reitz 839486c25b make things pretty, skip anvil build for normal runs 2013-07-17 08:25:17 -04:00
Kenneth Reitz 5d56200179 bugfix for legacy apps + usr_env_compile 2013-07-16 16:54:33 -04:00
Kenneth Reitz fef1d4f7c0 instrumentation 2013-07-16 15:10:49 -04:00
Kenneth Reitz 43defcc17e Revert "skip anvil steps that slow things down"
This reverts commit f78460e2a7.
2013-07-16 00:30:00 -04:00
Kenneth Reitz f78460e2a7 skip anvil steps that slow things down 2013-06-26 14:00:13 -04:00
Kenneth Reitz 3448923b69 collectstatic logic improvements 2013-06-26 13:58:00 -04:00
Kenneth Reitz 58a13bc268 Merge pull request #93 from bacongobbler/master
Add Django v1.5 testing support with Heroku
2013-06-05 13:09:42 -07:00
bacongobbler c18038f986 added Django v1.5 tests 2013-05-22 17:50:52 -07:00
bacongobbler d4356a1f4c added requirements.txt with django v1.5 2013-05-22 17:41:34 -07:00
bacongobbler 3c8f478b65 added django 1.5 skeleton for testing 2013-05-22 17:37:12 -07:00
Kenneth Reitz 23493302e6 Update Readme.md 2013-04-30 13:31:53 -03:00
Kenneth Reitz 35ceaf728d Merge pull request #90 from buildingenergy/master
Store changes made in post_compile in the cache.
2013-04-27 17:59:46 -07:00
Steven Skoczen 5c9412fc33 moves cache storage until after the post_compile hook. 2013-04-26 16:27:00 -07:00
Kenneth Reitz 825c9329eb Merge pull request #89 from gregburek/use-pg-dev-db
Remove shared db from release and add heroku-postgresql dev db
2013-04-23 23:53:21 -07:00
gregburek 9ebb990716 Remove shared db and add heroku-postgresql dev db 2013-04-23 23:50:54 -07:00
Kenneth Reitz f964209589 Merge remote-tracking branch 'origin/master' 2013-04-10 08:01:34 -07:00
Kenneth Reitz 2e699d392e Merge pull request #86 from manojlds/master
Fixing the compile hook scripts paths
2013-04-10 07:54:51 -07:00
manojlds 431ecee509 Using the bin path at root of pwd
The compile script is run with the root of the git repo of the project
being pushed as the working directory.

$BIN_DIR is pointing to the bin directory of the buildpack which is not
where you would want to put the pre and post compile hooks.

Changing back to the old convention of looking for the hooks from the
bin directory at the root of the project.
2013-04-10 15:06:51 +05:30
Kenneth Reitz 90696215ae python-2.7.4 default version 2013-04-09 15:03:27 -07:00
Kenneth Reitz 5b55261700 Merge pull request #73 from incuna/hooks-fix
Use $BIN_DIR in hooks.
2013-04-09 10:25:13 -07:00
Kenneth Reitz 727ff90acf Merge pull request #83 from aljosa/distribute_version_upgrade
upgraded distribute to v0.6.36.
2013-04-08 15:10:22 -07:00
Aljosa Mohorovic 0060fdacd8 upgraded distribute to v0.6.36.
fixes pip v1.3.1 installation issue
2013-04-08 18:00:53 +02:00
Kenneth Reitz 85ad1fa988 Merge pull request #78 from streeter/master
Allow pylibmc to be commented out in the requirements file
2013-03-21 00:53:49 -07:00
Kenneth Reitz 56c022ca41 remove bunk files 2013-03-20 03:44:19 -07:00
Chris Streeter f68e0989ea Allow pylibmc to be disabled. 2013-03-12 22:24:08 -07:00
Kenneth Reitz 7381117bb8 working dir fix 2013-03-07 23:11:06 -05:00
Kenneth Reitz c9209ebb3d fixes and cleanups 2013-03-07 21:10:46 -05:00
Kenneth Reitz 35345d11f5 run hash after install 2013-03-07 21:05:59 -05:00
Kenneth Reitz 6ee17b4c26 debug 2013-03-07 21:02:54 -05:00
Kenneth Reitz 86267f93a1 hash -r 2013-03-07 21:01:09 -05:00
Kenneth Reitz 50642e7069 check for fresh python before we try to run pip 2013-03-07 21:00:01 -05:00
Kenneth Reitz 8349f291d2 print updated pip version at install time 2013-03-07 20:52:36 -05:00
Kenneth Reitz 1aad21382e update pip if it is out of date 2013-03-07 20:50:51 -05:00
Kenneth Reitz 686ee087a5 use new pip/distribute 2013-03-07 20:40:32 -05:00
Kenneth Reitz f137ba213a sanity check 2013-03-07 20:38:06 -05:00
Kenneth Reitz 5ae51010cc update pip to v0.3.1 2013-03-07 20:37:40 -05:00
Kenneth Reitz 29d8e7f670 update distribute to v0.6.35 2013-03-07 20:36:03 -05:00
Marc Tamlyn 5be3e0ce52 Use $BIN_DIR in hooks. 2013-01-11 10:54:05 +00:00
Kenneth Reitz ddde30a12e new pylibmc test 2013-01-09 13:18:22 -05:00
Kenneth Reitz 2db5578998 set buildtime vars, cleanup comments
/cc @alexclark
2013-01-09 13:04:27 -05:00
Kenneth Reitz 290250836f unnecessary PYTHONHOME for uWSGI 2013-01-04 15:06:17 -05:00
Kenneth Reitz 0ff4df4dc3 much better 2013-01-03 14:57:08 -05:00
Kenneth Reitz 9177aa2c08 remove bunk 2013-01-03 14:20:43 -05:00
Kenneth Reitz ad791dc7f8 v14 2013-01-03 14:17:04 -05:00
Kenneth Reitz 6b298ff7f3 remove bunk cd 2013-01-03 14:06:09 -05:00
Kenneth Reitz 01e30e938c move precompile up a bit 2013-01-03 14:05:29 -05:00
Kenneth Reitz e81632e05e kill the source 2013-01-02 22:45:02 -05:00
Kenneth Reitz 4ab3358851 better 2013-01-02 22:40:52 -05:00
Kenneth Reitz 4ded988907 Merge remote-tracking branch 'origin/master' 2013-01-02 22:26:19 -05:00
Kenneth Reitz 8637dc05c0 cleanups 2013-01-02 22:26:15 -05:00
Kenneth Reitz 6f65ad0b97 Update Readme.md 2013-01-02 22:22:07 -05:00
Kenneth Reitz c5ec378ea7 Update Readme.md 2013-01-02 22:19:19 -05:00
Kenneth Reitz 37013c2eca Update Readme.md 2013-01-02 22:17:09 -05:00
Kenneth Reitz 54a8a6407e Update Readme.md 2013-01-02 22:16:37 -05:00
Kenneth Reitz 69360fb804 Update Readme.md 2013-01-02 22:15:47 -05:00
Kenneth Reitz 92d296ec24 Update Readme.md 2013-01-02 22:14:39 -05:00
Kenneth Reitz 99557332a0 defaults 2013-01-02 21:42:16 -05:00
Kenneth Reitz a3d9c5a1b2 $? 2013-01-02 20:55:21 -05:00
Kenneth Reitz 235ff64a38 all the things 2013-01-02 20:47:12 -05:00
Kenneth Reitz 0f7fca9e03 better error message 2013-01-02 20:45:57 -05:00
Kenneth Reitz 161bf49a3a abort if bad python requested 2013-01-02 20:43:58 -05:00
Kenneth Reitz 7ac90f19dd unbuffer all the things 2013-01-02 20:30:49 -05:00
Kenneth Reitz 90cc426c82 force sed to be line buffered 2013-01-02 20:21:39 -05:00
Kenneth Reitz 550a239553 add indent back 2013-01-02 20:14:49 -05:00
Kenneth Reitz 57fea1bd6f test buffered out 2013-01-02 20:13:01 -05:00
Kenneth Reitz d758545164 new distribute 2013-01-02 20:10:37 -05:00
Kenneth Reitz 5935632b8b distribute 2013-01-02 20:10:15 -05:00
Kenneth Reitz 8f3a7b7947 test 2013-01-02 19:56:53 -05:00
Kenneth Reitz 2f47bd12fd which python 2013-01-02 19:49:21 -05:00
Kenneth Reitz 86fb607dd4 ls 2013-01-02 19:41:19 -05:00
Kenneth Reitz 80823b1e16 debug=1 2013-01-02 19:39:36 -05:00
Kenneth Reitz ff6f56b8c5 2013 2012-12-31 18:02:02 -05:00
Kenneth Reitz 5393ba3cb4 Merge pull request #69 from saulshanabrook/pylibmc_list_requirements
Use all requirements for checking hg+ and pylibmc, fixed #58
2012-12-28 06:05:56 -08:00
Saul Shanabrook 4ade6c0457 Helper functions to test if in requirements used for checking for mercurial install and for pylibmc 2012-12-28 09:02:09 -05:00
Kenneth Reitz e5c389e677 Merge pull request #65 from heroku/versions
Arbitrary Python Versions
2012-12-20 19:11:56 -08:00
Kenneth Reitz ea27b5a77c proper installations 2012-12-20 04:08:15 -05:00
Kenneth Reitz 18c19e4466 only talk about runtime once 2012-12-20 03:38:56 -05:00
Kenneth Reitz 0ea950ee52 don't allow overwritten PYTHONHOME 2012-12-20 03:27:20 -05:00
Kenneth Reitz 2d3033fc71 remove old virtualenvs 2012-12-20 03:23:28 -05:00
Kenneth Reitz 1687f1cffe test 2012-12-20 02:53:52 -05:00
Kenneth Reitz 2f0263a5b8 distribute 2012-12-20 02:45:26 -05:00
Kenneth Reitz dfbf20acd2 test 2012-12-19 23:53:40 -05:00
Kenneth Reitz 0b9019ab71 test 2012-12-19 23:37:51 -05:00
Kenneth Reitz b0fc2245f4 test 2012-12-19 23:32:15 -05:00
Kenneth Reitz 113c669041 test 2012-12-19 23:30:54 -05:00
Kenneth Reitz b8b5e12a4a distribute v0.6.32 2012-12-19 23:29:37 -05:00
Kenneth Reitz bece3de495 test 2012-12-19 23:29:16 -05:00
Kenneth Reitz 89120f7797 test 2012-12-19 23:26:27 -05:00
Kenneth Reitz 99e035495b test 2012-12-19 23:24:18 -05:00
Kenneth Reitz 0c56b0c35c test 2012-12-19 23:21:11 -05:00
Kenneth Reitz 111f92e368 test 2012-12-19 23:20:11 -05:00
Kenneth Reitz 03e666ffea test 2012-12-19 23:18:31 -05:00
Kenneth Reitz 40598be9d4 test 2012-12-19 23:17:06 -05:00
Kenneth Reitz 8f057f3c9b test 2012-12-19 23:15:14 -05:00
Kenneth Reitz 972e6f8054 test 2012-12-19 23:10:24 -05:00
Kenneth Reitz aeb7ef392a test 2012-12-19 23:08:23 -05:00
Kenneth Reitz 930a63d55c further test 2012-12-19 23:05:57 -05:00
Kenneth Reitz 544de727a0 test 2012-12-19 23:02:35 -05:00
Kenneth Reitz 466e6b5fe3 cleanup 2012-12-19 22:53:04 -05:00
Kenneth Reitz 1abaaf6cf1 update deps 2012-12-19 22:45:05 -05:00
Kenneth Reitz 48bd910207 test simple-runtime on 2.6 2012-12-19 22:45:00 -05:00
Kenneth Reitz 87c580f819 fix deep-cp bug 2012-12-19 22:44:49 -05:00
Kenneth Reitz db1df1ac67 basics working 2012-12-19 22:42:56 -05:00
Kenneth Reitz 4005d7ea50 simple runtime test app 2012-12-19 21:45:38 -05:00
Kenneth Reitz d29d4404c3 update tests for no Python/Django 2012-12-19 21:43:56 -05:00
Kenneth Reitz 33779576bd changes 2012-12-19 21:41:07 -05:00
Kenneth Reitz 3bddd66637 serious business 2012-12-19 21:31:16 -05:00
Kenneth Reitz e00a407c91 source collectstatic 2012-12-19 21:18:48 -05:00
Kenneth Reitz 117dcff4e1 collectstatic always 2012-12-19 21:17:49 -05:00
Kenneth Reitz 7243afd5b5 simplify django check 2012-12-17 13:49:16 -05:00
Kenneth Reitz 0a75bc9744 Merge pull request #63 from heroku/dot-profile-d
Support for ~/.profile.d
2012-12-17 10:24:27 -08:00
Kenneth Reitz ca3b3808b9 simplify purge 2012-12-06 18:01:48 -05:00
Kenneth Reitz 287b398826 better comments 2012-12-06 17:58:44 -05:00
Kenneth Reitz 76d2eda80e LEGACY_TRIGGER 2012-12-06 17:54:53 -05:00
Kenneth Reitz 880c498c3f simplfy comments 2012-12-06 17:53:38 -05:00
Kenneth Reitz 12f053ef7f remove almost all django support 2012-12-06 17:51:40 -05:00
Kenneth Reitz 35ee2f60bd remove bunk 2012-12-06 17:37:53 -05:00
Kenneth Reitz 3e480e9aea purge old virtualenvs 2012-12-06 17:34:04 -05:00
Kenneth Reitz 46ba98a4ee no LEGACY_VIRTUALENV default 2012-12-06 12:48:37 -05:00
Kenneth Reitz 958de9441a not for legacy apps yet 2012-12-06 12:43:07 -05:00
Kenneth Reitz 74312f5487 injection warning 2012-12-03 16:17:01 +01:00
Kenneth Reitz ecf5278679 extract utils 2012-12-03 16:00:23 +01:00
Kenneth Reitz 863abfb00e cleanups 2012-12-03 15:01:05 +01:00
Kenneth Reitz f782693537 patched pip version 2012-12-03 12:39:16 +01:00
Kenneth Reitz a2c2411109 test 2012-12-03 12:29:21 +01:00
Kenneth Reitz 712f02e359 v1.8.4 2012-12-03 12:29:13 +01:00
Kenneth Reitz 61477e515a Merge remote-tracking branch 'origin/master' 2012-12-03 12:27:26 +01:00
Kenneth Reitz be9343534a virtualenv 1.8.4 2012-12-03 12:26:27 +01:00
Kenneth Reitz 2b4e9be4ad Merge pull request #61 from gulopine/already-satisfied
Clean up output of virtualenv setup
2012-12-03 03:23:54 -08:00
Kenneth Reitz 382dff7e3b update scripts 2012-11-18 02:27:31 +01:00
Kenneth Reitz 6f2012c1c9 updated vendored pip 2012-11-18 02:27:25 +01:00
Kenneth Reitz c71fe81f8d new virtualenv 2012-11-18 02:26:41 +01:00
Kenneth Reitz 91586d6690 Merge pull request #62 from gulopine/ellipses
Collapse ellipses when setting up virtualenv
2012-11-15 07:07:42 -08:00
Marty Alchin 046726b864 Collapse ellipses when setting up virtualenv 2012-11-14 20:37:44 -08:00
Marty Alchin ddf353cff5 Clean up output of virtualenv setup 2012-11-14 20:35:37 -08:00
Kenneth Reitz 160497cb64 Merge pull request #55 from dcrosta/patch-1
Set `$VIRTUALENV_DIRS` for `$CLEAN_VIRTUALENV`
2012-09-23 03:56:33 -07:00
Dan Crosta 6194f94aa7 Set $VIRTUALENV_DIRS for $CLEAN_VIRTUALENV
I had to do this to wipe out my virtualenv -- there may be a more appropriate solution.
2012-09-22 17:30:58 -03:00
Kenneth Reitz e288332f0e .profile.d
🍰 /cc @ddollar
2012-07-16 18:24:42 -04:00
Kenneth Reitz e4979f33e3 profile.d
:(
2012-07-16 18:03:13 -04:00
Kenneth Reitz 03c3aebca8 fix set-default-env escaping 2012-07-16 17:35:01 -04:00
Kenneth Reitz 487a5ffb95 don't clobber envsssssssss 2012-07-16 17:11:17 -04:00
Kenneth Reitz 01d15d4d0e fix links 2012-07-02 00:07:30 -04:00
Kenneth Reitz 6655794b4d distribute 2012-07-01 23:57:42 -04:00
Kenneth Reitz 4beb57a5a0 ch ch changes 2012-07-01 23:33:33 -04:00
Kenneth Reitz bac517e755 patched pip v1.1 2012-07-01 23:31:07 -04:00
Kenneth Reitz 62b68cfcd9 pip v1.1 2012-07-01 23:28:10 -04:00
Kenneth Reitz 481e800a7c virtualenv v1.7.2 2012-07-01 23:21:27 -04:00
Kenneth Reitz 9a7c6c339d changelog 2012-07-01 17:02:19 -04:00
Kenneth Reitz 23340bcfee default path confict 2012-07-01 16:57:34 -04:00
Kenneth Reitz 102979e985 changelog 2012-06-27 14:27:08 -07:00
Kenneth Reitz ab9a4fbe5f typo 2012-06-27 14:16:31 -07:00
Kenneth Reitz aad72f8e81 legacy 2012-06-27 14:13:35 -07:00
Kenneth Reitz 72295bf186 Disable injection for fresh apps 2012-06-27 14:11:53 -07:00
Kenneth Reitz c45a2c14b2 FRESH_APP 2012-06-27 13:35:42 -07:00
Kenneth Reitz ee177b28ff spaces 2012-06-27 12:11:01 -07:00
Kenneth Reitz 2e0f2f59a0 fresh app 2012-06-27 12:08:22 -07:00
Kenneth Reitz 9856efa7c4 remove deprecation warning 2012-06-27 11:42:38 -07:00
Kenneth Reitz 34878b9638 explicit profile path 2012-06-25 13:30:13 -04:00
Kenneth Reitz 27abdfe7d7 Revert "no more release config vars"
This reverts commit 1bd317cd50.
2012-06-25 13:24:42 -04:00
Kenneth Reitz 3b0bdba799 $HOME & $PATH 2012-06-25 13:23:46 -04:00
Kenneth Reitz b547d8c30c cleanup 2012-06-25 13:16:57 -04:00
Kenneth Reitz 1bd317cd50 no more release config vars 2012-06-25 13:14:43 -04:00
Kenneth Reitz 60b57fd368 profile env vars 2012-06-25 13:13:54 -04:00
Kenneth Reitz 27a22e8ccb .profile.d/python 2012-06-25 13:11:17 -04:00
Kenneth Reitz 0378bbb491 profile.d 2012-06-14 16:40:37 -04:00
Kenneth Reitz bccec5cee9 Merge pull request #47 from ojno/master
Option to purge and recreate virtualenv
2012-06-01 13:20:14 -07:00
Jonathan French d6fbb29977 add CLEAN_VIRTUALENV option to purge and recreate virtualenv 2012-06-01 20:59:34 +01:00
Kenneth Reitz 9d0bf98a52 v13 2012-05-31 20:30:38 -04:00
Kenneth Reitz 795272d625 only talk about static files when configured 2012-05-31 20:29:14 -04:00
Kenneth Reitz c3866f80b6 fix pip quoting 2012-05-31 20:24:35 -04:00
Kenneth Reitz 580a662f36 v12 2012-05-31 15:45:51 -04:00
Kenneth Reitz 5767e0df04 more careful database setting 2012-05-31 15:40:31 -04:00
Kenneth Reitz eeb63f215a v11 2012-05-31 02:45:43 -04:00
Kenneth Reitz 5a6e4e49b4 cleanup collectstatic output 2012-05-31 02:44:56 -04:00
Kenneth Reitz b6eada4e67 exclude overly verbose 'copying' lines 2012-05-31 02:35:33 -04:00
Kenneth Reitz bbe0acf001 whitespace 2012-05-31 02:02:11 -04:00
Kenneth Reitz 05e65801fa always show django deprecation warning 2012-05-31 01:59:37 -04:00
Kenneth Reitz 08338a4a26 Do everything except modify the filesystem. 2012-05-31 01:59:07 -04:00
Kenneth Reitz bf913e0016 collectstatic not a warning 2012-05-31 01:52:38 -04:00
Kenneth Reitz 774ceb3367 v10 2012-05-31 01:51:21 -04:00
Kenneth Reitz 335a14c714 better comments 2012-05-31 01:50:20 -04:00
Kenneth Reitz 4dea56d4a0 better collectstatic pre-check 2012-05-31 01:49:13 -04:00
Kenneth Reitz c9916dd2e3 disable collectstatic file for user-env-compile
hesitance
2012-05-30 18:51:32 -04:00
Kenneth Reitz 662a311f95 v9 2012-05-30 17:32:16 -04:00
Kenneth Reitz bfd6ea22ca PYTHONHOME 2012-05-30 17:31:03 -04:00
Kenneth Reitz c5d7991468 v8 changelog 2012-05-30 16:01:38 -04:00
Kenneth Reitz c4404694e1 warn after injection 2012-05-30 15:59:55 -04:00
Kenneth Reitz e914736956 don't exit (yet) on collectstatic fail 2012-05-30 15:57:33 -04:00
Kenneth Reitz 23833dda9b comment out injection step 2012-05-30 15:53:49 -04:00
Kenneth Reitz 15573b9d3f simpler collectstatic 2012-05-30 15:47:39 -04:00
Kenneth Reitz 86661c1cda July 1 2012-05-30 15:23:14 -04:00
Kenneth Reitz 9cbace7f76 $DISABLE_COLLECTSTATIC 2012-05-30 15:15:10 -04:00
Kenneth Reitz 74cb870488 leave injection off for now 2012-05-30 15:14:36 -04:00
Kenneth Reitz ae9b83f07c fix error message for collectstatic 2012-05-30 13:55:22 -04:00
Kenneth Reitz d70c681c32 setting injection notice for users
#45
2012-05-30 13:52:08 -04:00
Kenneth Reitz c312d917a1 completely set DATABASES 2012-05-30 12:50:08 -04:00
Kenneth Reitz 5d2ecd2f1f echo "----->" 2012-05-30 04:21:22 -04:00
Kenneth Reitz a1e1dbd865 Merge remote-tracking branch 'origin/master' 2012-05-30 04:14:29 -04:00
Kenneth Reitz 12f28894ce collecting static files 2012-05-30 04:14:10 -04:00
Kenneth Reitz 538ef6e378 Update Readme.md 2012-05-30 05:07:37 -03:00
Kenneth Reitz 1588ea44b2 Update Readme.md 2012-05-30 05:05:55 -03:00
Kenneth Reitz 3cc9098e25 Update Readme.md 2012-05-30 05:05:41 -03:00
Kenneth Reitz 436e945a91 indents 2012-05-30 03:43:03 -04:00
Kenneth Reitz f9b83a4e95 chmod 2012-05-30 03:21:46 -04:00
Kenneth Reitz b1f8bf9f5e whitespace 2012-05-30 03:15:09 -04:00
Kenneth Reitz 7af5175942 hooks 2012-05-30 03:13:32 -04:00
Kenneth Reitz c24a9096de cleanup 2012-05-30 02:56:46 -04:00
Kenneth Reitz 36d27c46ed \n 2012-05-30 02:54:57 -04:00
Kenneth Reitz 713fa36bca debug 2012-05-30 02:53:33 -04:00
Kenneth Reitz 20249f9672 MANAGE_FILE 2012-05-30 02:50:50 -04:00
Kenneth Reitz 8b55e73f77 - 2012-05-30 02:43:08 -04:00
Kenneth Reitz 2058b3c5bf --verbosity=0 2012-05-30 02:42:46 -04:00
Kenneth Reitz 4eb17eb9a9 env 2012-05-30 02:17:48 -04:00
Kenneth Reitz 7138b7afb2 silence output of mkdir 2012-05-30 01:41:20 -04:00
Kenneth Reitz fe9b9401d3 syntax error 2012-05-30 01:39:04 -04:00
Kenneth Reitz 8c870cabfb proper path 2012-05-30 01:36:26 -04:00
Kenneth Reitz b8182c077a fix paths 2012-05-30 01:34:33 -04:00
Kenneth Reitz fbbdadd347 /s/Pip/pip 2012-05-30 01:34:28 -04:00
Kenneth Reitz b54faf36f5 move .heroku creation down 2012-05-30 01:28:44 -04:00
Kenneth Reitz a0dc2a6f33 additional notes 2012-05-30 01:20:58 -04:00
Kenneth Reitz f775fca31c v7 notes 2012-05-30 01:18:09 -04:00
Kenneth Reitz efebff4ce8 inverse test 2012-05-29 21:11:44 -04:00
Kenneth Reitz 94b2ab43a5 disable injection for new applications 2012-05-29 21:08:50 -04:00
Kenneth Reitz a21dbc2da1 run collectstatic 2012-05-29 21:08:34 -04:00
Kenneth Reitz cf5a9d26d1 .heroku/injection_disabled 2012-05-29 21:07:50 -04:00
Kenneth Reitz ef4772b87a export CACHE_DIR 2012-05-25 13:29:27 -04:00
Kenneth Reitz ffda318476 don't reject django apps packaged poorly 2012-05-25 13:29:16 -04:00
Kenneth Reitz 6aff0d0197 Merge branch 'master' into static 2012-05-23 13:25:41 -04:00
Kenneth Reitz b9ebd33703 prose 2012-05-23 13:25:40 -04:00
Kenneth Reitz 61e17df22d no travis email notification 2012-05-23 13:25:08 -04:00
Kenneth Reitz b88d0ad800 Don't fail fast. 2012-05-23 13:06:50 -04:00
Kenneth Reitz 7e24f94164 move DISABLE_INJECTION to lower level 2012-05-23 13:06:42 -04:00
Kenneth Reitz 3a239aa71a django dispatch 2012-05-15 15:01:09 -07:00
Kenneth Reitz 0e1ae7a798 collectstatic command 2012-05-15 15:00:56 -07:00
Kenneth Reitz 133c308796 shuffle a few things around 2012-05-15 14:41:02 -07:00
Kenneth Reitz 7ea8c861a2 Unset runtime-specific variables.
Fixes #37
2012-05-02 12:49:11 -04:00
Kenneth Reitz 20e0af2bf4 Don't pin version. 2012-05-02 12:48:43 -04:00
Kenneth Reitz 5d0ed4e7cd be specific 2012-04-30 14:35:44 -04:00
Kenneth Reitz 144629d7dc only configure one at a time 2012-04-30 14:27:19 -04:00
Kenneth Reitz cf36e8c7cb dj-database-url 2012-04-30 14:00:51 -04:00
Kenneth Reitz 233df5d59d fix tests 2012-04-30 13:53:05 -04:00
Kenneth Reitz 375796063b 2 directory levels, not 3 2012-04-30 13:48:02 -04:00
Kenneth Reitz d8a70de8a8 Merge remote-tracking branch 'origin/master' 2012-04-26 14:04:23 -04:00
Kenneth Reitz f1ee7fc04f comment updates 2012-04-26 14:04:17 -04:00
Kenneth Reitz e8585fb4a7 detect/changelog 2012-04-26 14:03:30 -04:00
Kenneth Reitz e10cc01f7e Update Readme.md 2012-04-26 15:01:50 -03:00
Kenneth Reitz 79d6db74b1 travis 2012-04-26 13:58:40 -04:00
Kenneth Reitz 69d607a76e Merge branch 'master' of https://github.com/andres-torres-marroquin/heroku-buildpack-python 2012-04-06 16:25:44 -04:00
Kenneth Reitz 2c03d89213 Merge branch 'master' of github.com:heroku/heroku-buildpack-python 2012-04-03 18:46:25 -04:00
Kenneth Reitz 11bf9833da heroku.py 2012-04-03 18:45:59 -04:00
Andrés Torres d2d37255d5 Multiple requirements support added 2012-04-03 14:49:56 -05:00
Andrés Torres bea5b4919e Added support for django 1.4 2012-04-03 11:14:39 -05:00
Kenneth Reitz b67a040474 changelog 2012-03-24 00:34:07 -04:00
Kenneth Reitz d40199ec00 update changelog 2012-03-24 00:32:58 -04:00
Kenneth Reitz 6f7390921c more final 2012-03-24 00:28:15 -04:00
Kenneth Reitz e5fa0473de that explains a lot 2012-03-24 00:26:35 -04:00
Kenneth Reitz 889b777eeb debugs 2012-03-24 00:24:30 -04:00
Kenneth Reitz 8d4626ef81 echo "copying $dir…" 2012-03-24 00:16:21 -04:00
Kenneth Reitz 7c7d2bc959 copy back CACHED_DIRS 2012-03-24 00:07:06 -04:00
Kenneth Reitz d76a7c5ea2 /s/f/d 2012-03-24 00:01:17 -04:00
Kenneth Reitz 3641a97b5f remove debug statement 2012-03-23 23:54:19 -04:00
Kenneth Reitz 5e818e85f3 echo debug 2012-03-23 23:49:18 -04:00
Kenneth Reitz c9d10077af source proper venv 2012-03-23 23:46:25 -04:00
Kenneth Reitz 6394214b55 fi 2012-03-23 23:45:06 -04:00
Kenneth Reitz bfa26b8b05 /s/do/then 2012-03-23 23:43:38 -04:00
Kenneth Reitz 15172c86b9 move django pre-exit to steps/django 2012-03-23 23:42:38 -04:00
Kenneth Reitz daa85630c7 bash foo weak 2012-03-23 23:37:33 -04:00
Kenneth Reitz 9914e50d8a PYTHONPATH 2012-03-23 23:36:20 -04:00
Kenneth Reitz ef59b5ad6b $CACHED_DIRS 2012-03-23 23:31:50 -04:00
Kenneth Reitz 98741a0606 $VIRTUALENV_LOC 2012-03-23 23:30:43 -04:00
Kenneth Reitz 6aadf1683a new style virtualenvs 2012-03-23 23:29:28 -04:00
Kenneth Reitz e10cb6bfb1 exit early for settings.py at root 2012-03-23 23:09:26 -04:00
Kenneth Reitz 2fd6d7e1f8 changelog 2012-03-23 23:08:52 -04:00
Kenneth Reitz 30c12d9c63 remote failing test (for not) 2012-03-23 22:57:33 -04:00
Kenneth Reitz 3313891205 move setup.py stuff up 2012-03-23 22:46:29 -04:00
Kenneth Reitz 1e914b8558 -f 2012-03-23 22:43:41 -04:00
Kenneth Reitz b9fc30f592 more careful pylibmc check 2012-03-23 22:42:40 -04:00
Kenneth Reitz e8e67fe093 better release defaults 2012-03-23 22:42:32 -04:00
Kenneth Reitz 66e49c764c manage_file scrub 2012-03-23 22:27:26 -04:00
Kenneth Reitz 322d19689f tr -d './' 2012-03-23 22:18:36 -04:00
Kenneth Reitz 07a6853585 -maxdepth 2 2012-03-23 21:06:39 -04:00
Kenneth Reitz f34599c5ad relative detect path 2012-03-23 20:59:15 -04:00
Kenneth Reitz 97c5f0944d project dir for release 2012-03-23 20:57:00 -04:00
Kenneth Reitz 1e598e2511 proper find usage 2012-03-23 20:54:02 -04:00
Kenneth Reitz 966a5e35db use find instead 2012-03-23 20:48:42 -04:00
Kenneth Reitz d760946828 skip manage for now 2012-03-23 20:40:58 -04:00
Kenneth Reitz 3dda7c3731 yaml 2012-03-23 20:30:37 -04:00
Kenneth Reitz 3441833521 manage.py detection 2012-03-23 20:27:56 -04:00
Kenneth Reitz 603950ca65 assert not python 2012-03-23 19:55:37 -04:00
Kenneth Reitz a946ce09c0 literate detect 2012-03-23 19:52:59 -04:00
Kenneth Reitz c196347e58 all kinds of awesome tests 2012-03-23 19:52:03 -04:00
Kenneth Reitz 979491a631 better language 2012-03-23 19:22:14 -04:00
Kenneth Reitz fef3581417 punctuation 2012-03-23 19:19:53 -04:00
Kenneth Reitz f6d948b0e0 log -e . 2012-03-23 19:19:24 -04:00
Kenneth Reitz 2f42fdb282 basic tests 2012-03-23 19:17:07 -04:00
Kenneth Reitz b16261c158 basic test runner 2012-03-23 19:17:00 -04:00
Kenneth Reitz 3e1d657888 be more specific with the assumptions 2012-03-23 16:45:02 -04:00
Kenneth Reitz 06946d3632 step/warn functions 2012-03-23 16:38:06 -04:00
Kenneth Reitz cd8530a5c2 reference pylibmc docs 2012-03-23 16:32:31 -04:00
Kenneth Reitz 91015bd2c1 pylibmc 2012-03-23 16:31:32 -04:00
Kenneth Reitz 907b66624b show django docs 2012-03-23 16:28:26 -04:00
Kenneth Reitz 193352c616 finalize 2012-03-23 16:22:26 -04:00
Kenneth Reitz 2e551e9c4e additional headings for docs 2012-03-23 16:21:17 -04:00
Kenneth Reitz 58c625affd message consistency 2012-03-23 16:19:14 -04:00
Kenneth Reitz b13702972d deploy the site 2012-03-23 16:13:51 -04:00
Kenneth Reitz 8c16776d72 documentation improvements 2012-03-23 16:13:43 -04:00
Kenneth Reitz 7e4405989a ignore site folder 2012-03-23 16:13:35 -04:00
Kenneth Reitz 15b819703a notes 2012-03-23 16:02:07 -04:00
Kenneth Reitz bf2372101f /s/src/vendor 2012-03-23 15:59:47 -04:00
Kenneth Reitz d87f88ee4d move VENDORED_MEMCACHED to steps/pylibmc 2012-03-23 15:59:15 -04:00
Kenneth Reitz 24266be8db literate programming
shocco
2012-03-23 15:58:57 -04:00
Kenneth Reitz 3187d73b64 shocco 2012-03-23 15:58:45 -04:00
Kenneth Reitz 48f52668be TODO: Bootstrap a Python 2012-03-23 14:19:55 -04:00
Kenneth Reitz f7ef15d7d0 restore cache 2012-03-23 14:15:16 -04:00
Kenneth Reitz d084ac8a58 remove python-build 2012-03-23 14:14:31 -04:00
Kenneth Reitz 077d93e283 your bash foo is weak 2012-03-06 06:44:58 -05:00
Kenneth Reitz 71409e7712 out 2012-03-06 06:37:57 -05:00
Kenneth Reitz 61a7ad7116 delete 2012-03-06 06:32:58 -05:00
Kenneth Reitz d1ab3939e9 pythonhome 2012-03-06 06:19:22 -05:00
Kenneth Reitz 0f2f10557c .. 2012-03-06 06:04:34 -05:00
Kenneth Reitz ad748743cd not needed 2012-03-06 05:58:18 -05:00
Kenneth Reitz 844a8daad6 source it 2012-03-06 05:49:37 -05:00
Kenneth Reitz 93cc65adfc hmmm 2012-03-06 05:47:31 -05:00
Kenneth Reitz 3a1aa3f6af BUILD DIR 2012-03-06 05:46:10 -05:00
Kenneth Reitz 5b5f124082 PWD? 2012-03-06 05:30:13 -05:00
Kenneth Reitz cd17d3948c relative? 2012-03-06 05:29:07 -05:00
Kenneth Reitz 7c49ceaf2c no cache 2012-03-06 05:25:02 -05:00
Kenneth Reitz a156996d61 proper paths 2012-03-06 05:18:52 -05:00
Kenneth Reitz 9438005891 prefix= 2012-03-06 04:56:22 -05:00
Kenneth Reitz aefde88d24 && 2012-03-06 04:50:44 -05:00
Kenneth Reitz 347bca0de4 cleaner pylibmc check 2012-03-06 04:46:26 -05:00
Kenneth Reitz a0f2073eb1 check for django in requirements.txt 2012-03-06 04:46:16 -05:00
Kenneth Reitz 1b0fd2e4b6 Merge branch 'develop' into decouple 2012-03-06 04:29:37 -05:00
Kenneth Reitz 4be3d87e04 If no requirements, assume 'setup.py install' 2012-03-06 04:24:54 -05:00
Kenneth Reitz 5ffe9203d3 check for setup.py too 2012-03-06 04:20:00 -05:00
Kenneth Reitz 24cd70dc95 remove it 2012-02-26 16:54:34 -05:00
Kenneth Reitz 6e9b241fb2 vendor dir 2012-02-26 16:54:11 -05:00
Kenneth Reitz 4cc660a3a7 bugs 2012-02-26 16:40:17 -05:00
Kenneth Reitz 7c48f6d17b $BIN_DIR 2012-02-26 16:23:08 -05:00
Kenneth Reitz c4d7ae49ba hacky compile 2012-02-26 16:19:07 -05:00
Kenneth Reitz 26dd3828df Start Decoupled Pythons 2012-02-26 15:46:57 -05:00
Kenneth Reitz ead7b1a04a PYTHONHASHSEED 2012-02-26 13:02:19 -05:00
Kenneth Reitz 1ddd5c2515 Merge branch 'develop' 2012-02-24 17:33:02 -05:00
Kenneth Reitz e1fcbc067a Revert "remove injection disabling (for now)"
This reverts commit 825d41695d.
2012-02-24 17:31:45 -05:00
Kenneth Reitz 9bf33597c3 plural 2012-02-17 22:59:47 -05:00
Kenneth Reitz 17a8e05a90 Merge branch 'develop' of github.com:heroku/heroku-buildpack-python into develop 2012-02-13 15:09:46 -05:00
Kenneth Reitz 7a01a6850c lawyer up 2012-02-13 15:08:44 -05:00
Kenneth Reitz 6fdcc392dd Merge pull request #29 from lstoll/develop
Set the LANG var to support non US-ASCII chars
2012-02-08 23:45:23 -08:00
Lincoln Stoll 3e5bea876d Set the LANG var to support non US-ASCII chars
This it the same as the ruby buildpack.
2012-02-09 20:41:45 +13:00
Kenneth Reitz 976089104b Merge branch 'master' into develop 2012-02-01 14:24:39 -05:00
Kenneth Reitz 7b1b24860a src directory in .heroku 2012-02-01 13:31:26 -05:00
Kenneth Reitz 2e192e79a6 no more trace 2012-02-01 13:00:36 -05:00
Kenneth Reitz 9662b9a2f0 sane virtualenv again 2012-02-01 12:54:25 -05:00
Kenneth Reitz 8f5385f9ca cleanup 2012-02-01 12:49:08 -05:00
Kenneth Reitz 0b46e1d807 unset GIT_DIR 2012-02-01 12:47:32 -05:00
Kenneth Reitz 35a1b8dd62 blah 2012-01-31 03:40:56 -05:00
Kenneth Reitz 760b17431a worth a shot 2012-01-31 03:36:13 -05:00
Kenneth Reitz 4d3a352889 ugh 2012-01-31 03:30:43 -05:00
Kenneth Reitz 3fa65989ea grr 2012-01-31 03:29:13 -05:00
Kenneth Reitz 1553d4dbc3 try again 2012-01-31 03:14:09 -05:00
Kenneth Reitz ac766e2615 try 2012-01-31 03:11:36 -05:00
Kenneth Reitz fee800cb21 blah 2012-01-31 03:08:20 -05:00
Kenneth Reitz 7fd0e8de3c update 2012-01-31 02:55:35 -05:00
Kenneth Reitz 1dd1afc972 GIT_TRACE 2012-01-31 02:29:40 -05:00
Kenneth Reitz c1e8b1d80c one last try 2012-01-31 00:47:55 -05:00
Kenneth Reitz fb19d5fec2 :trollface: 2012-01-31 00:44:32 -05:00
Kenneth Reitz b2f01679a5 NO_MSGFMT=yes 2012-01-31 00:40:25 -05:00
Kenneth Reitz c5703462c2 --without-tcltk 2012-01-31 00:35:54 -05:00
Kenneth Reitz deeea09e5d most ridiculous test ever 2012-01-31 00:32:02 -05:00
Kenneth Reitz b39ffa8fa3 when install fails, show the directory 2012-01-31 00:09:10 -05:00
Kenneth Reitz 0b1926f089 verbose git commands 2012-01-31 00:00:56 -05:00
Kenneth Reitz f05fc7b559 trying again 2012-01-30 23:56:15 -05:00
Kenneth Reitz 37590bf0e0 getting serious pip 2012-01-30 23:49:26 -05:00
Kenneth Reitz fd25ce1a0d further patched pip 2012-01-30 23:41:35 -05:00
Kenneth Reitz f581e1c685 debug version of pip 2012-01-30 23:37:34 -05:00
Kenneth Reitz 977c4816ed strip .git 2012-01-30 23:37:27 -05:00
Kenneth Reitz 7a022245d4 pip bootstrap 2012-01-30 23:25:00 -05:00
Kenneth Reitz 503377a00b verbose pip 2012-01-30 23:12:42 -05:00
Kenneth Reitz a624be1e20 env test 2012-01-30 23:08:16 -05:00
Kenneth Reitz 41ad52e495 no need for ./bin/ 2012-01-30 23:04:30 -05:00
136 changed files with 3875 additions and 6316 deletions
+1
View File
@@ -1 +1,2 @@
*.pyc *.pyc
site
+86
View File
@@ -1,3 +1,89 @@
## v14
Features:
* Full removal of Django settings injection for new apps.
* Support for profile.d
* Fresh app detection.
* Update to Virtualenv v1.7.2
* Updated to Pip v1.1 (patched)
Bugfixes:
* Default pip path exists action.
## v13
Bugfixes:
* Fix pip quoting error.
* Only talk about collectstatic in buildpack output when it's configured.
## v12
Bugfixes:
* Catch database setting corner case.
## v11
Bugfixes:
* Cleanup collectstatic output.
## v10
Bugfixes:
* Check for collectstatic validity with --dry-run instead of --help for Django 1.4.
## v9
Bugfixes:
* Unset PYTHONHOME in buildpack for [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
## v8
Features:
* Disable Django collectstatic with `$DISABLE_COLLECTSTATIC` + [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
Bugfixes:
* Don't disbable injection for new Django apps.
* Inform user of July 1, 2012 deprecation of Django injection.
## v7
Features:
* Full removal of Django setting injection for new apps.
* Automatic execution of collectstatic.
* Suppress collectstatic errors via env SILENCE_COLLECTSTATIC.
* Increase settings.py search depth to 3.
* Search recursively from included requirements.txt files.
## v6 (03/23/2012)
Features:
* Dist packages (setup.py) support.
* Move new virtualenvs to `/app/.heroku/venv`.
* Heavily improved Django app detection, accounting for `Django` in `requirements.txt`.
* Literate [documentation](http://python-buildpack.herokuapp.com).
* Default `$PYTHONHOME`, `$PYTHONPATH`, and `$LANG` configurations.
* Disable Django setting injection with `$DISABLE_INJECTION` + [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
* General code refactor and improved messaging.
* Unit tests.
Bugfixes:
* Django 1.4 startproject template layout support.
* Django `manage.py` location can now be independent from `settings.py`.
## v5 (02/01/2012) ## v5 (02/01/2012)
Bugfixes: Bugfixes:
+9
View File
@@ -0,0 +1,9 @@
MIT License:
Copyright (C) 2013 Heroku, Inc.
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.
+5 -6
View File
@@ -1,6 +1,5 @@
pip: # These targets are not files
git clone git@github.com:kennethreitz/pip.git --branch heroku --depth 1 .PHONY: tests
rm -fr src/virtualenv-1.7/virtualenv_support/pip-1.0.2.tar.gz
rm -fr pip/.git tests:
tar -pczf src/virtualenv-1.7/virtualenv_support/pip-1.0.2.tar.gz pip ./bin/test
rm -fr pip
+29 -21
View File
@@ -1,8 +1,8 @@
Heroku buildpack: Python Heroku buildpack: Python
======================== ========================
This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpack) for Python apps. This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](http://www.pip-installer.org/).
It uses [virtualenv](http://www.virtualenv.org/) and [pip](http://www.pip-installer.org/).
Usage Usage
----- -----
@@ -12,32 +12,40 @@ Example usage:
$ ls $ ls
Procfile requirements.txt web.py Procfile requirements.txt web.py
$ heroku create --stack cedar --buildpack git@github.com:heroku/heroku-buildpack-python.git $ heroku create --buildpack git://github.com/heroku/heroku-buildpack-python.git
$ git push heroku master $ git push heroku master
... ...
-----> Heroku receiving push
-----> Fetching custom build pack... done
-----> Python app detected -----> Python app detected
-----> Preparing virtualenv version 1.6.4 -----> Installing runtime (python-2.7.8)
New python executable in ./bin/python -----> Installing dependencies using pip
Installing setuptools............done. Downloading/unpacking requests (from -r requirements.txt (line 1))
Installing pip...............done. Installing collected packages: requests
-----> Installing dependencies using pip version 1.0.2 Successfully installed requests
Downloading/unpacking Flask==0.7.2 (from -r requirements.txt (line 1))
Downloading/unpacking Werkzeug>=0.6.1 (from Flask==0.7.2->-r requirements.txt (line 1))
Downloading/unpacking Jinja2>=2.4 (from Flask==0.7.2->-r requirements.txt (line 1))
Installing collected packages: Flask, Werkzeug, Jinja2
Successfully installed Flask Werkzeug Jinja2
Cleaning up... Cleaning up...
-----> Discovering process types
Procfile declares types -> (none)
The buildpack will detect your app as Python if it has the file `requirements.txt` in the root. It will detect your app as Python/Django if there is an additional `settings.py` in a project subdirectory. You can also add it to upcoming builds of an existing application:
It will use virtualenv and pip to install your dependencies, vendoring a copy of the Python runtime into your slug. The `bin/`, `include/` and `lib/` directories will be cached between builds to allow for faster pip install time. $ heroku config:add BUILDPACK_URL=git://github.com/heroku/heroku-buildpack-python.git
Hacking The buildpack will detect your app as Python if it has the file `requirements.txt` in the root.
-------
To use this buildpack, fork it on Github. Push up changes to your fork, then create a test app with `--buildpack <your-github-url>` and push to it. It will use Pip to install your dependencies, vendoring a copy of the Python runtime into your slug.
To change the vendored virtualenv, unpack the desired version to the `src/` folder, and update the virtualenv() function in `bin/compile` to prepend the virtualenv module directory to the path. The virtualenv release vendors its own versions of pip and setuptools. Specify a Runtime
-----------------
You can also provide arbitrary releases Python with a `runtime.txt` file.
$ cat runtime.txt
python-3.4.1
Runtime options include:
- python-2.7.8
- python-3.4.1
- pypy-1.9 (experimental)
Other [unsupported runtimes](https://github.com/heroku/heroku-buildpack-python/tree/master/builds/runtimes) are available as well.
+167 -72
View File
@@ -1,112 +1,207 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# bin/compile <build-dir> <cache-dir>
# Usage:
#
# $ bin/compile <build-dir> <cache-dir> <env-path>
# Fail fast and fail hard.
set -eo pipefail set -eo pipefail
# Prepend proper path for virtualenv hackery. Will be deprecated soon. # Prepend proper path for virtualenv hackery. This will be deprecated soon.
export PATH=:/usr/local/bin:$PATH export PATH=:/usr/local/bin:$PATH
# Paths.
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
ROOT_DIR=$(dirname $BIN_DIR) ROOT_DIR=$(dirname $BIN_DIR)
BUILD_DIR=$1 BUILD_DIR=$1
CACHE_DIR=$2 CACHE_DIR=$2
ENV_DIR=$3
NAME=$($BIN_DIR/detect $BUILD_DIR)
PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-$CACHE_DIR/pip_downloads}
VIRTUALENV_DIRS="bin include lib"
VENDORED_MEMCACHED="http://cl.ly/0a191R3K160t1w1P0N25/vendor-libmemcached.tar.gz"
unset GIT_DIR CACHED_DIRS=".heroku"
export PIP_DOWNLOAD_CACHE
indent() { # Static configurations for virtualenv caches.
RE="s/^/ /" VIRTUALENV_LOC=".heroku/venv"
[ $(uname) == "Darwin" ] && sed -l "$RE" || sed -u "$RE" LEGACY_TRIGGER="lib/python2.7"
} PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
function virtualenv (){ DEFAULT_PYTHON_VERSION="python-2.7.8"
python "$ROOT_DIR/src/virtualenv-1.7/virtualenv.py" "$@" DEFAULT_PYTHON_STACK="cedar"
} PYTHON_EXE="/app/.heroku/python/bin/python"
PIP_VERSION="1.5.6"
SETUPTOOLS_VERSION="5.4.1"
# Setup bpwatch
export PATH=$PATH:$ROOT_DIR/vendor/bpwatch
LOGPLEX_KEY="t.b90d9d29-5388-4908-9737-b4576af1d4ce"
export BPWATCH_STORE_PATH=$CACHE_DIR/bpwatch.json
BUILDPACK_VERSION=v28
# Setup pip-pop (pip-diff)
export PATH=$PATH:$ROOT_DIR/vendor/pip-pop
# Support Anvil Build_IDs
[ ! "$SLUG_ID" ] && SLUG_ID="defaultslug"
[ ! "$REQUEST_ID" ] && REQUEST_ID=$SLUG_ID
[ ! "$STACK" ] && STACK=$DEFAULT_PYTHON_STACK
# Sanitizing environment variables.
unset GIT_DIR PYTHONHOME PYTHONPATH LD_LIBRARY_PATH LIBRARY_PATH
bpwatch init $LOGPLEX_KEY
bpwatch build python $BUILDPACK_VERSION $REQUEST_ID
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
bpwatch start compile
# We'll need to send these statics to other scripts we `source`.
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH
# Syntax sugar.
source $BIN_DIR/utils
# Directory Hacks for path consistiency.
APP_DIR='/app'
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
# Copy Anvil app dir to temporary storage...
bpwatch start anvil_appdir_stage
if [ "$SLUG_ID" ]; then
mkdir -p $TMP_APP_DIR
deep-mv $APP_DIR $TMP_APP_DIR
else
deep-rm $APP_DIR
fi
bpwatch stop anvil_appdir_stage
# Copy Application code in.
bpwatch start appdir_stage
deep-mv $BUILD_DIR $APP_DIR
bpwatch stop appdir_stage
# Set new context.
ORIG_BUILD_DIR=$BUILD_DIR
BUILD_DIR=$APP_DIR
# Prepend proper path buildpack use.
export PATH=$BUILD_DIR/.heroku/python/bin:$BUILD_DIR/.heroku/vendor/bin:$PATH
export PYTHONUNBUFFERED=1
export LANG=en_US.UTF-8
export C_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include
export CPLUS_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include
export LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib
export LD_LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib
export PKG_CONFIG_PATH=/app/.heroku/vendor/lib/pkg-config:$BUILD_DIR/.heroku/vendor/lib/pkg-config:/app/.heroku/python/lib/pkg-config
# Switch to the repo's context.
cd $BUILD_DIR cd $BUILD_DIR
# Reject a non-packaged Django app. # Experimental pre_compile hook.
if [ "$NAME" = "Python" ]; then bpwatch start pre_compile
[ -f manage.py ] && [ -f settings.py ] && { echo " ! Django app must be in a package subdirectory"; exit 1; } source $BIN_DIR/steps/hooks/pre_compile
bpwatch stop pre_compile
# If no requirements given, assume `setup.py develop`.
if [ ! -f requirements.txt ]; then
echo "-e ." > requirements.txt
fi fi
# Warn a checked-in virtualenv. # Sticky runtimes.
if [ -d "lib" ] || [ -d "bin" ]; then if [ -f $CACHE_DIR/.heroku/python-version ]; then
echo " ! You have a virtualenv checked in. You should ignore the appropriate paths in your repo. See http://devcenter.heroku.com/articles/gitignore for more info."; DEFAULT_PYTHON_VERSION=$(cat $CACHE_DIR/.heroku/python-version)
fi fi
# Reject a conflicting checked-in virtualenv. # Stack fallback for non-declared caches.
if [ -f "lib/python2.7" ]; then if [ -f $CACHE_DIR/.heroku/python-stack ]; then
echo " ! Checked-in virtualenv conflict." CACHED_PYTHON_STACK=$(cat $CACHE_DIR/.heroku/python-stack)
exit 1; else
CACHED_PYTHON_STACK=$DEFAULT_PYTHON_STACK
fi fi
# Copy artifacts out of cache if exists. # If no runtime given, assume default version.
if [ ! -f runtime.txt ]; then
echo $DEFAULT_PYTHON_VERSION > runtime.txt
fi
# ### The Cache
mkdir -p $CACHE_DIR mkdir -p $CACHE_DIR
for dir in $VIRTUALENV_DIRS; do
cp -R $CACHE_DIR/$dir . &> /dev/null || true
done
# Create virtualenv. Rebuild if corrupt. # Purge "old-style" virtualenvs.
set +e bpwatch start clear_old_venvs
echo "-----> Preparing virtualenv version $(virtualenv --version)" [ -d $CACHE_DIR/$LEGACY_TRIGGER ] && rm -fr $CACHE_DIR/.heroku/bin $CACHE_DIR/.heroku/lib $CACHE_DIR/.heroku/include
[ -d $CACHE_DIR/$VIRTUALENV_LOC ] && rm -fr $CACHE_DIR/.heroku/venv $CACHE_DIR/.heroku/src
bpwatch stop clear_old_venvs
# Try to create the virtualenv. # Restore old artifacts from the cache.
OUT=$(virtualenv --distribute --never-download --prompt=venv . 2>&1) bpwatch start restore_cache
for dir in $CACHED_DIRS; do
# If there's an error, purge and recreate. cp -R $CACHE_DIR/$dir . &> /dev/null || true
[ $? -ne 0 ] && {
echo " ! Virtualenv corrupt, rebuilding."
for dir in $VIRTUALENV_DIRS; do
rm -fr $dir &> /dev/null || true
done done
OUT=$(virtualenv --distribute --never-download --prompt=venv . ) bpwatch stop restore_cache
}
echo "$OUT" | indent
set +e
# Create set-aside `.heroku` folder.
mkdir .heroku &> /dev/null
set -e set -e
# Create set-aside .heroku folder. mkdir -p $(dirname $PROFILE_PATH)
mkdir -p .heroku
# Install Python.
source $BIN_DIR/steps/python
# Uninstall removed dependencies with Pip.
source $BIN_DIR/steps/pip-uninstall
# Mercurial support.
source $BIN_DIR/steps/mercurial
# Pylibmc support. # Pylibmc support.
source $BIN_DIR/steps/pylibmc source $BIN_DIR/steps/pylibmc
# Activate the virtualenv. # Install dependencies with Pip.
echo "-----> Activating virtualenv" source $BIN_DIR/steps/pip-install
source bin/activate
# Install mercurial, if needed. # Django collectstatic support.
if (grep -Fiq "hg+" requirements.txt) then source $BIN_DIR/steps/collectstatic
pip install --use-mirrors mercurial | indent
fi
# Install dependencies.
echo "-----> Installing dependencies using pip version $(pip --version | awk '{print $2}')"
pip install --use-mirrors -r requirements.txt --src ./.heroku/src | indent
# Django support. # ### Finalize
if [ "$NAME" = "Python/Django" ]; then #
source $BIN_DIR/steps/django
fi
# Make virtualenv relocatable. # Set context environment variables.
set +e set-env PATH '$HOME/.heroku/python/bin:$PATH'
OUT=$(virtualenv --relocatable .) set-env PYTHONUNBUFFERED true
[ $? -ne 0 ] && { set-env PYTHONHOME /app/.heroku/python
echo " ! Error making virtualenv relocatable" set-env LIBRARY_PATH /app/.heroku/vendor/lib:/app/.heroku/python/lib
echo "$OUT" | indent set-env LD_LIBRARY_PATH '/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LD_LIBRARY_PATH'
exit 1 set-default-env LANG en_US.UTF-8
} set-default-env PYTHONHASHSEED random
set -e set-default-env PYTHONPATH /app/
# Experimental post_compile hook.
bpwatch start post_compile
source $BIN_DIR/steps/hooks/post_compile
bpwatch stop post_compile
# Store new artifacts in cache. # Store new artifacts in cache.
for dir in $VIRTUALENV_DIRS; do bpwatch start dump_cache
rm -rf $CACHE_DIR/$dir for dir in $CACHED_DIRS; do
cp -R $dir $CACHE_DIR/ rm -rf $CACHE_DIR/$dir
done cp -R $dir $CACHE_DIR/
done
bpwatch stop dump_cache
# ### Fin.
bpwatch start appdir_commit
deep-mv $BUILD_DIR $ORIG_BUILD_DIR
bpwatch stop appdir_commit
bpwatch start anvil_appdir_commit
if [ "$SLUG_ID" ]; then
deep-mv $TMP_APP_DIR $APP_DIR
fi
bpwatch stop anvil_appdir_commit
bpwatch stop compile
+18 -4
View File
@@ -1,8 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# bin/detect <build-dir>
# This script serves as the
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
# detector.
#
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
# adapter between a Python application and Heroku's runtime.
# ## Usage
# Compiling an app into a slug is simple:
#
# $ bin/detect <build-dir> <cache-dir>
BUILD_DIR=$1 BUILD_DIR=$1
[ -f $BUILD_DIR/requirements.txt ] || exit 1 # fail fast if no requirements.txt
# 'Python/Django' if there is a [mysite]/settings.py file present; otherwise 'Python' # Exit early if app is clearly not Python.
ls $BUILD_DIR/**/settings.py &> /dev/null && echo Python/Django || echo Python if [ ! -f $BUILD_DIR/requirements.txt ] && [ ! -f $BUILD_DIR/setup.py ]; then
exit 1
fi
echo Python
+7 -14
View File
@@ -3,28 +3,21 @@
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
BUILD_DIR=$1 BUILD_DIR=$1
NAME=$($BIN_DIR/detect $BUILD_DIR) || exit 1
MANAGE_FILE=$(cd $BUILD_DIR && find . -maxdepth 3 -type f -name 'manage.py' | head -1)
MANAGE_FILE=${MANAGE_FILE:2}
cat <<EOF cat <<EOF
--- ---
config_vars: config_vars:
PATH: bin:/usr/local/bin:/usr/bin:/bin
PYTHONUNBUFFERED: true
LIBRARY_PATH: .heroku/vendor/lib
LD_LIBRARY_PATH: .heroku/vendor/lib
EOF EOF
[ "$NAME" = "Python/Django" ] || exit 0 if [[ $MANAGE_FILE ]]; then
SETTINGS_FILE=$(cd $BUILD_DIR && ls **/settings.py | head -1)
PROJECT=$(dirname $SETTINGS_FILE)
cat <<EOF cat <<EOF
addons: addons:
shared-database:5mb heroku-postgresql:hobby-dev
default_process_types:
web: python $PROJECT/manage.py runserver 0.0.0.0:\$PORT --noreload
EOF EOF
fi
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env bash
source $BIN_DIR/utils
MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' | head -1)
MANAGE_FILE=${MANAGE_FILE:-fakepath}
[ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1
bpwatch start collectstatic
if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ]; then
set +e
echo "-----> Preparing static assets"
# Check if collectstatic is configured properly.
python $MANAGE_FILE collectstatic --dry-run --noinput &> /dev/null && RUN_COLLECTSTATIC=true
# Compile assets if collectstatic appears to be kosher.
if [ "$RUN_COLLECTSTATIC" ]; then
echo " Running collectstatic..."
python $MANAGE_FILE collectstatic --noinput 2>&1 | sed '/^Copying/d;/^$/d;/^ /d' | indent
[ $? -ne 0 ] && {
echo " ! Error running 'manage.py collectstatic'. More info:"
echo " http://devcenter.heroku.com/articles/django-assets"
}
else
echo " Collectstatic configuration error. To debug, run:"
echo " $ heroku run python $MANAGE_FILE collectstatic --noinput"
fi
echo
fi
bpwatch stop collectstatic
-49
View File
@@ -1,49 +0,0 @@
#!/usr/bin/env bash
echo "-----> Injecting Django settings..."
SETTINGS_FILE=$(ls **/settings.py | head -1)
PROJECT=$(dirname $SETTINGS_FILE)
echo "Injecting code into $SETTINGS_FILE to read from DATABASE_URL" | indent
cat >>$SETTINGS_FILE <<EOF
import os
import sys
import urlparse
# Register database schemes in URLs.
urlparse.uses_netloc.append('postgres')
urlparse.uses_netloc.append('mysql')
try:
# Check to make sure DATABASES is set in settings.py file.
# If not default to {}
if 'DATABASES' not in locals():
DATABASES = {}
if 'DATABASE_URL' in os.environ:
url = urlparse.urlparse(os.environ['DATABASE_URL'])
# Ensure default database exists.
DATABASES['default'] = DATABASES.get('default', {})
# Update with environment configuration.
DATABASES['default'].update({
'NAME': url.path[1:],
'USER': url.username,
'PASSWORD': url.password,
'HOST': url.hostname,
'PORT': url.port,
})
if url.scheme == 'postgres':
DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'
if url.scheme == 'mysql':
DATABASES['default']['ENGINE'] = 'django.db.backends.mysql'
except Exception:
print 'Unexpected error:', sys.exc_info()
EOF
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
if [ -f bin/post_compile ]; then
echo "-----> Running post-compile hook"
chmod +x bin/post_compile
sub-env bin/post_compile
fi
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
if [ -f bin/pre_compile ]; then
echo "-----> Running pre-compile hook"
chmod +x bin/pre_compile
sub-env bin/pre_compile
fi
+6
View File
@@ -0,0 +1,6 @@
# Install Mercurial if it appears to be required.
if (grep -Fiq "hg+" requirements.txt) then
bpwatch start mercurial_install
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
bpwatch stop mercurial_install
fi
+16
View File
@@ -0,0 +1,16 @@
# Install dependencies with Pip.
puts-step "Installing dependencies with pip"
[ ! "$FRESH_PYTHON" ] && bpwatch start pip_install
[ "$FRESH_PYTHON" ] && bpwatch start pip_install_first
/app/.heroku/python/bin/pip install -r requirements.txt --exists-action=w --src=./.heroku/src --allow-all-external | cleanup | indent
# Smart Requirements handling
cp requirements.txt .heroku/python/requirements-declared.txt
/app/.heroku/python/bin/pip freeze > .heroku/python/requirements-installed.txt
[ ! "$FRESH_PYTHON" ] && bpwatch stop pip_install
[ "$FRESH_PYTHON" ] && bpwatch stop pip_install_first
echo
+14
View File
@@ -0,0 +1,14 @@
set +e
# Install dependencies with Pip.
bpwatch start pip_uninstall
if [[ -f .heroku/python/requirements-declared.txt ]]; then
pip-diff --stale .heroku/python/requirements-declared.txt requirements.txt > .heroku/python/requirements-stale.txt
if [[ -s .heroku/python/requirements-stale.txt ]]; then
puts-step "Uninstalling stale dependencies"
/app/.heroku/python/bin/pip uninstall -r .heroku/python/requirements-stale.txt -y --exists-action=w | cleanup | indent
fi
fi
bpwatch stop pip_uninstall
set -e
Regular → Executable
+33 -14
View File
@@ -1,20 +1,39 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# if pylibmc within requirements, use vendored libmemcached # This script serves as the Pylibmc build step of the
if (grep -Fxiq "pylibmc" requirements.txt) || (grep -Fiq "pylibmc=" requirements.txt) # [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
then # compiler.
echo "-----> Noticed pylibmc. Bootstrapping libmemcached." #
cd .heroku # A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
# adapter between a Python application and Heroku's runtime.
#
# This script is invoked by [`bin/compile`](/).
if [ -d "vendor/lib/sasl2" ]; then # The location of the pre-compiled libmemcached binary.
export LIBMEMCACHED=$(pwd)/vendor VENDORED_MEMCACHED="http://cl.ly/0a191R3K160t1w1P0N25/vendor-libmemcached.tar.gz"
else
curl -s -L -o tmp-libmemcached.tar.gz $VENDORED_MEMCACHED
tar -zxvf tmp-libmemcached.tar.gz > /dev/null
rm tmp-libmemcached.tar.gz
export LIBMEMCACHED=$(pwd)/vendor
fi
# Syntax sugar.
source $BIN_DIR/utils
bpwatch start pylibmc_install
# If pylibmc exists within requirements, use vendored libmemcached.
if (pip-grep -s requirements.txt pylibmc) then
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
cd .heroku
if [ -d "vendor/lib/sasl2" ]; then
export LIBMEMCACHED=$(pwd)/vendor export LIBMEMCACHED=$(pwd)/vendor
cd .. else
# Download and extract libmemcached into target vendor directory.
curl -s -L -o tmp-libmemcached.tar.gz $VENDORED_MEMCACHED
tar -zxvf tmp-libmemcached.tar.gz > /dev/null
rm tmp-libmemcached.tar.gz
export LIBMEMCACHED=$(pwd)/vendor
fi
export LIBMEMCACHED=$(pwd)/vendor
cd ..
fi fi
bpwatch stop pylibmc_install
+79
View File
@@ -0,0 +1,79 @@
set +e
PYTHON_VERSION=$(cat runtime.txt)
# Install Python.
if [ -f .heroku/python-version ]; then
if [ ! $(cat .heroku/python-version) = $PYTHON_VERSION ]; then
bpwatch start uninstall_python
puts-step "Found runtime $(cat .heroku/python-version), removing"
rm -fr .heroku/python
bpwatch stop uninstall_python
else
SKIP_INSTALL=1
fi
fi
if [ ! $STACK = $CACHED_PYTHON_STACK ]; then
bpwatch start uninstall_python
puts-step "Stack changed, re-installing runtime"
rm -fr .heroku/python
unset SKIP_INSTALL
bpwatch stop uninstall_python
fi
if [ ! "$SKIP_INSTALL" ]; then
bpwatch start install_python
puts-step "Installing runtime ($PYTHON_VERSION)"
# Prepare destination directory.
mkdir -p .heroku/python
curl http://lang-python.s3.amazonaws.com/$STACK/runtimes/$PYTHON_VERSION.tar.gz -s | tar zxv -C .heroku/python &> /dev/null
if [[ $? != 0 ]] ; then
puts-warn "Requested runtime ($PYTHON_VERSION) is not available for this stack ($STACK)."
puts-warn "Aborting. More info: https://devcenter.heroku.com/articles/python-support"
exit 1
fi
bpwatch stop install_python
# Record for future reference.
echo $PYTHON_VERSION > .heroku/python-version
echo $STACK > .heroku/python-stack
FRESH_PYTHON=true
hash -r
fi
# If Pip isn't up to date:
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_VERSION* ]]; then
WORKING_DIR=$(pwd)
bpwatch start prepare_environment
bpwatch start install_setuptools
# Prepare it for the real world
# puts-step "Installing Setuptools ($SETUPTOOLS_VERSION)"
cd $ROOT_DIR/vendor/
tar zxf setuptools-$SETUPTOOLS_VERSION.tar.gz
cd $ROOT_DIR/vendor/setuptools-$SETUPTOOLS_VERSION/
python setup.py install &> /dev/null
cd $WORKING_DIR
bpwatch stop install_setuptoools
bpwatch start install_pip
# puts-step "Installing Pip ($PIP_VERSION)"
cd $ROOT_DIR/vendor/
tar zxf pip-$PIP_VERSION.tar.gz
cd $ROOT_DIR/vendor/pip-$PIP_VERSION/
python setup.py install &> /dev/null
cd $WORKING_DIR
bpwatch stop install_pip
bpwatch stop prepare_environment
fi
set -e
hash -r
Executable
+106
View File
@@ -0,0 +1,106 @@
#!/usr/bin/env bash
#
# Create a Heroku app with the following buildpack:
# https://github.com/ddollar/buildpack-test
#
# Push this Python buildpack to that Heroku app to
# run the tests.
#
testDetectWithReqs() {
detect "simple-requirements"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectWithEmptyReqs() {
detect "empty-requirements"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectDjango16() {
detect "django-1.6-skeleton"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectDjango15() {
detect "django-1.5-skeleton"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectDjango14() {
detect "django-1.4-skeleton"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectDjango13() {
detect "django-1.3-skeleton"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectNotDjangoWithSettings() {
detect "not-django"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectWithSetupPy() {
detect "distutils"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectWithSetupRequires() {
detect "no-requirements"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectNotPython() {
detect "not-python"
assertNotCaptured "Python"
assertEquals "1" "${RETURN}"
}
testDetectSimpleRuntimePypy2() {
detect "simple-runtime-pypy2"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectSimpleRuntimePython2() {
detect "simple-runtime-python2"
assertCapturedEquals "Python"
assertCapturedSuccess
}
testDetectSimpleRuntimePython3() {
detect "simple-runtime" # should probably be renamed simple-runtime-python3
assertCapturedEquals "Python"
assertCapturedSuccess
}
## utils ########################################
pushd $(dirname 0) >/dev/null
BASE=$(pwd)
popd >/dev/null
source ${BASE}/vendor/test-utils
detect() {
capture ${BASE}/bin/detect ${BASE}/test/$1
}
compile() {
capture ${BASE}/bin/compile ${BASE}/test/$1
}
source ${BASE}/vendor/shunit2
Executable
+93
View File
@@ -0,0 +1,93 @@
shopt -s extglob
if [ $(uname) == Darwin ]; then
sed() { command sed -l "$@"; }
else
sed() { command sed -u "$@"; }
fi
# Syntax sugar.
indent() {
sed "s/^/ /"
}
# Clean up pip output
cleanup() {
sed -e 's/\.\.\.\+/.../g' | sed -e '/already satisfied/Id' | sed -e '/Overwriting/Id' | sed -e '/python executable/Id' | sed -e '/no previously-included files/Id'
}
# Buildpack Steps.
puts-step() {
echo "-----> $@"
}
# Buildpack Warnings.
puts-warn() {
echo " ! $@"
}
# Usage: $ set-env key value
set-env() {
echo "export $1=$2" >> $PROFILE_PATH
}
# Usage: $ set-default-env key value
set-default-env() {
echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
}
# Usage: $ set-default-env key value
un-set-env() {
echo "unset $1" >> $PROFILE_PATH
}
# Does some serious copying.
deep-cp() {
declare source="$1" target="$2"
mkdir -p "$target"
# cp doesn't like being called without source params,
# so make sure they expand to something first.
# subshell to avoid surprising caller with shopts.
(
shopt -s nullglob dotglob
set -- "$source"/!(tmp|.|..)
[[ $# == 0 ]] || cp -a "$@" "$target"
)
}
# Does some serious moving.
deep-mv() {
deep-cp "$1" "$2"
deep-rm "$1"
}
# Does some serious deleting.
deep-rm() {
# subshell to avoid surprising caller with shopts.
(
shopt -s dotglob
rm -rf "$1"/!(tmp|.|..)
)
}
sub-env() {
WHITELIST=${2:-''}
BLACKLIST=${3:-'^(GIT_DIR|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$'}
(
if [ -d "$ENV_DIR" ]; then
for e in $(ls $ENV_DIR); do
echo "$e" | grep -E "$WHITELIST" | grep -qvE "$BLACKLIST" &&
export "$e=$(cat $ENV_DIR/$e)"
:
done
fi
$1
)
}
+31
View File
@@ -0,0 +1,31 @@
# Python Buildpack Binaries
To get started with it, create an app on Heroku inside a clone of this repository, and set your S3 config vars:
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-python#not-heroku
$ heroku config:set WORKSPACE_DIR=builds
$ heroku config:set AWS_ACCESS_KEY_ID=<your_aws_key>
$ heroku config:set AWS_SECRET_ACCESS_KEY=<your_aws_secret>
$ heroku config:set S3_BUCKET=<your_s3_bucket_name>
Then, shell into an instance and run a build by giving the name of the formula inside `builds`:
$ heroku run bash
Running `bash` attached to terminal... up, run.6880
~ $ bob build runtimes/python-2.7.6
Fetching dependencies... found 2:
- libraries/sqlite
Building formula runtimes/python-2.7.6:
=== Building Python 2.7.6
Fetching Python v2.7.6 source...
Compiling...
If this works, run `bob deploy` instead of `bob build` to have the result uploaded to S3 for you.
To speed things up drastically, it'll usually be a good idea to `heroku run bash --size PX` instead.
Enjoy :)
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
echo "Building autoconf..."
SOURCE_TARBALL='http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz'
curl -L $SOURCE_TARBALL | tar xz
cd autoconf-2.68
./configure --prefix=$OUT_PREFIX
make
make install
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/autoconf
OUT_PREFIX=$1
# Use new path, containing autoconf.
export PATH="/app/.heroku/python/bin/:$PATH"
hash -r
echo "Building libffi..."
SOURCE_TARBALL='https://github.com/atgreen/libffi/archive/master.tar.gz'
curl -L $SOURCE_TARBALL | tar xz
mv libffi-master libffi
cd libffi
./autogen.sh
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
# Cleanup
cd ..
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
echo "Building SQLite..."
SOURCE_TARBALL='http://www.sqlite.org/sqlite-autoconf-3070900.tar.gz'
curl $SOURCE_TARBALL | tar xz
# jx
mv sqlite-autoconf-3070900 sqlite
cd sqlite
./configure --prefix=$OUT_PREFIX
make
make install
# Cleanup
cd ..
rm -fr sqlite
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-1.7-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-1.7/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-1.8-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-1.8/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-1.9-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-1.9/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.0-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.0/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.0.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.0.1/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.0.2-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.0.2/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.1/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.2-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.2-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.2.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.2.1-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.3-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.3-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-2.3.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy-2.3.1-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
OUT_PREFIX=$1
echo "Building PyPy..."
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-2.3.1-linux64.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
cp -R pypy3-2.3.1-linux64/* $OUT_PREFIX
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.4 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.4.4/Python-2.4.4.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.4.4 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.4 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.4.5/Python-2.4.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.4.5 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.4 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.4.6/Python-2.4.6.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.4.6 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.5 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.5/Python-2.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.5 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.5 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.5.1/Python-2.5.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.5.1 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.5 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.5.2/Python-2.5.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.5.2 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.5 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.5.3/Python-2.5.3.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.5.3 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.5 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.5.4/Python-2.5.4.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.5.4 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.5.5/Python-2.5.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.5.5 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.5 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.5.6/Python-2.5.6.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.5.6 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar stack, not cedar-14.
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://www.python.org/ftp/python/2.6/Python-2.6.tar.bz2'
curl -L $SOURCE_TARBALL | tar jx
mv Python-2.6 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
# NOTICE: This formula only works for the cedar stack, not cedar-14.
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.1/Python-2.6.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.1 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.2/Python-2.6.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.2 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.3/Python-2.6.3.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.3 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.4/Python-2.6.4.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.4 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.5/Python-2.6.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.5 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.6/Python-2.6.6.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.6 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.7/Python-2.6.7.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.7 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.8/Python-2.6.8.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.8 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
# Protect 2.6 builds from parent Python (causes segfault during build).
unset LANG PYTHONHOME PYTHONPATH
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.6.9/Python-2.6.9.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.6.9 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7/Python-2.7.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.1/Python-2.7.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.1 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.2/Python-2.7.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.2 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.3/Python-2.7.3.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.3 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.4/Python-2.7.4.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.4 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.5/Python-2.7.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.5 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.6 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.7/Python-2.7.7.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.7 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.7/Python-2.7.7.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.7 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.8/Python-2.7.8.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.8 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/2.7.8/Python-2.7.8.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.8 src
cd src
./configure --prefix=$OUT_PREFIX
make
make install
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.1/Python-3.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.1 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.1.1/Python-3.1.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.1.1 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.1.2/Python-3.1.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.1.2 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.1.3/Python-3.1.3.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.1.3 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.1.4/Python-3.1.4.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.1.4 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.1.5/Python-3.1.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.1.5 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.2/Python-3.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.2 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.2.1/Python-3.2.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.2.1 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.2.2/Python-3.2.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.2.2 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.2.3/Python-3.2.3.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.2.3 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.2.4/Python-3.2.4.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.2.4 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.2.5/Python-3.2.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.2.5 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.3.0/Python-3.3.0.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.3.0 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.3.1/Python-3.3.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.3.1 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.3.2/Python-3.3.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.3.2 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.3.3/Python-3.3.3.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.3.3 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.3.4/Python-3.3.4.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.3.4 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.3.5/Python-3.3.5.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.3.5 src
cd src
./configure --prefix=$OUT_PREFIX --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.4.0/Python-3.4.0.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.4.0 src
cd src
./configure --prefix=$OUT_PREFIX --with-ensurepip=no --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
# Build Deps: libraries/sqlite
OUT_PREFIX=$1
echo "Building Python..."
SOURCE_TARBALL='http://python.org/ftp/python/3.4.1/Python-3.4.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.4.1 src
cd src
./configure --prefix=$OUT_PREFIX --with-ensurepip=no --enable-shared
make
make install
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
+1
View File
@@ -0,0 +1 @@
bob-builder==0.0.5
-33
View File
@@ -1,33 +0,0 @@
Author
------
Ian Bicking
Maintainers
-----------
Brian Rosner
Carl Meyer
Jannis Leidel
Contributors
------------
Alex Grönholm
Antonio Cuni
Armin Ronacher
Chris McDonough
Christian Stefanescu
Christopher Nilsson
Curt Micol
Douglas Creager
Gunnlaugur Thor Briem
Jeff Hammel
Jorge Vargas
Josh Bronson
Kumar McMillan
Lars Francke
Philip Jenvey
Ronny Pfannschmidt
Tarek Ziadé
Vinay Sajip
-16
View File
@@ -1,16 +0,0 @@
virtualenv
==========
See docs/index.txt for user documentation.
Contributor notes
-----------------
* virtualenv is designed to work on python 2 and 3 with a single code base.
Use Python 3 print-function syntax, and always use sys.exc_info()[1]
inside the `except` block to get at exception objects.
* virtualenv uses git-flow_ to `coordinate development`_.
.. _git-flow: https://github.com/nvie/gitflow
.. _coordinate development: http://nvie.com/posts/a-successful-git-branching-model/
-22
View File
@@ -1,22 +0,0 @@
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.
-9
View File
@@ -1,9 +0,0 @@
recursive-include docs *.txt
recursive-include scripts *
recursive-include virtualenv_support *.egg *.tar.gz
recursive-exclude virtualenv_support *.py
recursive-exclude docs/_templates *.*
include virtualenv_support/__init__.py
include *.py
include AUTHORS.txt
include LICENSE.txt
-906
View File
@@ -1,906 +0,0 @@
Metadata-Version: 1.0
Name: virtualenv
Version: 1.7
Summary: Virtual Python Environment builder
Home-page: http://www.virtualenv.org
Author: Jannis Leidel, Carl Meyer and Brian Rosner
Author-email: python-virtualenv@groups.google.com
License: MIT
Description:
Status and License
------------------
``virtualenv`` is a successor to `workingenv
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
of `virtual-python
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
It was written by Ian Bicking, sponsored by the `Open Planning
Project <http://openplans.org>`_ and is now maintained by a
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
It is licensed under an
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
You can install it with ``pip install virtualenv``, or the `latest
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
with ``pip install virtualenv==dev``.
You can also use ``easy_install``, or if you have no Python package manager
available at all, you can just grab the single file `virtualenv.py`_ and run
it with ``python virtualenv.py``.
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
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.7/site-packages`` (or whatever your
platform's standard location is), it's easy to end up in a situation
where you unintentionally upgrade an application that shouldn't be
upgraded.
Or more generally, what if you want to install an application *and
leave it be*? If an application works, any change in its libraries or
the versions of those libraries can break the application.
Also, what if you can't install packages into the global
``site-packages`` directory? For instance, on a shared host.
In all these cases, ``virtualenv`` can help you. It creates an
environment that has its own installation directories, that doesn't
share libraries with other virtualenv environments (and optionally
doesn't access the globally installed libraries either).
The basic usage is::
$ python virtualenv.py ENV
If you install it you can also just do ``virtualenv ENV``.
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
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
Distribute instead of setuptools, just call virtualenv like this::
$ python virtualenv.py --distribute ENV
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
installer, so you can use ``ENV/bin/pip`` to install additional packages into
the environment.
Environment variables and configuration files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
virtualenv can not only be configured by passing command line options such as
``--distribute`` but also by two other means:
- Environment variables
Each command line option is automatically used to look for environment
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
the name of the command line options are capitalized and have dashes
(``'-'``) replaced with underscores (``'_'``).
For example, to automatically install Distribute instead of setuptools
you can also set an environment variable::
$ export VIRTUALENV_USE_DISTRIBUTE=true
$ python virtualenv.py ENV
It's the same as passing the option to virtualenv directly::
$ python virtualenv.py --distribute ENV
This also works for appending command line options, like ``--find-links``.
Just leave an empty space between the passsed values, e.g.::
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
$ virtualenv ENV
is the same as calling::
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
- Config files
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
``%HOME%\\virtualenv\\virtualenv.ini``.
The names of the settings are derived from the long command line option,
e.g. the option ``--distribute`` would look like this::
[virtualenv]
distribute = true
Appending options like ``--extra-search-dir`` can be written on multiple
lines::
[virtualenv]
extra-search-dir =
/path/to/dists
/path/to/other/dists
Please have a look at the output of ``virtualenv --help`` for a full list
of supported options.
Windows Notes
~~~~~~~~~~~~~
Some paths within the virtualenv are slightly different on Windows: scripts and
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
To create a virtualenv under a path with spaces in it on Windows, you'll need
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
PyPy Support
~~~~~~~~~~~~
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ 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
-----------------------------------
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
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
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'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,
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\Scripts\activate.bat
And use ``deactivate.bat`` to undo the changes.
The ``--system-site-packages`` Option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you build with ``virtualenv --system-site-packages ENV``, your virtual
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
(or wherever your global site-packages directory is).
This can be used if you have control over the global site-packages directory,
and you want to depend on the packages there. If you want isolation from the
global system, do not use this flag.
Using Virtualenv without ``bin/python``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sometimes you can't or don't want to use the Python interpreter
created by the virtualenv. For instance, in a `mod_python
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
environment, there is only one interpreter.
Luckily, it's easy. You must use the custom Python interpreter to
*install* libraries. But to *use* libraries, you just have to be sure
the path is correct. A script is available to correct the path. You
can setup the environment like::
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
you to use an existing interpreter. Items in your environment will show up
first on ``sys.path``, before global items. However, global items will
always be accessible (as if the ``--system-site-packages`` flag had been used
in creating the environment, whether it was or not). Also, this cannot undo
the activation of other environments, or modules that have been imported.
You shouldn't try to, for instance, activate an environment before a web
request; you should activate *one* environment as early as possible, and not
do it again in that process.
Making Environments Relocatable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note: this option is somewhat experimental, and there are probably
caveats that have not yet been identified. 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).
If you use this flag to create an environment, currently, the
``--system-site-packages`` option will be implied.
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
<http://pypi.python.org>`_ (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.
* `virtual-python
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
is also a predecessor to this library. It uses only symlinks, so it
couldn't work on Windows. It also symlinks over the *entire*
standard library and global ``site-packages``. As a result, it
won't see new additions to the global ``site-packages``.
This script only symlinks a small portion of the standard library
into the environment, and so on Windows it is feasible to simply
copy these files over. Also, it creates a new/empty
``site-packages`` and also adds the global ``site-packages`` to the
path, so updates are tracked separately. This script also installs
Setuptools automatically, saving a step and avoiding the need for
network access.
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
create an isolated Python environment in the same style, but
achieves similar results through a declarative config file that sets
up scripts with very particular packages. As a declarative system,
it is somewhat easier to repeat and manage, but more difficult to
experiment with. ``zc.buildout`` includes the ability to setup
non-Python systems (e.g., a database server or an Apache instance).
I *strongly* recommend anyone doing application development or
deployment use one of these tools.
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
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
* `Blog announcement
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
* Doug Hellmann wrote a description of his `command-line work flow
using virtualenv (virtualenvwrapper)
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
including some handy scripts to make working with multiple
environments easier. He also wrote `an example of using virtualenv
to try IPython
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
* Chris Perkins created a `showmedo video including virtualenv
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
* `Using virtualenv with mod_wsgi
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
* `virtualenv commands
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
workflow-related tools around virtualenv.
Changes & News
--------------
1.7 (2011-11-30)
~~~~~~~~~~~~~~~~
* Updated embedded Distribute release to 0.6.24. Thanks Alex Grönholm.
* Made ``--no-site-packages`` behavior the default behavior. The
``--no-site-packages`` flag is still permitted, but displays a warning when
used. Thanks Chris McDonough.
* New flag: ``--system-site-packages``; this flag should be passed to get the
previous default global-site-package-including behavior back.
* Added ability to set command options as environment variables and options
in a ``virtualenv.ini`` file.
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
* Made ``virtualenv.py`` script executable.
1.6.4 (2011-07-21)
~~~~~~~~~~~~~~~~~~
* Restored ability to run on Python 2.4, too.
1.6.3 (2011-07-16)
~~~~~~~~~~~~~~~~~~
* Restored ability to run on Python < 2.7.
1.6.2 (2011-07-16)
~~~~~~~~~~~~~~~~~~
* Updated embedded distribute release to 0.6.19.
* Updated embedded pip release to 1.0.2.
* Fixed #141 - Be smarter about finding pkg_resources when using the
non-default Python 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 <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
with Windows and paths that contain spaces.
* If ``/path/to/env/.pydistutils.cfg`` exists (or
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
``~/.pydistutils.cfg`` and use that other file instead.
* Fix ` a problem
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
some ``.so`` libraries in ``/usr/local``.
1.3.2
~~~~~
* Remove the ``[install] prefix = ...`` setting from the virtualenv
``distutils.cfg`` -- this has been causing problems for a lot of
people, in rather obscure ways.
* If you use a `boot script <./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
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
(this means older versions of Python will support user directories,
whether intended or not).
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
on some platforms where a system-wide ``distutils.cfg`` was present
with a ``prefix`` setting, packages would be installed globally
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
workaround is added.
* Fix ``--python`` option.
* Fixed handling of Jython environments that use a
jython-complete.jar.
1.3
~~~
* Update to Setuptools 0.6c9
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
will make an existing environment "relocatable" -- the paths will
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
may assist in building environments that can be moved and copied.
You have to run this *after* any new packages installed.
* Added ``bin/activate_this.py``, a file you can use like
``execfile("path_to/activate_this.py",
dict(__file__="path_to/activate_this.py"))`` -- this will activate
the environment in place, similar to what `the mod_wsgi example
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
* For Mac framework builds of Python, the site-packages directory
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
Andrea Rech.
* Some platform-specific modules in Macs are added to the path now
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
from Andrea Rech.
* Fixed a small Bashism in the ``bin/activate`` shell script.
* Added ``__future__`` to the list of required modules, for Python
2.3. You'll still need to backport your own ``subprocess`` module.
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
precedent over virtualenv's libs.
1.2
~~~
* Added a ``--python`` option to select the Python interpreter.
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
* Add ``sets`` to the module copied over for Python 2.3 (though Python
2.3 still probably doesn't work).
1.1.1
~~~~~
* Added support for Jython 2.5.
1.1
~~~
* Added support for Python 2.6.
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
with an interpreter named, e.g., ``python2.4``
* Fix MacPorts Python
* Added --unzip-setuptools option
* Update to Setuptools 0.6c8
* If the current directory is not writable, run ez_setup.py in ``/tmp``
* Copy or symlink over the ``include`` directory so that packages will
more consistently compile.
1.0
~~~
* Fix build on systems that use ``/usr/lib64``, distinct from
``/usr/lib`` (specifically CentOS x64).
* Fixed bug in ``--clear``.
* Fixed typos in ``deactivate.bat``.
* Preserve ``$PYTHONPATH`` when calling subprocesses.
0.9.2
~~~~~
* Fix include dir copying on Windows (makes compiling possible).
* Include the main ``lib-tk`` in the path.
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
``get_python_lib`` to point to the global locations.
* Install ``distutils.cfg`` before Setuptools, so that system
customizations of ``distutils.cfg`` won't effect the installation.
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
``bin/python``).
* Fixed an issue with Mac Framework Python builds, and absolute paths
(from Ronald Oussoren).
0.9.1
~~~~~
* Improve ability to create a virtualenv from inside a virtualenv.
* Fix a little bug in ``bin/activate``.
* Actually get ``distutils.cfg`` to work reliably.
0.9
~~~
* Added ``lib-dynload`` and ``config`` to things that need to be
copied over in an environment.
* Copy over or symlink the ``include`` directory, so that you can
build packages that need the C headers.
* Include a ``distutils`` package, so you can locally update
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
* Better avoid downloading Setuptools, and hitting PyPI on environment
creation.
* Fix a problem creating a ``lib64/`` directory.
* Should work on MacOSX Framework builds (the default Python
installations on Mac). Thanks to Ronald Oussoren.
0.8.4
~~~~~
* Windows installs would sometimes give errors about ``sys.prefix`` that
were inaccurate.
* Slightly prettier output.
0.8.3
~~~~~
* Added support for Windows.
0.8.2
~~~~~
* Give a better warning if you are on an unsupported platform (Mac
Framework Pythons, and Windows).
* Give error about running while inside a workingenv.
* Give better error message about Python 2.3.
0.8.1
~~~~~
Fixed packaging of the library.
0.8
~~~
Initial release. Everything is changed and new!
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
-70
View File
@@ -1,70 +0,0 @@
#!/usr/bin/env python
"""
Helper script to rebuild virtualenv.py from virtualenv_support
"""
import re
import os
import sys
here = os.path.dirname(__file__)
script = os.path.join(here, '..', 'virtualenv.py')
file_regex = re.compile(
r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)',
re.S)
file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
def rebuild():
f = open(script, 'rb')
content = f.read()
f.close()
parts = []
last_pos = 0
match = None
for match in file_regex.finditer(content):
parts.append(content[last_pos:match.start()])
last_pos = match.end()
filename = match.group(1)
varname = match.group(2)
data = match.group(3)
print('Found reference to file %s' % filename)
f = open(os.path.join(here, '..', 'virtualenv_support', filename), 'rb')
c = f.read()
f.close()
new_data = c.encode('zlib').encode('base64')
if new_data == data:
print(' Reference up to date (%s bytes)' % len(c))
parts.append(match.group(0))
continue
print(' Content changed (%s bytes -> %s bytes)' % (
zipped_len(data), len(c)))
new_match = file_template % dict(
filename=filename,
varname=varname,
data=new_data)
parts.append(new_match)
parts.append(content[last_pos:])
new_content = ''.join(parts)
if new_content != content:
sys.stdout.write('Content updated; overwriting... ')
f = open(script, 'wb')
f.write(new_content)
f.close()
print('done.')
else:
print('No changes in content')
if match is None:
print('No variables were matched/found')
def zipped_len(data):
if not data:
return 'no data'
try:
return len(data.decode('base64').decode('zlib'))
except:
return 'unknown'
if __name__ == '__main__':
rebuild()
@@ -1,52 +0,0 @@
#!/usr/bin/env python
"""
Refresh any files in ../virtualenv_support/ that come from elsewhere
"""
import os
try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen
import sys
here = os.path.dirname(__file__)
support_files = os.path.join(here, '..', 'virtualenv_support')
files = [
('http://peak.telecommunity.com/dist/ez_setup.py', 'ez_setup.py'),
('http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg', 'setuptools-0.6c11-py2.6.egg'),
('http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c11-py2.5.egg', 'setuptools-0.6c11-py2.5.egg'),
('http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg', 'setuptools-0.6c11-py2.4.egg'),
('http://python-distribute.org/distribute_setup.py', 'distribute_setup.py'),
('http://pypi.python.org/packages/source/d/distribute/distribute-0.6.24.tar.gz', 'distribute-0.6.24.tar.gz'),
('http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz', 'pip-1.0.2.tar.gz'),
]
def main():
for url, filename in files:
sys.stdout.write('fetching %s ... ' % url)
sys.stdout.flush()
f = urlopen(url)
content = f.read()
f.close()
print('done.')
filename = os.path.join(support_files, filename)
if os.path.exists(filename):
f = open(filename, 'rb')
cur_content = f.read()
f.close()
else:
cur_content = ''
if cur_content == content:
print(' %s up-to-date' % filename)
else:
print(' overwriting %s' % filename)
f = open(filename, 'wb')
f.write(content)
f.close()
if __name__ == '__main__':
main()
-130
View File
@@ -1,130 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-compressor.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-compressor.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/django-compressor"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-compressor"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
make -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
@@ -1,229 +0,0 @@
/**
* Sphinx stylesheet -- default theme
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: Arial, sans-serif;
font-size: 100%;
background-color: #111;
color: #555;
margin: 0;
padding: 0;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 230px;
}
hr{
border: 1px solid #B1B4B6;
}
div.document {
background-color: #eee;
}
div.body {
background-color: #ffffff;
color: #3E4349;
padding: 0 30px 30px 30px;
font-size: 0.8em;
}
div.footer {
color: #555;
width: 100%;
padding: 13px 0;
text-align: center;
font-size: 75%;
}
div.footer a {
color: #444;
text-decoration: underline;
}
div.related {
background-color: #6BA81E;
line-height: 32px;
color: #fff;
text-shadow: 0px 1px 0 #444;
font-size: 0.80em;
}
div.related a {
color: #E2F3CC;
}
div.sphinxsidebar {
font-size: 0.75em;
line-height: 1.5em;
}
div.sphinxsidebarwrapper{
padding: 20px 0;
}
div.sphinxsidebar h3,
div.sphinxsidebar h4 {
font-family: Arial, sans-serif;
color: #222;
font-size: 1.2em;
font-weight: normal;
margin: 0;
padding: 5px 10px;
background-color: #ddd;
text-shadow: 1px 1px 0 white
}
div.sphinxsidebar h4{
font-size: 1.1em;
}
div.sphinxsidebar h3 a {
color: #444;
}
div.sphinxsidebar p {
color: #888;
padding: 5px 20px;
}
div.sphinxsidebar p.topless {
}
div.sphinxsidebar ul {
margin: 10px 20px;
padding: 0;
color: #000;
}
div.sphinxsidebar a {
color: #444;
}
div.sphinxsidebar input {
border: 1px solid #ccc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar input[type=text]{
margin-left: 20px;
}
/* -- body styles ----------------------------------------------------------- */
a {
color: #005B81;
text-decoration: none;
}
a:hover {
color: #E32E00;
text-decoration: underline;
}
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: Arial, sans-serif;
background-color: #BED4EB;
font-weight: normal;
color: #212224;
margin: 30px 0px 10px 0px;
padding: 5px 0 5px 10px;
text-shadow: 0px 1px 0 white
}
div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
div.body h2 { font-size: 150%; background-color: #C8D5E3; }
div.body h3 { font-size: 120%; background-color: #D8DEE3; }
div.body h4 { font-size: 110%; background-color: #D8DEE3; }
div.body h5 { font-size: 100%; background-color: #D8DEE3; }
div.body h6 { font-size: 100%; background-color: #D8DEE3; }
a.headerlink {
color: #c60f0f;
font-size: 0.8em;
padding: 0 4px 0 4px;
text-decoration: none;
}
a.headerlink:hover {
background-color: #c60f0f;
color: white;
}
div.body p, div.body dd, div.body li {
line-height: 1.5em;
}
div.admonition p.admonition-title + p {
display: inline;
}
div.highlight{
background-color: white;
}
div.note {
background-color: #eee;
border: 1px solid #ccc;
}
div.seealso {
background-color: #ffc;
border: 1px solid #ff6;
}
div.topic {
background-color: #eee;
}
div.warning {
background-color: #ffe4e4;
border: 1px solid #f66;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre {
padding: 10px;
background-color: White;
color: #222;
line-height: 1.2em;
border: 1px solid #C6C9CB;
font-size: 1.2em;
margin: 1.5em 0 1.5em 0;
-webkit-box-shadow: 1px 1px 1px #d8d8d8;
-moz-box-shadow: 1px 1px 1px #d8d8d8;
}
tt {
background-color: #ecf0f3;
color: #222;
padding: 1px 2px;
font-size: 1.2em;
font-family: monospace;
}
@@ -1,54 +0,0 @@
.c { color: #999988; font-style: italic } /* Comment */
.k { font-weight: bold } /* Keyword */
.o { font-weight: bold } /* Operator */
.cm { color: #999988; font-style: italic } /* Comment.Multiline */
.cp { color: #999999; font-weight: bold } /* Comment.preproc */
.c1 { color: #999988; font-style: italic } /* Comment.Single */
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.gr { color: #aa0000 } /* Generic.Error */
.gh { color: #999999 } /* Generic.Heading */
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.go { color: #111 } /* Generic.Output */
.gp { color: #555555 } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #aaaaaa } /* Generic.Subheading */
.gt { color: #aa0000 } /* Generic.Traceback */
.kc { font-weight: bold } /* Keyword.Constant */
.kd { font-weight: bold } /* Keyword.Declaration */
.kp { font-weight: bold } /* Keyword.Pseudo */
.kr { font-weight: bold } /* Keyword.Reserved */
.kt { color: #445588; font-weight: bold } /* Keyword.Type */
.m { color: #009999 } /* Literal.Number */
.s { color: #bb8844 } /* Literal.String */
.na { color: #008080 } /* Name.Attribute */
.nb { color: #999999 } /* Name.Builtin */
.nc { color: #445588; font-weight: bold } /* Name.Class */
.no { color: #ff99ff } /* Name.Constant */
.ni { color: #800080 } /* Name.Entity */
.ne { color: #990000; font-weight: bold } /* Name.Exception */
.nf { color: #990000; font-weight: bold } /* Name.Function */
.nn { color: #555555 } /* Name.Namespace */
.nt { color: #000080 } /* Name.Tag */
.nv { color: purple } /* Name.Variable */
.ow { font-weight: bold } /* Operator.Word */
.mf { color: #009999 } /* Literal.Number.Float */
.mh { color: #009999 } /* Literal.Number.Hex */
.mi { color: #009999 } /* Literal.Number.Integer */
.mo { color: #009999 } /* Literal.Number.Oct */
.sb { color: #bb8844 } /* Literal.String.Backtick */
.sc { color: #bb8844 } /* Literal.String.Char */
.sd { color: #bb8844 } /* Literal.String.Doc */
.s2 { color: #bb8844 } /* Literal.String.Double */
.se { color: #bb8844 } /* Literal.String.Escape */
.sh { color: #bb8844 } /* Literal.String.Heredoc */
.si { color: #bb8844 } /* Literal.String.Interpol */
.sx { color: #bb8844 } /* Literal.String.Other */
.sr { color: #808000 } /* Literal.String.Regex */
.s1 { color: #bb8844 } /* Literal.String.Single */
.ss { color: #bb8844 } /* Literal.String.Symbol */
.bp { color: #999999 } /* Name.Builtin.Pseudo */
.vc { color: #ff99ff } /* Name.Variable.Class */
.vg { color: #ff99ff } /* Name.Variable.Global */
.vi { color: #ff99ff } /* Name.Variable.Instance */
.il { color: #009999 } /* Literal.Number.Integer.Long */
-4
View File
@@ -1,4 +0,0 @@
[theme]
inherit = basic
stylesheet = nature.css
pygments_style = tango
-136
View File
@@ -1,136 +0,0 @@
# -*- coding: utf-8 -*-
#
# Paste documentation build configuration file, created by
# sphinx-quickstart on Tue Apr 22 22:08:49 2008.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# The contents of this file are pickled, so don't put values in the namespace
# that aren't pickleable (module imports are okay, they're removed automatically).
#
# All configuration values have a default value; values that are commented out
# serve to show the default value.
import sys
# If your extensions are in another directory, add it here.
#sys.path.append('some/directory')
# General configuration
# ---------------------
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc']
# Add any paths that contain templates here, relative to this directory.
## FIXME: disabled for now because I haven't figured out how to use this:
#templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.txt'
# The master toctree document.
master_doc = 'index'
# General substitutions.
project = 'virtualenv'
copyright = '2007-2011, Ian Bicking, The Open Planning Project, The virtualenv developers'
# The default replacements for |version| and |release|, also used in various
# other places throughout the built documents.
#
# The short X.Y version.
release = "1.7"
version = ".".join(release.split(".")[:2])
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%B %d, %Y'
# List of documents that shouldn't be included in the build.
unused_docs = []
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# Options for HTML output
# -----------------------
# The style sheet to use for HTML and HTML Help pages. A file of that name
# must exist either in Sphinx' static/ path, or in one of the custom paths
# given in html_static_path.
#html_style = 'default.css'
html_theme = 'nature'
html_theme_path = ['_theme']
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Content template for the index page.
#html_index = ''
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_use_modindex = True
# If true, the reST sources are included in the HTML build as _sources/<name>.
#html_copy_source = True
# Output file base name for HTML help builder.
htmlhelp_basename = 'Pastedoc'
# Options for LaTeX output
# ------------------------
# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'
# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, document class [howto/manual]).
#latex_documents = []
# Additional stuff for the LaTeX preamble.
#latex_preamble = ''
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_use_modindex = True
-487
View File
@@ -1,487 +0,0 @@
virtualenv
==========
* `Discussion list <http://groups.google.com/group/python-virtualenv/>`_
* `Bugs <https://github.com/pypa/virtualenv/issues/>`_
.. contents::
.. toctree::
:maxdepth: 1
news
.. comment: split here
Status and License
------------------
``virtualenv`` is a successor to `workingenv
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
of `virtual-python
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
It was written by Ian Bicking, sponsored by the `Open Planning
Project <http://openplans.org>`_ and is now maintained by a
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
It is licensed under an
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
You can install it with ``pip install virtualenv``, or the `latest
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
with ``pip install virtualenv==dev``.
You can also use ``easy_install``, or if you have no Python package manager
available at all, you can just grab the single file `virtualenv.py`_ and run
it with ``python virtualenv.py``.
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
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.7/site-packages`` (or whatever your
platform's standard location is), it's easy to end up in a situation
where you unintentionally upgrade an application that shouldn't be
upgraded.
Or more generally, what if you want to install an application *and
leave it be*? If an application works, any change in its libraries or
the versions of those libraries can break the application.
Also, what if you can't install packages into the global
``site-packages`` directory? For instance, on a shared host.
In all these cases, ``virtualenv`` can help you. It creates an
environment that has its own installation directories, that doesn't
share libraries with other virtualenv environments (and optionally
doesn't access the globally installed libraries either).
The basic usage is::
$ python virtualenv.py ENV
If you install it you can also just do ``virtualenv ENV``.
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
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
Distribute instead of setuptools, just call virtualenv like this::
$ python virtualenv.py --distribute ENV
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
installer, so you can use ``ENV/bin/pip`` to install additional packages into
the environment.
Environment variables and configuration files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
virtualenv can not only be configured by passing command line options such as
``--distribute`` but also by two other means:
- Environment variables
Each command line option is automatically used to look for environment
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
the name of the command line options are capitalized and have dashes
(``'-'``) replaced with underscores (``'_'``).
For example, to automatically install Distribute instead of setuptools
you can also set an environment variable::
$ export VIRTUALENV_USE_DISTRIBUTE=true
$ python virtualenv.py ENV
It's the same as passing the option to virtualenv directly::
$ python virtualenv.py --distribute ENV
This also works for appending command line options, like ``--find-links``.
Just leave an empty space between the passsed values, e.g.::
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
$ virtualenv ENV
is the same as calling::
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
- Config files
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
``%HOME%\\virtualenv\\virtualenv.ini``.
The names of the settings are derived from the long command line option,
e.g. the option ``--distribute`` would look like this::
[virtualenv]
distribute = true
Appending options like ``--extra-search-dir`` can be written on multiple
lines::
[virtualenv]
extra-search-dir =
/path/to/dists
/path/to/other/dists
Please have a look at the output of ``virtualenv --help`` for a full list
of supported options.
Windows Notes
~~~~~~~~~~~~~
Some paths within the virtualenv are slightly different on Windows: scripts and
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
To create a virtualenv under a path with spaces in it on Windows, you'll need
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
PyPy Support
~~~~~~~~~~~~
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ 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
-----------------------------------
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
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
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'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,
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\Scripts\activate.bat
And use ``deactivate.bat`` to undo the changes.
The ``--system-site-packages`` Option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you build with ``virtualenv --system-site-packages ENV``, your virtual
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
(or wherever your global site-packages directory is).
This can be used if you have control over the global site-packages directory,
and you want to depend on the packages there. If you want isolation from the
global system, do not use this flag.
Using Virtualenv without ``bin/python``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sometimes you can't or don't want to use the Python interpreter
created by the virtualenv. For instance, in a `mod_python
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
environment, there is only one interpreter.
Luckily, it's easy. You must use the custom Python interpreter to
*install* libraries. But to *use* libraries, you just have to be sure
the path is correct. A script is available to correct the path. You
can setup the environment like::
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
you to use an existing interpreter. Items in your environment will show up
first on ``sys.path``, before global items. However, global items will
always be accessible (as if the ``--system-site-packages`` flag had been used
in creating the environment, whether it was or not). Also, this cannot undo
the activation of other environments, or modules that have been imported.
You shouldn't try to, for instance, activate an environment before a web
request; you should activate *one* environment as early as possible, and not
do it again in that process.
Making Environments Relocatable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note: this option is somewhat experimental, and there are probably
caveats that have not yet been identified. 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).
If you use this flag to create an environment, currently, the
``--system-site-packages`` option will be implied.
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
<http://pypi.python.org>`_ (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.
* `virtual-python
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
is also a predecessor to this library. It uses only symlinks, so it
couldn't work on Windows. It also symlinks over the *entire*
standard library and global ``site-packages``. As a result, it
won't see new additions to the global ``site-packages``.
This script only symlinks a small portion of the standard library
into the environment, and so on Windows it is feasible to simply
copy these files over. Also, it creates a new/empty
``site-packages`` and also adds the global ``site-packages`` to the
path, so updates are tracked separately. This script also installs
Setuptools automatically, saving a step and avoiding the need for
network access.
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
create an isolated Python environment in the same style, but
achieves similar results through a declarative config file that sets
up scripts with very particular packages. As a declarative system,
it is somewhat easier to repeat and manage, but more difficult to
experiment with. ``zc.buildout`` includes the ability to setup
non-Python systems (e.g., a database server or an Apache instance).
I *strongly* recommend anyone doing application development or
deployment use one of these tools.
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
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
* `Blog announcement
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
* Doug Hellmann wrote a description of his `command-line work flow
using virtualenv (virtualenvwrapper)
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
including some handy scripts to make working with multiple
environments easier. He also wrote `an example of using virtualenv
to try IPython
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
* Chris Perkins created a `showmedo video including virtualenv
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
* `Using virtualenv with mod_wsgi
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
* `virtualenv commands
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
workflow-related tools around virtualenv.

Some files were not shown because too many files have changed in this diff Show More